【问题标题】:Character Movement won't work properly because of the rotation由于旋转,角色移动无法正常工作
【发布时间】:2017-09-15 22:18:44
【问题描述】:

所以基本上问题是当我想旋转角色并移动它时,移动不会像预期的那样正常工作。如果我的 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
 }

【问题讨论】:

  • 以及MovePosition,刚体有一个MoveRotation方法,你应该看看
  • @PierreBaret 之前已经这样做了。结果不变
  • 为什么不使用变换而不是刚体移动?
  • @PierreBaret 因为结果与我使用 transform 或 rigdidbody 的天气相同

标签: unity3d rotation unity5


【解决方案1】:

问题在于transform.forward 是一个向量,它指向你的变换(在本例中是你的角色)所面对的任何方向。

假设您的操纵杆给出 (0,1)。您的代码会将角色旋转到面朝北方,然后朝他们所面对的方向走。很好。

假设您的操纵杆给出 (0,-1)。您的代码会将角色旋转至面向南方,然后让他们朝与他们面对的相反方向行走。这将使您朝着与(0,1)相同的方向前进!

如果您希望 (0,1) 始终将字符向北移动,并且 (0,-1) 始终将字符向南移动,请将 transform.forward 和 transform.right 更改为 Vector3.forward 和 Vector3。正确就足够了:

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);
}

【讨论】:

  • 谢谢你!不幸的是,第二个选项不起作用,但第一个有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 2016-10-24
相关资源
最近更新 更多