Как правильно настроить управление игровым персонажем с помощью джойстика при использовании CharacterController?

Как можно переделать скрипт игрока для использования CharacterController вместо Collider и Rigidbody, чтобы избежать застревания в объектах, и как учесть управление персонажем по взгляду камеры игрока? На игроке висит скрипт PlayerMovement, на камере - PlayerLock.
  • 30 декабря 2023 г. 15:37
Ответы на вопрос 1
Для настройки управления игровым персонажем с использованием джойстика и CharacterController вы можете изменить скрипт PlayerMovement следующим образом:

1. Удалите компоненты Rigidbody и Collider с игрока, поскольку они больше не понадобятся.

2. Добавьте компонент CharacterController к игроку. Этот компонент будет отвечать за обработку коллизий и перемещение игрока.

3. В скрипте PlayerMovement замените все обращения к Rigidbody на обращения к CharacterController. Например, замените rigidbody.velocity на characterController.Move. 

Примерно так может выглядеть скрипт PlayerMovement:

```csharp
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float speed = 5f;
    private CharacterController characterController;

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

    private void Update()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        Vector3 direction = new Vector3(horizontal, 0f, vertical);
        direction.Normalize();

        if (direction.magnitude >= 0.1f)
        {
            float targetAngle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg + Camera.main.transform.eulerAngles.y;
            Vector3 moveDirection = Quaternion.Euler(0f, targetAngle, 0f) * Vector3.forward;
            characterController.Move(moveDirection.normalized * speed * Time.deltaTime);
        }
    }
}
```

4. При управлении игроком относительно взгляда камеры вы можете вращать персонажа только по горизонтальной плоскости. Для этого добавьте код вращения персонажа в скрипт PlayerLock, который должен быть прикреплен к камере. Примерно так:

```csharp
using UnityEngine;

public class PlayerLock : MonoBehaviour
{
    private void Update()
    {
        float mouseX = Input.GetAxis("Mouse X");
        transform.rotation *= Quaternion.Euler(0f, mouseX, 0f);
    }
}
```

Таким образом, персонаж будет двигаться в текущем направлении взгляда камеры при использовании джойстика, причем из-за использования CharacterController он не застревает в объектах, так как этот компонент автоматически обрабатывает коллизии и физику перемещения.
Похожие вопросы