C#

Unity C#. Помогите с управлением персонажа...

Раньше управление было основано на Transform'e, но мне захотелось реализовать его "нормально" (через физику)
     private float horizontal;  
private float vertical;

public float speed = 5;
private Rigidbody rb;
private void Start()
{
rb = GetComponent();
}
private void FixedUpdate()
{
horizontal = Input.GetAxis("Horizontal");
vertical = Input.GetAxis("Vertical");

Vector3 movement = new Vector3(horizontal, rb.velocity.y, vertical);

rb.AddForce(speed * movement);
}
Скрипт работает, но игрока перемещает по глобальным осям, а не по локальным. Т.е. если игрок повернётся на 90 градусов, то скрипт будет неправильно перемещать игрока (т.к. камера от 1го лица).
Как это исправить?
*.
**mirambek** .
3 323
Для того чтобы перемещать игрока относительно его локальных осей, вам необходимо использовать локальные координаты вектора движения, а не глобальные. Для этого можно использовать метод Transform.TransformDirection():

private void FixedUpdate()
{
horizontal = Input.GetAxis("Horizontal");
vertical = Input.GetAxis("Vertical");
}

 // Получаем локальный вектор движения, преобразованный в глобальные координаты 
Vector3 movement = transform.TransformDirection(new Vector3(horizontal, 0, vertical)) * speed;

// Применяем силу к Rigidbody, используя локальный вектор движения
rb.AddForce(movement, ForceMode.Impulse);
В этом коде мы сначала создаем локальный вектор движения, преобразовывая глобальные координаты с помощью метода TransformDirection(). Затем мы умножаем этот вектор на скорость, чтобы получить окончательный вектор движения. И наконец, мы применяем этот вектор движения к Rigidbody с помощью метода AddForce(), используя ForceMode.Impulse для реализации рывка.

Теперь игрок будет перемещаться относительно своих локальных осей, независимо от его ориентации в пространстве.
Р*
Роман *****
1 068
Лучший ответ
rb.AddForce() используется для разового воздействия на объект (толчка), а затем он будет по физике двигаться, падать, катиться. Если вы планируете управлять персонажем используйте CharacterController
https://docs.unity3d.com/Manual/class-CharacterController.html
 private float horizontal; 
private float vertical;

public float speed = 5;
private Rigidbody rb;
private void Start()
{
rb = GetComponent();
}
private void FixedUpdate()
{
horizontal = Input.GetAxis("Horizontal");
vertical = Input.GetAxis("Vertical");

Vector3 forward = transform.forward;
Vector3 right = transform.right;

Vector3 movement = (forward * vertical + right * horizontal).normalized;

rb.AddForce(speed * movement, ForceMode.VelocityChange);
}