Unity Player 向前移动到世界而不是本地

Posted

技术标签:

【中文标题】Unity Player 向前移动到世界而不是本地【英文标题】:Unity Player Forward Movement to World not local 【发布时间】:2018-11-27 13:54:33 【问题描述】:

我目前有一个关于 Player Gameobject 的脚本。我进行了设置,以便当我使用 WASD 键“移动”玩家时,它会旋转玩家的腿来模拟行走(我不知道如何制作动画,所以这是我知道的唯一方法)。见以下代码:

public float WalkingTime;  //timer for walking animation
public GameObject PlayerLeftLeg;
public GameObject PlayerRightLeg;

下面的代码在“更新”功能下

if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
    
        //timer
        WalkingTime += Time.deltaTime;

        //right leg stepping forward
        if (WalkingTime > 0 && WalkingTime < .4)
        
            PlayerRightLeg.transform.rotation = Quaternion.AngleAxis(PlayerRightLeg.transform.rotation.x - (60  * WalkingTime), Vector3.forward);
            PlayerLeftLeg.transform.rotation = Quaternion.AngleAxis(PlayerLeftLeg.transform.rotation.x + (60 * WalkingTime), Vector3.forward);
        

        //left leg stepping forward
        if (WalkingTime > .4 && WalkingTime < 1.2)
        
            PlayerRightLeg.transform.rotation = Quaternion.AngleAxis(PlayerRightLeg.transform.rotation.x + (60 * (WalkingTime - .8f)), Vector3.forward);
            PlayerLeftLeg.transform.rotation = Quaternion.AngleAxis(PlayerLeftLeg.transform.rotation.x - (60 * (WalkingTime - .8f)), Vector3.forward);
        

        //right leg stepping forward
        if (WalkingTime > 1.2 && WalkingTime < 1.59)
        
            PlayerRightLeg.transform.rotation = Quaternion.AngleAxis(PlayerRightLeg.transform.rotation.x - (60 * (WalkingTime - 1.6f)), Vector3.forward);
            PlayerLeftLeg.transform.rotation = Quaternion.AngleAxis(PlayerLeftLeg.transform.rotation.x + (60 * (WalkingTime - 1.6f)), Vector3.forward);
        

        //resetting
        if (WalkingTime > 1.6)
        
            PlayerRightLeg.transform.rotation = Quaternion.AngleAxis(0, Vector3.forward);
            PlayerLeftLeg.transform.rotation = Quaternion.AngleAxis(0, Vector3.forward);
            WalkingTime = 0;
        
    
    else
    
        //if player not walking then reset
        PlayerRightLeg.transform.rotation = Quaternion.AngleAxis(0, Vector3.forward);
        PlayerLeftLeg.transform.rotation = Quaternion.AngleAxis(0, Vector3.forward);
        WalkingTime = 0;
    

现在代码工作正常,除了当我使用鼠标让我的播放器旋转或看向不同的方向时,“PlayerRightLeg”和“PlayerLeftLeg”的“Forward”也是如此。我的玩家仍然按照我想要的正确方向行走,但腿部运动旋转不正确。

我是否可以使用代码来替换“Vector3.Forward”,以便我的玩家的腿总是“向前”移动?

【问题讨论】:

Transform 有一个属性localRotation 【参考方案1】:

没关系,我想通了哈哈

我使用了下面的代码,这利用了世界空间方向

PlayerRightLeg.transform.rotation = Quaternion.AngleAxis(PlayerRightLeg.transform.rotation.x - (60  * WalkingTime), transform.TransformVector(1,0,0));

【讨论】:

以上是关于Unity Player 向前移动到世界而不是本地的主要内容,如果未能解决你的问题,请参考以下文章

SceneKit:如何将节点的移动限制在本地的一个轴上,而不是整个世界

unity制作血条怎么一点一点加血

关于Unity中物体分别在本地和世界坐标系对应方向的移动

Unity 3D C#Player移动跳跃错误

unity摄像头怎么随着游戏对象移动

Unity3D的加速度对象的精度以及对加速度两次积分得到手机在对应方向上的移动距离