Отредактируйте сценарий, чтобы персонаж двигался в том направлении, в котором он смотрит

Я использую актив от третьего лица Opsive. Это довольно сложный контроллер от третьего лица, который управляет анимацией, повреждением, движением, вводом и т. Д. http://opsive.com/assets/ThirdPersonController/documentation.php

Я хотел бы обновить скрипт ControllerHandler.cs, чтобы персонаж двигался в том направлении, куда он смотрит, независимо от ориентации камеры. (В стиле старых игр Resident Evil)

В исходном сценарии персонаж двигался вперед относительно того, в каком направлении была обращена камера.

Я получил несколько советов по изменению строки в этом скрипте, но с изменениями персонаж движется вперед в одном фиксированном направлении. (Например: когда я поворачиваюсь вправо с помощью клавиши D, а затем нажимаю W, чтобы двигаться вперед, персонаж поворачивается назад в том направлении, в котором он изначально смотрел, и движется в этом направлении.)

Вот оригинальная часть сценария:

#if ENABLE_MULTIPLAYER
            if ( isLocalPlayer) {
#endif
            if (m_Controller.Movement == RigidbodyCharacterController.MovementType.Combat || m_Controller.Movement == RigidbodyCharacterController.MovementType.Adventure) {
                m_LookRotation = m_CameraTransform.rotation;

Вот что мне сказали изменить на:

#if ENABLE_MULTIPLAYER
            if ( isLocalPlayer) {
#endif
            if (m_Controller.Movement == RigidbodyCharacterController.MovementType.Combat || m_Controller.Movement == RigidbodyCharacterController.MovementType.Adventure) {
                m_LookRotation = Quaternion.Euler(PlayerInput.GetAxisRaw(Constants.YawInputName), 0, 0);

К сожалению, это не дает желаемого результата.

Будем очень благодарны любой помощи. Спасибо!

Вот ссылка на сценарий контроллера: https://docs.google.com/document/d/1B4sstqtCqRMCLuHuxEuA9I7tO_3W4aHqEZwr73uFDjY/edit?usp=sharing


person Xeritan    schedule 04.03.2016    source источник


Ответы (2)


Я думаю ты хочешь

 transform.position += transform.rotation * Vector3.forward;

Полный блок кода будет выглядеть так ...

 void Update() {
      if (Input.GetKey(KeyCode.W)) {
           transform.position += transform.rotation * Vector3.forward * MOVESPEED;
      }
 }
person Harrison Walters    schedule 04.03.2016
comment
Прошу прощения, но я новичок в программировании, но все еще нахожусь на этапе обучения новичку. Куда мне вставить этот код? - person Xeritan; 04.03.2016
comment
см. обновленный ответ. установите MOVESPEED примерно на 0,1 - person Harrison Walters; 04.03.2016
comment
Я должен был упомянуть, что использую сторонний контроллер от Opsive из Unity Asset Store. Вот ссылка на сценарий контроллера: - person Xeritan; 04.03.2016

У меня это работает. Сначала посмотрите на картинку, это поможет вам правильно настроить плеер. Мой плеер всего два кубика. Я добавил второй куб, чтобы дать грань тому месту, куда указывает игрок. Я добавил эти 2 куба к родительскому объекту и перемещаю родительский объект своим PlayerMovement.cs. введите описание изображения здесь

public float rotSpeed;
public float playerSpeed;

    void Update()
    {
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.Rotate( Vector3.up,  Time.deltaTime * rotSpeed);
        } else if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.Rotate(-Vector3.up, Time.deltaTime * rotSpeed);
        }
        if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.Translate(Vector3.forward * Time.deltaTime * playerSpeed);
        } else if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.Translate(-Vector3.forward * Time.deltaTime * playerSpeed);

        }
    }
person Funlamb    schedule 04.03.2016
comment
Извините, я думаю, что недостаточно хорошо объяснил ситуацию в ОП. Я использую полный комплект контроллера от третьего лица от Opsive, приобретенный в Asset Store. Он довольно сложен и контролирует анимацию, взаимодействия, такие способности, как ходьба по уступу, лазание и плавание, урон, инвентарь, движение, вводы, в основном все. Я отредактировал исходное сообщение, включив в него скрипт ControllerHandler.cs через документы Google. Что мне нужно сделать, так это обновить включенный скрипт, чтобы получить желаемые результаты, ничего не нарушая. Тем не менее, спасибо за ответ. Любая помощь приветствуется. - person Xeritan; 04.03.2016