【问题标题】:Strange behavior when changing direction using RigidBody.AddRelativeForce使用 RigidBody.AddRelativeForce 改变方向时的奇怪行为
【发布时间】:2014-01-30 02:54:24
【问题描述】:

我的角色(暂时)是一个立方体。立方体使用 C# 脚本和刚体组件进行映射。

我在Update() 中使用以下代码来改变我的角色(即刚体)的方向:

void Update () {
  rigidbody.AddRelativeForce(transform.right * speed, ForceMode.Acceleration);
  if (Input.GetKeyDown(KeyCode.LeftArrow)) {
    gameObject.transform.Rotate(0, -90, 0);
    rigidbody.velocity = transform.right* rigidbody.velocity.magnitude;
  }
  if (Input.GetKeyDown(KeyCode.RightArrow)) {
    gameObject.transform.Rotate(0, 90, 0);
    rigidbody.velocity = transform.right* rigidbody.velocity.magnitude;
  }
}

行为变为:http://youtu.be/NYPNgAulc-k

我希望角色向左/向右转 90 度并开始准确地朝新方向加速。但是现在,它转弯后,它在曲线上加速。有关详细信息,请参阅上面的视频。

我错过了什么?


更新(1 月 30 日):transform.right 更改为 transform.forward 并删除速度变化线:

void Update () {
  rigidbody.AddRelativeForce(transform.forward * speed, ForceMode.Acceleration);
  if (Input.GetKeyDown(KeyCode.LeftArrow)) {
    gameObject.transform.Rotate(0, -90, 0);
  }
  if (Input.GetKeyDown(KeyCode.RightArrow)) {
    gameObject.transform.Rotate(0, 90, 0);
  }
}

这导致向另一个方向移动(因此我改变了相机指向矢量)并且在向左或向右箭头时不改变方向;只有 Runner 对象旋转。

演示视频:http://youtu.be/UVG6l14oyjw


更新(2 月 4 日):在下面应用 @Roboto 的答案,并进行了一些修改:

void Update () {
     if (Input.GetKeyDown(KeyCode.LeftArrow)) {
       transform.Rotate(0, -90, 0);
       rigidbody.velocity = Vector3.zero;
       rigidbody.angularVelocity = Vector3.zero;
     }
     if (Input.GetKeyDown(KeyCode.RightArrow)) {
       transform.Rotate(0, 90, 0);
       rigidbody.velocity = Vector3.zero;
       rigidbody.angularVelocity = Vector3.zero;
     }
}

void FixedUpdate() {
    // Physics stuff should be done inside FixedUpdate :)
    rigidbody.AddForce(transform.forward * speed, ForceMode.Acceleration);
}

转身终于好了。我有一个额外的功能可以让角色跳跃。在Update(),我补充说:

if ((Input.GetButtonDown("Jump") || isTouched) && isOnGround) {
    isOnGround = false; 
    rigidbody.AddForce(jumpHeight, ForceMode.VelocityChange);
}

isOnGround 是一个布尔值,当 Runner 对象接触地面时设置为 true。但是,在它离开地面之前,它会沿 Z 轴移动。当装置离开地面时,它会滑向 X-Z 轴。这部分更新的问题单独提出:here

注意:假设 Runner 对象的质量为 3。

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    来自documentationTransform.forward

    The blue axis of the transform in world space.
    

    世界空间,所以我们想使用AddForce而不是AddRelativeForce,因为AddRelativeForce会使用局部坐标系来添加力。

    所以这行得通:

    void Update () {
         if (Input.GetKeyDown(KeyCode.LeftArrow)) {
           transform.Rotate(0, -90, 0);
         }
         if (Input.GetKeyDown(KeyCode.RightArrow)) {
           transform.Rotate(0, 90, 0);
         }
    }
    
    void FixedUpdate() {
        // Physics stuff should be done inside FixedUpdate :)
        rigidbody.AddForce(transform.forward * speed, ForceMode.Acceleration);
    }
    

    【讨论】:

    • 抱歉,我是 Unity 的新手。我应该如何修改代码以实现我的预期行为?
    • 更改为transform.forward后,框从开始向左移动,而不是向前移动。
    • 是的,您更新的答案使我找到了正确的方法。请参阅我的问题更新。谢谢。
    • 当然。也许我会在一个新问题中提出我的进一步问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多