我正在制作一个简单的2D平台游戏,我遇到了让我的角色滑落并在冰冷的地面上滑动的问题。
创建2D物理材质可以与Wall一起使用,但即使有0摩擦,玩家也不会在地面上滑动,因此我尝试通过代码并且没有物理材质来实现。
// Colliding with ICE
void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.tag == "ICE")
{
TouchingIce = true;
}
}
void OnCollisionStay2D(Collision2D col)
{
if (col.gameObject.tag == "ICE")
{
TouchingIce = true;
}
}
(我知道检测到冰冷的地面没有问题,因为我可以在检查员中看到TouchingIce Bool按预期变为真和假。)
然后在更新:
if (TouchingIce) {
iceMovement = true;
} else
{
iceMovement = false;
}
最后在fixedUpdate:
if (iceMovement)
{
// this is where I'm stuck
}
当玩家在fixedUpdate
中接地时,我的动作如何运作float move = Input.GetAxis("Horizontal"); // moving along horizontal Axis
anim.SetFloat ("Speed", Mathf.Abs (move));
if (grounded)
{
rb2d.velocity = new Vector2 (move * maxSpeed, rb2d.velocity.y);
}
如果您需要查看我的其余代码,请告知我,我会发布其余的代码。
答案 0 :(得分:0)
冰的技巧是因为它的摩擦力要低得多,它上面的物体比正常地面保持动力要好得多,所以你想让操纵杆移动与一个小的加速度相关联,而不是直接与速度相关。
我怀疑你可以保留一个变量oldVelocity来保持当前的速度。然后每次更新,而不是将你的速度改为等于你的(move * maxSpeed),只需添加(move * maxSpeed * someSmallFactor)到你的oldVelocity。调整someSmallFactor以适合您尝试模拟的动作。
(当然你也必须在此之后做一些其他的工作,限制你的最高速度,可能会增加摩擦力,以便在操纵杆居中时减慢玩家的速度,等等。)
答案 1 :(得分:0)
控制你的速度的行是:
rb2d.velocity = new Vector2 (move * maxSpeed, rb2d.velocity.y);
100%的水平速度由水平输入轴设定。 您需要一种不同的方式来处理这个问题。
当TouchingIce为true时,你必须保留上次更新的速度,这意味着,如果玩家全速前进,到达冰面并释放控制,它们将以与之前更新相同的速度继续。
然后对待"移动"值作为加速度而不是实际速度。
试试这个:(伪代码)
if(TouchingIce){
// Apply input as a force instead of setting velocity directly.
rb2d.AddForce(new Vector2 (move * maxSpeed, rb2d.velocity.y));
}else{
// Set Velocity Directly
rb2d.velocity = new Vector2 (move * maxSpeed, rb2d.velocity.y);
}
你可能会发现你需要添加一些逻辑,以便玩家在空中转向时跳过冰面。