使用Mathf.Clamp统一边界

时间:2014-10-31 19:34:38

标签: c# unity3d boundary

我正在制作2D太空射击手机游戏。我试图设置一个边界,以便船不会离开屏幕。您可以通过倾斜手机来移动船只。我有一个shipController.cs附加到我的船对象。这是我的FixedUpdate函数:

public float xMin, xMax, yMin, yMax;
void FixedUpdate()
{
    //tilt to move ship
    transform.Translate(Input.acceleration.x * speed, Input.acceleration.y * speed, 0);

    //create boundries
    rigidbody2D.position = new Vector2(
        Mathf.Clamp(rigidbody2D.position.x, xMin, xMax), 
        Mathf.Clamp(rigidbody2D.position.y, yMin, yMax)
    );
}

最小值和最大值在单位检查器中定义。 如果您在PC上进行测试,此代码非常有用。但是当输出到手机时,机芯非常抖动和毛刺。这艘船将到达边界并开始跳跃。倾斜时的动作也不是很平滑。有没有其他方法可以使这更顺畅?

1 个答案:

答案 0 :(得分:2)

尝试将代码更改为Update而不是FixedUpdate。我猜测固定更新之间有多个更新。出于这个原因,该船在多个框架上首先越过边界,然后在下一个固定更新时返回。

使用Update时,您需要自己处理增量时间。否则,不同fps的速度会有所不同。这可以通过简单地将速度乘以DeltaTime

来完成
public float xMin, xMax, yMin, yMax;
void Update()
{
    //tilt to move ship
    transform.Translate(Input.acceleration.x * speed * Time.DeltaTime, Input.acceleration.y * speed * Time.DeltaTime, 0);

    //create boundries
    transform.position = new Vector2(
        Mathf.Clamp(transform.position.x, xMin, xMax), 
        Mathf.Clamp(transform.position.y, yMin, yMax)
    );
}

DeltaTime相乘后,speed的值可能太小了。所以你需要花一些时间再次为它找到合适的价值。