首页 > 解决方案 > 同一角色多次旋转

问题描述

我有一个沿运动方向旋转的角色

var rot = (x, y, z); //motion vector
 rot.y = 0f;
 var movementRot = Quaternion.LookRotation(rot);
 transform.rotation = Quaternion.Lerp(transform.rotation, movementRot, Time.deltaTime * speedRot);}

我想旋转它的 Y 轴旋转,即使是鼠标的 X 轴

 loat r = Input.GetAxisRaw("Mouse X");
    float Xrot = Input.GetAxisRaw("Mouse X") * speedRotation;
    transform.Rotate(0, Xrot, 0);

这些方法单独起作用,但它们不能一起起作用。我已经尝试将 transform.Rotate 转换为四元数以进行乘法:

var Xrotation = Quaternion.Euler(0f, Xrot, 0f);
transform.rotation = Xrotation * movementRot;

结果是一个不会自行旋转的角色(它在尝试时被扣留)。我尝试了倒数并将四元数转换为度数以添加到变换中。旋转。但这没有帮助:

float angle = Quaternion.Angle(transform.rotation, movementRot)//The result is perfect is on its own on transform.Rotate it works

transform.Rotate(0,f angle + Xrot, 0f); //Together, however, the character rotates at times and turns, on itself only to one side

有谁知道怎么做..?(或者如果有可能做xd)

标签: unity3drotationcharactertransform

解决方案


正如我所知道的,你想要有两个旋转层 - 首先,你的角色看起来在运动方向。然后,您可以从鼠标输入中添加旋转。这样对吗?

如果是这样,我可以推荐的第一件事就是将你的角色分成两个对象。父变换将跟随您的移动。然后,它是孩子,将根据鼠标输入改变它的局部旋转。

对于后续旋转,恕我直言,最好的方法是处理向量,而不是四元数:

transform.forward = movementVector;

如果您需要更流畅的跟随,您可以这样做:

float rotationSpeed = 0.5f;
        transform.forward = Vector3.RotateTowards(transform.forward, movementVector, rotationSpeed * Time.deltaTime, 0);

或者

float rotationSpeed = 1f;
transform.forward = Vector3.Lerp(transform.forward, movementVector, rotationSpeed * Time.deltaTime);

然后您可以像您所做的那样将旋转应用于子对象(仅更改 - 应用为局部旋转)。

如果这种装备不适合您,您需要结合两个旋转。为此,再次处理向量。应用移动跟随旋转后,如上所述,添加如下内容:

float Xrot = Input.GetAxisRaw("Mouse X") * speedRotation;
transform.forward += transform.right * Xrot * Time.deltaTime;

注意两点:

  • 在这种情况下speedRotation, 可能必须小很多。你甚至可以乘以 0.1f。
  • transform.right并且transform.forward可能因您的角色而异,也许您需要使用transform.up, 或-transform.forward. 请参阅您的本地变换轴。

推荐阅读