【发布时间】: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