Скрипт Contoller не меняет направление, когда персонаж смотрит вокруг - PullRequest
1 голос
/ 19 сентября 2019

Я использую скрипт контроллера с официального сайта Unity для перемещения моего персонажа.Я также использую скрипт для поворота камеры с помощью мыши.Все работает нормально, пока персонаж не оглядывается и не поворачивается в другом направлении.Затем элементы управления WASD перемещают их в соответствии с исходной ориентацией.Например, если я поверну на 180 градусов, W переместит меня назад, а S переместит меня вперед.

Я пытался выяснить это, используя transform.forward, но я не знаю, что я делаю.

Сценарий движения:

CharacterController characterController;

public float speed = 6.0f;
public float jumpSpeed = 8.0f;
public float gravity = 20.0f;

private Vector3 moveDirection = Vector3.zero;

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

void Update()
{
    if (characterController.isGrounded)
    {
        // We are grounded, so recalculate
        // move direction directly from axes

        moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical"));
        moveDirection *= speed;

        if (Input.GetButton("Jump"))
        {
            moveDirection.y = jumpSpeed;
        }
    }

    // Apply gravity. Gravity is multiplied by deltaTime twice (once here, and once below
    // when the moveDirection is multiplied by deltaTime). This is because gravity should be applied
    // as an acceleration (ms^-2)
    moveDirection.y -= gravity * Time.deltaTime;

    // Move the controller
    characterController.Move(moveDirection * Time.deltaTime);
}

Спасибо за любую помощь:)

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

I, потому что Move использует координаты мирового пространства, но вы генерируете локальное.

Попробуйте изменить

  moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical"));

на

  moveDirection = transform.right * Input.GetAxis("Horizontal") + transform.forward * Input.GetAxis("Vertical");
0 голосов
/ 19 сентября 2019

Вы можете использовать Transform.TransformDirection для преобразования из локального направления в мировое.Назовите это с местным направлением, которое вы хотите переместить, и оно вернет соответствующее направление мира, которое вы можете дать CharacterController.Move:

void Update()
{
    if (characterController.isGrounded)
    {
        // We are grounded, so recalculate
        // move direction directly from axes

        moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical"));
        moveDirection = transform.TransformDirection(moveDirection);
        moveDirection = moveDirection * speed;

        if (Input.GetButton("Jump"))
        {
            moveDirection.y = jumpSpeed;
        }
    }

    // Apply gravity. Gravity is multiplied by deltaTime twice (once here, and once below
    // when the moveDirection is multiplied by deltaTime). This is because gravity should be applied
    // as an acceleration (ms^-2)
    moveDirection.y -= gravity * Time.deltaTime;


    // Move the controller
    characterController.Move(worldMoveDirection * Time.deltaTime);
}

Фактически, старая документация для CharacterController.Move использовал именно этот метод!

void Update()
{
    if (controller.isGrounded)
    {
        // We are grounded, so recalculate
        // move direction directly from axes

        moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical"));
        moveDirection = transform.TransformDirection(moveDirection);
        moveDirection = moveDirection * speed;

        if (Input.GetButton("Jump"))
        {
            moveDirection.y = jumpSpeed;
        }
    }

    // Apply gravity
    moveDirection.y = moveDirection.y - (gravity * Time.deltaTime);

    // Move the controller
    controller.Move(moveDirection * Time.deltaTime);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...