К списку статей

Скрипты

Структура: Player (FPPlayerMovement + Rigidbody) → Camera внутри (FPCameraController)

FPS Demo

Inspector - Movement:

FPS Movement

Inspector - Camera:

FPS Camera

Sensivity: 100, Player: перетащить родителя, Vertical Upper: -60, Vertical Lover: 60

FPPlayerMovement.cs

using UnityEngine;

public class FPPlayerMovement : MonoBehaviour
{
    // Скорость движения персонажа
    [SerializeField] private float _moveSpeed = 5f;
    
    private Rigidbody _rb;

    void Start()
    {
        // Получаем Rigidbody для физического движения
        _rb = GetComponent();
    }

    void FixedUpdate()
    {
        // Получаем ввод с клавиатуры (WASD / стрелки)
        var horizontal = Input.GetAxis("Horizontal"); // A/D
        var vertical = Input.GetAxis("Vertical");     // W/S
        
        // Направление движения относительно поворота игрока
        var direction = transform.right * horizontal + transform.forward * vertical;
        
        // Применяем скорость, сохраняя Y для гравитации
        _rb.linearVelocity = new Vector3(
            direction.x * _moveSpeed, 
            _rb.linearVelocity.y, 
            direction.z * _moveSpeed
        );
    }
}

FPCameraController.cs

using UnityEngine;

public class FPCameraController : MonoBehaviour
{
    // Чувствительность мыши
    [SerializeField] private float _sensivity = 100f;
    
    // Ссылка на родительский объект Player (для поворота по горизонтали)
    [SerializeField] private Transform _player;
    
    // Ограничения вертикального угла
    [SerializeField] private float _verticalLover = 60f;   // Вниз
    [SerializeField] private float _verticalUpper = -60f;  // Вверх
    
    private float _currentVerticalAngle;

    void Start()
    {
        // Прячем и блокируем курсор
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }

    void Update()
    {
        // Получаем движение мыши
        var vertical = -Input.GetAxis("Mouse Y") * _sensivity * Time.deltaTime;
        var horizontal = Input.GetAxis("Mouse X") * _sensivity * Time.deltaTime;

        // Обновляем вертикальный угол с ограничениями
        _currentVerticalAngle = Mathf.Clamp(
            _currentVerticalAngle + vertical, 
            _verticalUpper, 
            _verticalLover
        );
        
        // Поворачиваем камеру вертикально
        transform.localRotation = Quaternion.Euler(_currentVerticalAngle, 0, 0);

        // Поворачиваем игрока горизонтально
        _player.Rotate(0, horizontal, 0);
    }
}

Структура: Player (TPPlayerMovement + Rigidbody), Camera отдельно

TPS Demo

Inspector:

TPS Inspector

Полный код скрипта

using UnityEngine;

public class TPPlayerMovement : MonoBehaviour
{
    // Скорость передвижения
    public float Speed = 5f;
    
    // Скорость поворота персонажа к направлению движения
    public float RotationSpeed = 10f;
    
    private Rigidbody rb;
    
    void Start() 
    {
        rb = GetComponent();
    }
    
    void Update() 
    {
        // Направление движения относительно камеры
        Vector3 direction = Camera.main.transform.forward * Input.GetAxis("Vertical") + 
                            Camera.main.transform.right * Input.GetAxis("Horizontal");
        
        // Убираем вертикальную составляющую (движемся только по плоскости)
        direction.y = 0;
        
        // Движение с сохранением вертикальной скорости (гравитация)
        rb.linearVelocity = direction.normalized * Speed + Vector3.up * rb.linearVelocity.y;
        
        // Плавный поворот персонажа в направлении движения
        if (direction.magnitude > 0.1f)
            transform.rotation = Quaternion.Slerp(
                transform.rotation, 
                Quaternion.LookRotation(direction), 
                RotationSpeed * Time.deltaTime
            );
    }
}

Структура: Camera отдельно (TPCameraController), Target - ссылка на Player

Inspector:

Camera Inspector

Полный код скрипта

using UnityEngine;

public class TPCameraController : MonoBehaviour
{
    // Цель, за которой следит камера
    public Transform Target;
    
    // Смещение камеры от цели (назад и вверх)
    public Vector3 Offset = new Vector3(0, 5, -7);
    
    // Чувствительность управления мышью
    public float Sensitivity = 3f;
    
    private float _rotationX, _rotationY;
    
    void LateUpdate() 
    {
        // Получаем движение мыши
        _rotationX += Input.GetAxis("Mouse X") * Sensitivity;
        _rotationY -= Input.GetAxis("Mouse Y") * Sensitivity;
        
        // Ограничиваем вертикальный угол
        _rotationY = Mathf.Clamp(_rotationY, -40, 80);
        
        // Вычисляем поворот камеры
        Quaternion rotation = Quaternion.Euler(_rotationY, _rotationX, 0);
        
        // Применяем поворот
        transform.rotation = rotation;
        
        // Позиционируем камеру: позиция цели + смещение с учётом поворота
        transform.position = Target.position + rotation * Offset;
    }
}