Задать вопрос
@Moskaa

Vector3.forward: как он работает?

Итак, у меня есть два скрипта в проекте. Первый отвечает за движения носителя скрипта Controller.cs, а другой отвечает за поворот камеры по оси Y и X и поворот носителя скрипта Controller.cs только по оси Y. Скрипты приведены ниже.
Controller.cs
using UnityEngine;

public class Controller : MonoBehaviour
{
    [SerializeField] private Transform orientation;

    private CharacterController controller;

    private float verticalVelocity;
    private float gravity = 9.81f;
    private float speed = 2f;
    private float axisX;
    private float axisZ;

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

    private void Update()
    {
        Movement();
    }

    private void Movement()
    {
        axisX = Input.GetAxis("Horizontal");
        axisZ = Input.GetAxis("Vertical");

        Vector3 move3 = orientation.forward * axisZ + orientation.right * axisX;

        move3.y = Gravity();

        controller.Move(speed * move3.normalized * Time.deltaTime);
    }

    private float Gravity()
    {
        if (controller.isGrounded)
        {
            verticalVelocity = -1f;
        }
        else
        {
            verticalVelocity -= gravity * Time.deltaTime;
        }

        return verticalVelocity;
    }
}


Camera.cs
using UnityEngine;

public class Camera : MonoBehaviour
{ 
    private float rotationY;
    private float rotationX;
    private float getXMouse;
    private float getYMouse;
    private float sensX = 400f;
    private float sensY = 400f;

    [SerializeField] Transform orientation;

    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
    }

    private void Update()
    {
        getXMouse = Input.GetAxis("Mouse X") * sensX * Time.deltaTime;
        getYMouse = Input.GetAxis("Mouse Y") * sensY * Time.deltaTime;

        rotationX -= getYMouse;
        rotationY += getXMouse;

        rotationX = Mathf.Clamp(rotationX, -90f, 90f);

        transform.rotation = Quaternion.Euler(rotationX, rotationY, 0);
        orientation.rotation = Quaternion.Euler(0, rotationY, 0);
    }
}


И в чём вопрос: в скрипте Controller.cs есть строка
Vector3 move3 = orientation.forward * axisZ + orientation.right * axisX;

и в ней используется такой компонент как orientation.forward. В документации Unity написано, что это
Сокращенная версия new Vector3(0, 0, 1).

Зная это, я решил заменить orientation.forward на new Vector3(0, 0, 1). В итоге носитель скрипта Controller.cs не смог корректно передвигаться по оси Z: игровой объект мог двигаться только по прямой(при этом скрипт Camera.cs работал абсолютно корректно).
Отсюда я подумал, что может быть orientation.forward принимает в себе локальные координаты, а не глобальные в отличии от new Vector3(0, 0, 1). Ведь если бы координаты new Vector3(0,0,1) были локальными, то носитель двигался правильно.

Вроде как код понимаю: камера, поворачиваю, меняет направление локальных осей игрового объекта orientation, отсюда и меняется движения носителя скрипта Controller.cs.

Так вот наконец вопрос: Vector3.forward хранит в себе значения локальных координат? и если это так, то почему в официальной документации Unity написано, что это сокращенная запись new Vector3(0, 0, 1)?

Если нужно вот иерархия объектов:
67cc2a8e6a34f016911307.jpeg

Player - носитель скрипта Controller.cs
Main Camera - носитель скрипта Camera.cs
Orientation - игровой объект, который является значением публичной переменной orientation
  • Вопрос задан
  • 129 просмотров
Подписаться 1 Простой 4 комментария
Решения вопроса 1
K0TlK
@K0TlK
Правильно все в документации написано. Vector3.forward это просто Vector3(0, 0, 1). Transform.forward - это направление оси Z объекта в мировых координатах. transform.forward - это просто transform.rotation умноженный на Vector3.forward.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
MrKarton
@MrKarton
Погромист
Vector3.forward (up, bottom, left, right, back) - это константы направления вектора по осям
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы