Движение Unity 3D не работает с направлением камеры - PullRequest
1 голос
/ 13 июля 2020

У меня есть два сценария: один - MouseHandler, а другой - SimpleMovement. вращение камеры работает, а движение работает, однако, когда камера поворачивает, движение не go в этом направлении. Например, я поворачиваю камеру на 90 градусов вправо, но вперед не меняется. Вперед не go туда, куда смотрит камера. Извини, если я просто дурак. Любая помощь будет оценена

Сценарий 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 голосов
/ 13 июля 2020

Сначала получите ссылку на основную cmaera и кешируйте ее, потому что вы будете часто ссылаться на нее, а простое использование Camera.main немного дорого:

private Camera mainCam;

...

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

Затем используйте mainCam.transform.right и mainCam.transform.forward, но с y, установленным в 0 и нормализованным вместо Vector3.right и Vector3.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));
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...