К списку статей
Скрипты
Контроллер от первого лица (FPS) ▼
Структура: Player (FPPlayerMovement + Rigidbody) → Camera внутри (FPCameraController)
Inspector - Movement:
Inspector - 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);
}
}
Контроллер персонажа от 3-го лица ▼
Структура: Player (TPPlayerMovement + Rigidbody), Camera отдельно
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:
Полный код скрипта
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;
}
}