Изменение направления движения игрока в соответствии с камерой

Я пытаюсь заставить камеру от первого лица, а движение камеры и игрока работать именно так, как мне нужно, однако теперь моя проблема заключается в том, что если я посмотрю вправо камерой и нажму W, чтобы двигаться вперед, она будет двигаться вперед в соответствии с игровой мир, а не направление, в котором смотрит камера.

Я пытался изменить родитель или использовать преобразование, чтобы связать плеер и камеру вместе.

// Simple Player movement
Rigidbody rb;
public float speed;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void FixedUpdate()
{
    float mH = Input.GetAxis("Horizontal");
    float mV = Input.GetAxis("Vertical");
    rb.velocity = new Vector3(mH * speed, rb.velocity.y, mV * speed);
}
// Camera controls (separate script)
private Transform playerBody;

void update()
{
    CameraRotation();
}

private void CameraRotation()
{
    float mouseX = Input.GetAxis(mouseXInputName) * mouseSensitivity * Time.deltaTime;
    float mouseY = Input.GetAxis(mouseYInputName) * mouseSensitivity * Time.deltaTime;
    xAxisClamp += mouseY;

    if (xAxisClamp > 90.0f)
    {
        xAxisClamp = 90.0f;
        mouseY = 0.0f;
        ClampAxisRotationToValue(270.0f);
    }
    else if (xAxisClamp < -90.0f)
    {
        xAxisClamp = -90.0f;
        mouseY = 0.0f;
        ClampAxisRotationToValue(90.0f);
    }
    transform.Rotate(Vector3.left * mouseY);
    playerBody.Rotate(Vector3.up * mouseX);
}

С последней строкой playerBody.rotate я ожидал, что она будет вращать объект, к которому прикреплена камера, поэтому, когда я нажимаю вперед, он будет двигаться вперед в направлении, в котором смотрит камера, но он все еще движется по своим статическим X и Z, игнорируя направление камеры.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
1 543
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы перемещаете своего персонажа, вы устанавливаете его скорость относительно осей мира и не принимаете во внимание вращение объекта.

Чтобы добавить вращение объекта во ввод, просто создайте ввод на основе поворота следующим образом:

void FixedUpdate()
{
    Vector3 mH = transform.right * Input.GetAxis("Horizontal");
    Vector3 mV = transform.forward * Input.GetAxis("Vertical");
    rb.velocity = (mH + mV) * speed;
}

mH и mV теперь должны быть относительно того, куда направлен ваш объект, потому что transform.forward.right) будет представлением того, что «вперед» для вашего объекта.

И поскольку GetAxis() будет представлять число между -1 и 1, мы в основном говорим, что Input.GetAxis определяет СКОЛЬКО, куда мы хотим перейти. 1 или -1? Вперед или назад? forward * 1 или forward * -1. То же самое с обстрелом; right * 1 или right * -1.

Хорошо, я понимаю, что мне нужно сделать движение относительно направления объектов, а не направления мира. Однако с предложенным вами редактированием он жалуется на невозможность преобразовать Vector3 в Float. Таким образом, если бы я сделал ссылку на игровой объект и применил скорость к этому объекту, возможно, это исправило бы это.

Jacine Yatrakos 31.05.2019 11:19

Прошу прощения - я написал это на скорую руку. Он плохо написан, я переделаю его с лучшим объяснением и рабочим кодом. Подожди минутку

Fredrik Schön 31.05.2019 16:28

Да, это исправлено. Большое спасибо

Jacine Yatrakos 31.05.2019 20:44

Здорово! Не забудьте принять ответ, если это правильный ответ на вопрос! знак равно

Fredrik Schön 01.06.2019 01:57

Другие вопросы по теме