使用刚体变化方向时的奇怪行为

  • 本文关键字:方向 变化 unity-game-engine
  • 更新时间 :
  • 英文 :


我的角色是(暂时)一个立方体。该立方体用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);
  }
}

导致沿另一个方向移动(因此我更改了摄像头指向向量)&左或右箭头时不改变方向;只有跑步者对象旋转。

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


更新(2月4日): applied @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是布尔值,当跑步者对象触摸地面时,它将设置为true。但是,在离开地面之前,它沿z轴移动。当单元离开地面时,它会滑到X-Z轴。更新的问题的这一部分分别问:

注意:鉴于跑步者对象的质量为3。

来自文档, Transform.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);
}

最新更新