2017-09-15 75 views
2

所以基本上問題是,當我想旋轉角色並移動角色時,移動不會像預期的那樣正常工作。如果我的y座標低於零,則角色向後移動而不是向前移動。所以基本上是在相反的方向。此外,如果我的操縱桿的座標是例如:y = 0,23和x = 0,8,我的角色顯示在該方向,但向右下移動。 PS:y和x值是從0到1(單位圓) 但是,如果我只移動角色而不旋轉他,角色的移動就像它應該的那樣。由於旋轉,角色移動將無法正常工作

這裏是我當前的代碼:

void Update() 
{ 

    if (myX != leftController.GetTouchPosition.x || myY != leftController.GetTouchPosition.y) { //checks if player changed position. 
     myX = leftController.GetTouchPosition.x; 
     myY = leftController.GetTouchPosition.y; 

     double rad = Mathf.Atan2(leftController.GetTouchPosition.y, leftController.GetTouchPosition.x); // In radians 
     double deg = rad * (180/System.Math.PI); // values from up right to up left : +0 to +180 and from down left to down right: -180 to -0 

     double myRotAngle = 0; 
     //calculating the specific angle in which the character should move 
     if (deg < 0) { 
      myRotAngle = 90 + ((deg * -1)); 
     } else if (deg >= 0 && deg <= 90) 
      myRotAngle = 90 - deg; 
     else if (deg >= 90 && deg <= 180) 
      myRotAngle = 270 + (180 - deg); 

     transform.localEulerAngles = new Vector3 (0f,(float)myRotAngle, 0f);//rotate 

    } 

    _rigidbody.MovePosition(transform.position + (transform.forward * leftController.GetTouchPosition.y * Time.deltaTime * speedMovements) + 
     (transform.right * leftController.GetTouchPosition.x * Time.deltaTime * speedMovements));//move 
} 
+0

以及MovePosition的剛體有MoveRotation方法,你應該看看那個 –

+0

@PierreBaret以前已經做過。結果不會改變 – KeyNavas

+0

爲什麼不移動使用變換而不是Rigidbody? –

回答

1

的問題是,transform.forward的是,在你的變換哪個方向(在這種情況下,你的角色)所指出正面臨着一個載體。

假設你的操縱桿給出了(0,1)。您的代碼會將角色旋轉到朝北,然後走向他們面對的方向。好。

假設您的操縱桿給出(0,-1)。你的代碼將旋轉角色面朝南方,然後讓他們走向他們面對的相反方向。這會讓你沿着(0,1)的方向走!

如果你想要的是(0,1)總是移動字符北,和(0,-1)總是南下的性格,改變transform.forward和transform.right到Vector3.forward和Vector3.right應該就足夠了:

Vector3 forwardMovement = (Vector3.forward * leftController.GetTouchPosition.y * Time.deltaTime * speedMovements); 
Vector3 sidewaysMovement = (Vector3.right * leftController.GetTouchPosition.x * Time.deltaTime * speedMovements); 

_rigidbody.MovePosition (transform.position + forwardMovement + sidewaysMovement); 

我還將MovePosition行分成多個步驟,因此它更易於閱讀。

爲您的遊戲杆另一種選擇是具有垂直軸移動的字符向前和向後,併爲水平軸使其旋轉:

void Update() 
{ 
    float newRotation = transform.localEulerAngles.y + leftController.GetTouchPosition.x; 
    transform.localEulerAngles = new Vector3 (0f,newRotation, 0f); 

    Vector3 forwardMovement = (transform.forward * leftController.GetTouchPosition.y * Time.deltaTime * speedMovements); 
    _rigidbody.MovePosition (transform.position + forwardMovement); 
} 
+0

謝謝!不幸的是,第二個選項不起作用,但第一個工作。 – KeyNavas