使用数学.将单位夹紧以获得边界
本文关键字:边界 单位 | 更新日期: 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
的值可能太小了。所以你需要花一些时间来再次找到合适的价值。