Векторы и Физика: Как объекты двигаются в мире Unity




Векторы и физика — это две половины одной монеты. Векторы отвечают за «куда и насколько далеко», а физика — за «как именно это произойдет с учетом массы, гравитации и столкновений». Понимание этой связки превращает вашу игру из набора прыгающих квадратов в живой, отзывчивый мир.

📐 Часть 1. Векторы — язык пространства

Vector3 (и Vector2 для 2D-игр) — это структура, которая одновременно хранит три вещи:
  • 📍 Точку в пространстве (координаты X, Y, Z)
  • ➡️ Направление (куда смотреть/двигаться)
  • 📏 Длину (magnitude) — скорость, дистанцию, силу

🔑 Ключевые свойства

csharp

⚡ Готовые вектора (используй вместо new Vector3!)

Вектор
Значение
Когда использовать
Vector3.zero
(0, 0, 0)
Сброс позиции, обнуление скорости
Vector3.one
(1, 1, 1)
Единичный масштаб
Vector3.up
(0, 1, 0)
Прыжок, гравитация вверх
Vector3.forward
(0, 0, 1)
Движение "вперед" от объекта
Vector3.right
(1, 0, 0)
Движение вправо

🧮 Главные операции

csharp

🎯 Полезные методы (не изобретай велосипед!)

csharp

💥 Часть 2. Физика — законы реального мира

Физика в Unity работает через два компонента-напарника: Rigidbody (тело с массой) и Collider (форма). Без Rigidbody объект — просто декорация, которая не реагирует на гравитацию и силы.

🎛️ Настройки Rigidbody

Параметр
Что делает
Когда использовать
Mass
Масса объекта
Тяжелый ящик = 10, персонаж = 1
Drag
Сопротивление воздуха
Останавливает скольжение по инерции
Use Gravity
Включить гравитацию
Выключи для летающих врагов, пуль
Is Kinematic
Физика НЕ действует на объект
Платформы, движущиеся стены, триггеры
Constraints
Заморозить оси вращения/движения
Заморозь X/Z вращение у игрока, чтобы не падал

🚀 Три способа двигать Rigidbody

❌ НЕПРАВИЛЬНО: Через transform.position

csharp

✅ СПОСОБ 1: Через скорость (для постоянного движения)

csharp

✅ СПОСОБ 2: AddForce (для импульсов и физичных объектов)

csharp

✅ СПОСОБ 3: MovePosition (для кинематических тел)

csharp

🔍 Часть 3. Raycast — "щуп" для ИИ и стрельбы

Raycast выпускает невидимый луч из точки в направлении и проверяет, во что он уперся. Основа для: стрельбы (hitscan), проверки "земли под ногами", ИИ.
csharp


⚖️ OnCollision vs OnTrigger — вечная путаница

OnCollision
OnTrigger
Галочка IsTrigger
❌ Снята
✅ Стоит
Физика
Отскоки, толчки, остановка
Объекты проходят сквозь друг друга
Нужен Rigidbody
На обоих объектах
Достаточно одного
Когда использовать
Пуля в стену, приземление, толчок ящика
Сбор монеток, зона смерти, чекпоинт, двери
csharp


💡 Шпаргалка: "Что использовать и где?"

Задача
Решение
Метод
Движение персонажа
Rigidbody + скорость
rb.linearVelocity = ... в FixedUpdate
Прыжок
Мгновенный импульс
rb.AddForce(Vector3.up * force, ForceMode.Impulse)
Пуля /.hitscan
Мгновенная проверка
Physics.Raycast(...)
Следование за целью
Плавное движение
Vector3.MoveTowards(...) в Update
Камера за игроком
Плавное приближение
Vector3.Lerp(...) в LateUpdate
Проверка препятствий ИИ
Луч вперед
Physics.Raycast(...)
Сбор предметов
Триггер
OnTriggerEnter
Удар / взрыв
Сила по радиусу
Physics.OverlapSphere + AddExplosionForce



⚠️ Золотые правила физики

  1. Всю физику пиши ТОЛЬКО в FixedUpdate, а не в Update. Иначе физический движок будет вести себя нестабильно на разных FPS.
  2. Всегда нормализуй вектор движения (normalized), иначе диагональное движение будет быстрее прямого.
  3. Никогда не двигай Rigidbody через transform.position — используй linearVelocity, AddForce или MovePosition.
  4. Для проверок дистанции используй sqrMagnitude, а не Distance или magnitude — это в разы быстрее (не считает квадратный корень).
  5. Используй LayerMask в Raycast и Physics-проверках, чтобы луч не реагировал на триггеры, триггеры не сталкивались с пулями и т.д.










Комментарии

Популярные сообщения из этого блога

Unity3D C#

MQL4 событие OnChartEvent()

Ответы по промбезопасности. А.1. ПБП 115.15 Подготовка и аттестация руководителей и специалистов организаций по основам промышленной безопасности