【问题标题】:How to use .MoveRotation, .rotation, .MovePosition and .position properly on Rigidbody2D?如何在 Rigidbody2D 上正确使用 .MoveRotation、.rotation、.MovePosition 和 .position?
【发布时间】:2019-06-13 02:55:26
【问题描述】:

我正在尝试制作一款用于学习目的的“太空射击”类游戏。我无法使用 Rigidbody2D 移动宇宙飞船。

我已经尝试过运行 Update()、FixedUpdate() 中的命令并专门使用 Rigidbody2D 组件(完全不使用 Transform)。我还尝试将 Rigidbody2D 标记为 Dynamic 和 Kinematic,并更改了 Simulated 属性。没有任何效果。

这是我当前(不工作)的代码:

Rigidbody2D rb;

void Start()
{
   rb = GetComponent<Rigidbody2D>();
}

void FixedUpdate()
{
    if (Input.GetKey(KeyCode.Q))
        rb.MoveRotation(angularSpeed * Time.deltaTime);
    if (Input.GetKey(KeyCode.E))
        rb.MoveRotation(-angularSpeed * Time.deltaTime);

    rb.MovePosition(Vector2.up * speed * Time.deltaTime);
}

我希望这段代码在我按下“Q”键时让宇宙飞船左转,当我按下“E”键时右转并始终向前移动。实际结果是宇宙飞船没有移动,而是在按下“Q”或“E”键时仅抖动(它向右或向左旋转一步,然后不再响应输入)。该代码不会生成任何错误消息或任何警告,也不会引发任何异常。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    Rigidbody2D.MovePositionRigidbody2D.MoveRotation 都期望 absolute 您期望它们移动到的最终旋转/位置的参数。

    对于MovePosition,您做对了,但对于MoveRotation,您只传递了相对旋转更改,但忘记将其添加到当前旋转。


    应该是

    void FixedUpdate(
    {
        if (Input.GetKey(KeyCode.Q))
            rb.MoveRotation(rb.rotation + angularSpeed * Time.deltaTime);
        if (Input.GetKey(KeyCode.E))
            rb.MoveRotation(rb.rotation + -angularSpeed * Time.deltaTime);
    
        rb.MovePosition(transform.position + Vector3.up * speed * Time.deltaTime);
    }
    

    【讨论】:

    • 谢谢,我才意识到这一点。看来您必须非常仔细地阅读文档。
    • @YanB。并查看示例;)它们通常比文档本身更好地解释它
    猜你喜欢
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 2016-10-24
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    相关资源
    最近更新 更多