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