使用数学.将单位夹紧以获得边界

本文关键字:边界 单位 | 更新日期: 2023-09-27 18:28:35

我正在制作一款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)
    );
}

最小值和最大值在统一检查器中定义。如果你在电脑上测试,这个代码效果很好。但当导出到手机时,移动会非常抖动和出现故障。船将到达边界并开始跳跃。倾斜时的运动也不是很平稳。有没有其他方法可以让这件事更顺利?

使用数学.将单位夹紧以获得边界

尝试将代码更改为Update而不是FixedUpdate。我猜在固定更新之间会调用多个更新。因此,该船在多帧时首先越过边界,然后在下一次固定更新时返回。

使用Update时,您需要自己处理delta时间。否则,在不同的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的值可能太小了。所以你需要花一些时间来再次找到合适的价值。