2014-01-30 57 views
1

我的角色(時間上)是一個立方體。該多維數據集使用C#腳本和Rigid Body組件映射。使用RigidBody.AddRelativeForce改變方向時的奇怪行爲

我使用以下代碼中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度左/對,並開始加速到新的方向。但是現在,在它變成曲線之後,它會加速。有關更多信息,請參閱上述視頻。

我錯過了什麼?


UPDATE(1月30日):更改transform.righttransform.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


UPDATE(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是布爾值,當轉輪對象接觸地面時設置爲true。但是,在離開地面之前,它會沿着Z軸移動。當裝置離開地面時,它會滑動到X-Z軸。這部分更新的問題單獨提出:here

注:鑑於亞軍對象有3

回答

2

質量從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); 
} 
+0

對不起,我在Unity很新。我應該如何修改代碼以實現我預期的行爲? – Raptor

+0

更改爲'transform.forward'後,該框從開始向左移動而不是向前移動。 – Raptor

+0

查看更新的問題和屏幕截圖視頻 – Raptor