为什么我不能旋转Player变换?

时间:2019-12-13 20:50:50

标签: c# unity3d

播放器是父对象的子项,而播放器有自己的子项作为照相机。 当旋转Z轴为50,X和Y为0时,播放器开始播放。

Player

然后,我使用带有动画的Player Animator控制器将Z仅从50更改为0。 游戏开始时,播放器将从Z的50变为0。

玩家附有一些组件,我试图在游戏运行时一一删除,但没有任何更改/帮助。

玩家已附加了刚体和控制器脚本。

Player Camera已附加了“ Player Camera Controller”脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerCameraController : MonoBehaviour
{
    public float sensitivity = 5.0f;
    public float smoothing = 2.0f;

    private UnityEngine.GameObject player;
    private Vector2 mouseLook;
    private Vector2 smoothV;

    // Use this for initialization
    void Start()
    {
        player = this.transform.parent.gameObject;
    }

    // Update is called once per frame
    void Update()
    {
        if (PauseManager.gamePaused == false)
        {
            var md = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"));

            md = Vector2.Scale(md, new Vector2(sensitivity * smoothing, sensitivity * smoothing));
            smoothV.x = Mathf.Lerp(smoothV.x, md.x, 1f / smoothing);
            smoothV.y = Mathf.Lerp(smoothV.y, md.y, 1f / smoothing);
            mouseLook += smoothV;

            mouseLook.y = Mathf.Clamp(mouseLook.y, -90f, 90f);

            transform.localRotation = Quaternion.AngleAxis(-mouseLook.y, Vector3.right);
            player.transform.localRotation = Quaternion.AngleAxis(mouseLook.x, Vector3.up);
        }
    }
}

我可以使用鼠标将相机旋转360度。 而且仅在使用鼠标时才改变播放器在Y轴上的旋转。

但是后来我尝试在游戏运行时为X Y和Z上的Player旋转设置新值,但是没有任何改变。

由于某种原因,它改变了旋转角度,我看到播放器正在用Animator或鼠标旋转,但是当我更改播放器旋转值时,什么也没有发生。

我还尝试附加一个简单的脚本进行测试,但是按下L按钮时没有任何变化:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.L))
        {
            var player = GameObject.Find("Player");
            player.transform.Rotate(Vector3.left, 25);
        }
    }
}

我想不出如何旋转播放器以及为什么不能自己旋转播放器,但是我可以使用鼠标控制器脚本或动画制作器?

1 个答案:

答案 0 :(得分:2)

您的PlayerCameraController脚本正在基于字段mouseLook覆盖旋转。完全不考虑播放器或摄像机的当前旋转,因此它会覆盖所有更改。

修改摄像机的mouseLook并在播放器的localEulerAngles上使用Rotate,而不是使用transform字段。

public class PlayerCameraController : MonoBehaviour
{
    public float sensitivity = 5.0f;
    public float smoothing = 2.0f;

    private UnityEngine.GameObject player;
    private Vector2 smoothV;

    // Use this for initialization
    void Start()
    {
        player = this.transform.parent.gameObject;
    }

    // Update is called once per frame
    void Update()
    {
        if (PauseManager.gamePaused == false)
        {
            var md = new Vector2(Input.GetAxisRaw("Mouse X"), Input.GetAxisRaw("Mouse Y"));

            md = sensitivity * smoothing * md;
            smoothV.x = Mathf.Lerp(smoothV.x, md.x, 1f / smoothing);
            smoothV.y = Mathf.Lerp(smoothV.y, md.y, 1f / smoothing);

            Vector3 modifiedEulers = transform.localEulerAngles + Vector3.left * smoothV.y; 

            // transform euler angles from [0,360) to [-180,180) before clamp
            modifiedEulers.x = Mathf.Repeat(modifiedEulers.x + 180f, 360f) - 180f;
            modifiedEulers.x = Mathf.Clamp(modifiedEulers.x, -90f, 90f);

            transform.localEulerAngles = modifiedEulers;
            player.transform.Rotate(0f, smoothV.x, 0f);
        }
    }
}