Unity 3d运动不适用于相机方向

时间:2020-07-13 04:14:14

标签: c# unity3d

我有两个脚本,一个是MouseHandler,另一个是SimpleMovement。旋转相机会起作用,但移动时会起作用,但是当相机转动时,移动不会朝那个方向进行。例如,我将相机向右旋转90度,但前进方向保持不变。前进方向不会到达相机所面对的位置。对不起,如果我只是愚蠢。任何帮助将不胜感激

MouseHandler脚本:

public class MouseHandler : MonoBehaviour
{
    // horizontal rotation speed
    public float horizontalSpeed = 1f;
    // vertical rotation speed
    public float verticalSpeed = 1f;
    private float xRotation = 0.0f;
    private float yRotation = 0.0f;
    private Camera cam;

    void Start()
    {
        cam = Camera.main;
    }

    void Update()
    {
        float mouseX = Input.GetAxis("Mouse X") * horizontalSpeed;
        float mouseY = Input.GetAxis("Mouse Y") * verticalSpeed;

        yRotation += mouseX;
        xRotation -= mouseY;
        xRotation = Mathf.Clamp(xRotation, -90, 90);

        cam.transform.eulerAngles = new Vector3(xRotation, yRotation, 0.0f);
    }
}

SimpleMovement脚本:

public class SimpleMovement : MonoBehaviour
{
    CharacterController characterController;
    public float MovementSpeed = 1;
    public float Gravity = 9.8f;
    private float velocity = 0;

    private void Start()
    {
        characterController = GetComponent<CharacterController>();
    }

    void Update()
    {
        // player movement - forward, backward, left, right
        float horizontal = Input.GetAxis("Horizontal") * MovementSpeed;
        float vertical = Input.GetAxis("Vertical") * MovementSpeed;
        characterController.Move((Vector3.right * horizontal + Vector3.forward * vertical) * Time.deltaTime);

        // Gravity
        if (characterController.isGrounded)
        {
            velocity = 0;
        }
        else
        {
            velocity -= Gravity * Time.deltaTime;
            characterController.Move(new Vector3(0, velocity, 0));
        }
    }
}

1 个答案:

答案 0 :(得分:0)

首先,获取对主cmaera的引用并对其进行缓存,因为您将经常对其进行引用,而仅使用Camera.main则有点昂贵:

private Camera mainCam;

...

private void Start()
{
    characterController = GetComponent<CharacterController>();
    mainCam = Camera.main;
}

然后,使用mainCam.transform.rightmainCam.transform.forward,但将y设置为0并进行标准化,而不是Vector3.rightVector3.forward。这将使运动基于相机的旋转:

float horizontal = Input.GetAxis("Horizontal") * MovementSpeed;
float vertical = Input.GetAxis("Vertical") * MovementSpeed;
Vector3 camRightFlat = new Vector3(mainCam.transform.right.x, 0f, 
        mainCam.transform.right.z).normalized;
Vector3 camForwardFlat = new Vector3(mainCam.transform.forward.x, 0f,
        mainCam.transform.forward.z).normalized;
characterController.Move(
        (camRightFlat * horizontal + camForwardFlat  * vertical) * Time.deltaTime);

一起:

public class SimpleMovement : MonoBehaviour
{
    CharacterController characterController;
    public float MovementSpeed = 1;
    public float Gravity = 9.8f;
    private float velocity = 0;
    private Camera mainCam;

    private void Start()
    {
        characterController = GetComponent<CharacterController>();
        mainCam = Camera.main;
    }

    void Update()
    {
        // player movement - forward, backward, left, right
        float horizontal = Input.GetAxis("Horizontal") * MovementSpeed;
        float vertical = Input.GetAxis("Vertical") * MovementSpeed;
        Vector3 camRightFlat = new Vector3(mainCam.transform.right.x, 0f, 
                mainCam.transform.right.z).normalized;
        Vector3 camForwardFlat = new Vector3(mainCam.transform.forward.x, 0f, 
                mainCam.transform.forward.z).normalized;
        characterController.Move((camRightFlat * horizontal + camForwardFlat  * vertical) 
                * Time.deltaTime);

        // Gravity
        if (characterController.isGrounded)
        {
            velocity = 0;
        }
        else
        {
            velocity -= Gravity * Time.deltaTime;
            characterController.Move(new Vector3(0, velocity, 0));
        }
    }
}
相关问题