代码之家  ›  专栏  ›  技术社区  ›  HumanlyRespectable

统一玩家向前移动到世界而不是本地

  •  0
  • HumanlyRespectable  · 技术社区  · 7 年前

    我目前在玩家游戏对象上有一个脚本。我将其设置为,当我使用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”,这样我的玩家的腿就可以一直向前移动?

    1 回复  |  直到 7 年前
        1
  •  0
  •   HumanlyRespectable    7 年前

    没关系,我知道了,哈哈

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

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