如何创造一个湿滑的地板效果

时间:2015-04-21 17:05:53

标签: c# unity3d

我正在制作一个简单的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);
}

如果您需要查看我的其余代码,请告知我,我会发布其余的代码。

2 个答案:

答案 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);
}

你可能会发现你需要添加一些逻辑,以便玩家在空中转向时跳过冰面。