Как создать контроллер для игрока в Unity?

Я разрабатываю 3D-игру и создаю контроллер с использованием Rigidbody. У меня возникла проблема: при вращении камеры весь объект игрока также поворачивается. Я пытаюсь реализовать движение относительно направления игрока с помощью transform.forward, так как вращение камеры влияет на его положение. Однако у меня пока не получается добиться нужного результата.
  • 11 февраля 2025 г. 16:54
Ответы на вопрос 2
Создание контроллера для игрока в Unity с использованием Rigidbody — это достаточно распространенная задача, и я могу помочь вам с необходимыми шагами. Чтобы реализовать движение игрока относительно его направления, а не направления камеры, можно последовательно выполнить следующие шаги.

### Шаг 1: Настройка Rigidbody

1. Создайте пустой объект `Player`, добавьте к нему компонент `Rigidbody`.
2. Убедитесь, что "Is Kinematic" отключен, чтобы физика могла работать с объектом.
3. Настройте параметры Rigidbody, такие как "Drag" и "Mass", чтобы они подходили для вашей игры.

### Шаг 2: Создайте скрипт для контроллера

Создайте новый скрипт, например `PlayerController`, и подключите его к объекту игрока.

```csharp
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float speed = 5f; // Скорость движения
    public float turnSpeed = 700f; // Скорость поворота
    private Rigidbody rb;

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

    void Update()
    {
        // Получение входных данных
        float moveHorizontal = Input.GetAxis("Horizontal"); // Движение влево-вправо
        float moveVertical = Input.GetAxis("Vertical"); // Движение вперед-назад

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical).normalized;

        // Если есть входные данные, то вращаем игрока
        if (movement.magnitude > 0)
        {
            Quaternion rotation = Quaternion.LookRotation(movement); // Угол поворота в направлении движения
            transform.rotation = Quaternion.RotateTowards(transform.rotation, rotation, turnSpeed * Time.deltaTime);
        }

        // Движение вперед по направлению к движению игрока
        Vector3 forwardMovement = transform.forward * moveVertical * speed * Time.deltaTime;
        Vector3 rightMovement = transform.right * moveHorizontal * speed * Time.deltaTime;

        // Применяем движение к Rigidbody
        rb.MovePosition(rb.position + forwardMovement + rightMovement);
    }
}
```

### Шаг 3: Настройка камеры

Чтобы камера следовала за игроком, создайте пустой объект `Camera` как дочерний объект `Player`. Вы можете настроить позицию и вращение камеры в инспекторе так, чтобы она всегда смотрела на игрока.

### Пояснения к коду

1. **Ввод данных:** Мы используем `Input.GetAxis()` для получения значений от WASD или стрелок.
2. **Вращение:** Если есть движение, вычисляем новый угол и поворачиваем игрока к этому углу.
3. **Движение:** Двигаем игрока вперед в направлении его `transform.forward`, что позволяет избежать влияния вращения камеры на движение.
4. **Rigidbody:** Используем функцию `MovePosition()`, чтобы обеспечить плавное движение, соответствующее физике Unity.

### Шаг 4: Тестирование

1. Запустите игру и проверьте, работает ли контроллер как задумано.
2. Настройте параметры скорости и поворота в инспекторе, чтобы добиться нужного вам поведения.

Таким образом, вы создадите базовый контроллер для игрока, который будет двигаться в своем направлении независимо от ориентации камеры.
камеру надо сделать дочерним объектом персонажа и когда мы по крутим по Y(право-лево) крутится персонаж, а если мы хотим посмотреть по X(вниз-вверх) то меняет локальное вращение камеры 
private void PlayerRotating()
    {
        transform.rotation = Quaternion.Euler(0,_yaw , 0);
        _camHolder.localRotation = Quaternion.Euler(_pitch, 0, 0); //_camHolder камера
    }
 private void InputRead()
    {
        _yaw += Input.GetAxis("Mouse X")*_speedRotate*Time.deltaTime;
        _pitch -= Input.GetAxis("Mouse Y")*_speedRotate * Time.deltaTime;
    }
Похожие вопросы