由于旋转,角色移动将无法正常工作

Character Movement won't work properly because of the rotation

所以基本上问题是,当我想旋转角色并移动它时,运动不会按预期正常工作。如果我的 y 坐标低于零,角色将向后移动而不是向前移动。所以基本上是相反的方向。另外,如果我的操纵杆坐标类似于 example: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
 }

问题是 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);
}