Unity3d 同一字符上的多个旋转

Unity3d 同一字符上的多个旋转,unity3d,rotation,character,transform,Unity3d,Rotation,Character,Transform,我有一个角色在移动的方向上旋转 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 = Inpu

我有一个角色在移动的方向上旋转

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);
这些方法单独起作用,但结合起来却不起作用。 我已经尝试将“变换.旋转”转换为四元数进行乘法:

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)

正如我得到的,您希望有两个旋转层-首先,您的角色朝运动方向看。然后,可以通过鼠标输入添加旋转。是这样吗

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

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

transform.forward = movementVector;
如果您需要更平滑的以下操作,您可以这样做:

float rotationSpeed = 0.5f;
        transform.forward = Vector3.RotateTowards(transform.forward, movementVector, rotationSpeed * Time.deltaTime, 0);
float Xrot = Input.GetAxisRaw("Mouse X") * speedRotation;
transform.forward += transform.right * Xrot * Time.deltaTime;

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

如果这种类型的装备不适合您,则需要组合两个旋转。对于这一点,再次处理向量。应用移动跟随旋转后,如上所述,添加如下内容:

float rotationSpeed = 0.5f;
        transform.forward = Vector3.RotateTowards(transform.forward, movementVector, rotationSpeed * Time.deltaTime, 0);
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
    。请参见局部变换轴

  • 让我解释一下。我试图在不依赖摄影机的情况下创建第三人称动作(摄影机必须跟随角色)。因此,除了在其行走方向上的正常旋转外,我还必须使用鼠标插入旋转(以在我想要的方向上旋转角色,否则它只能向前、向后、向右和向左移动而不旋转)。很抱歉出现这样的延迟。那么,为什么不能使用“钻机”方法呢?创建跟随角色移动的摄影机。然后,将相机从游戏对象中移除——让它只是一个假人。把你的相机当成这个假人的孩子。然后,将鼠标驱动的旋转应用于此子摄影机,而不是作为
    变换.rotation
    ,而是作为
    变换.localRotation
    。如果我理解正确,很遗憾,您的解决方案对我不起作用,因为当我的角色水平行走时,摄影机不能在其后面,而是要框定角色侧向行走。当我垂直行走和旋转时,相机应该只旋转并站在后面。或者,充其量,我想要一个横向行走被框起来的解决方案。但我不确定使用哪种方法。在任何情况下,在旋转我的角色的时候,我用一个立方体的移动来引导这个角色的移动。使用鼠标,立方体旋转,因此水平轴和垂直轴在世界各地移动。我的角色朝着移动的方向旋转,当他行走时,如果我使用鼠标,它会旋转,因为它朝着旋转的立方体的轴移动。相机设置为立方体旋转,但旋转速度比角色慢,因此效果就像角色跟随它。一个复杂的解决方案,你觉得有用吗。。?如果你的更简单,我想用它。