Итак, у меня есть два скрипта в проекте. Первый отвечает за движения носителя скрипта 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)?
Если нужно вот иерархия объектов:
Player - носитель скрипта Controller.cs
Main Camera - носитель скрипта Camera.cs
Orientation - игровой объект, который является значением публичной переменной orientation