【问题标题】:Using Mathf.Clamp in unity for boundries统一使用 Mathf.Clamp 作为边界
【发布时间】:2014-12-28 05:09:58
【问题描述】:

我正在制作一款 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 上进行测试,此代码效果很好。但是当导出到手机时,动作非常紧张和毛刺。船将到达边界并开始跳跃。倾斜时的运动也不是很顺畅。有没有其他方法可以让这更顺畅?

【问题讨论】:

    标签: c# unity3d boundary


    【解决方案1】:

    尝试将您的代码更改为 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 的值可能太小了。所以你需要花一些时间再次为它找到合适的价值。

    【讨论】:

    • 这修复了船在移动时的平滑问题,但一旦撞到边界,它仍然会跳跃。我确实将其更改为更新。
    • 没有看到跳跃,我的下一个猜测是transform.Translate 会立即影响位置,但rigidbody2D.position 被发送到物理引擎但在下一帧中看到更新的结果。尝试将rigidbody2D.position 更改为transform.position。我在原始答案中编辑了代码以对应此。
    • 这太棒了。效果很好。我不敢相信我没有尝试过。我想这就是你盯着代码看这么久的结果。谢谢。
    猜你喜欢
    • 2020-03-07
    • 2018-08-31
    • 2023-03-26
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 2021-06-28
    • 2022-08-02
    相关资源
    最近更新 更多