如何创建光滑的地板效果

How to create a slippery floor effect

我正在制作一个简单的 2D 平台游戏,我在让我的角色在结冰的地面上打滑时遇到问题。

创建 2D 物理 Material 适用于墙壁,但即使摩擦力为 0,播放器在地面上似乎也不会滑动,因此我尝试通过代码在没有物理的情况下完成此操作 Material.

// 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; 
}

最后在固定更新中:

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

如果您需要查看我的其余代码,请告诉我,我会 post 其余的。

冰的诀窍是因为它的摩擦力低得多,它上面的物体比在正常地面上保持更好的动量,所以你希望操纵杆运动与小加速度相关,而不是直接与速度相关。

我怀疑您可以保留一个变量 oldVelocity 来保持当前速度。然后每次更新,而不是改变你的速度等于你的(move * maxSpeed),只需将(move * maxSpeed * someSmallFactor)添加到你的oldVelocity。调整 someSmallFactor 以适合您要模拟的运动。

(当然,在此之后您还必须做一些其他工作,限制您的最高速度,可能会增加摩擦力以在操纵杆居中时减慢播放器的速度等)

控制你速度的线是:

rb2d.velocity = new Vector2 (move * maxSpeed, rb2d.velocity.y);

水平速度的 100% 由水平输入轴设置。 你需要一种不同的方式来处理这个。

当 TouchingIce 为真时,您必须保持上次更新的速度,这意味着,如果玩家全速前进,到达冰面并释放控制,他们将以与上次更新相同的速度继续。

然后将"move"值视为加速度而不是实际速度。

试试这个:(伪代码)

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

您可能会发现您需要为玩家跳过冰面添加一些逻辑,因为您有空气转向功能。