В Unity всё, что существует в сцене — это GameObject. Но сам по себе GameObject — пустая коробка. Всю функциональность ему дают Component (компоненты). Понимание этой разницы — ключ к гибкой архитектуре без путаницы.
GameObject (игровой объект) — это контейнер. У него нет свойств типа «скорость», «здоровье» или «модель». У него есть только:
- Имя (
name) - Активность (
activeSelf/SetActive()) - Позиция, вращение, масштаб (через обязательный компонент
Transform) - Список прикреплённых компонентов
🧠 Представьте GameObject как пустую пластиковую коробку с наклейкой-именем. Сама коробка ничего не делает.
- Пустой объект (
Create Empty) - Куб, сфера, капсула (на самом деле это GameObject + компонент
MeshFilter+MeshRenderer) - Персонаж, стена, источник света, камера
Component (компонент) — это поведение, данные или возможность, которые вы добавляете в GameObject. Компонент:
- Не существует сам по себе (всегда прикреплён к GameObject)
- Даёт объекту конкретные свойства: физику, визуал, звук, логику
- Можно удалить, добавить, временно отключить
🧠 Представьте компоненты как инструменты, которые вы кладёте в коробку: мотор (Rigidbody), краска (MeshRenderer), микрофон (AudioSource), мозг (ваш скрипт).
Transform(есть у каждого GameObject, его нельзя удалить)MeshRenderer— чтобы объект был видимRigidbody— чтобы на него действовала гравитация и физикаAudioSource— чтобы проигрывать звук- Ваш собственный скрипт
PlayerHealth.cs— чтобы хранить здоровье и реагировать на урон
| Характеристика | GameObject | Component |
|---|---|---|
| Суть | Контейнер | Поведение / данные |
| Может существовать один? | ✅ Да | ❌ Нет (только внутри GameObject) |
| Добавляется / удаляется | Создание/уничтожение объекта | ✅ Можно добавлять и удалять |
| Пример | "Персонаж", "Дверь" | "Скрипт движения", "Коллайдер" |
Иерархия → ПКМ → Create Empty → назовите Enemy
Выделите Enemy → кнопка Add Component:
Mesh Filter→ выберите модель (например, сфера)Mesh Renderer→ назначьте материал (цвет)Capsule Collider→ чтобы на него можно было столкнутьсяRigidbody→ чтобы он падал под гравитацией- Ваш скрипт
EnemyAI(напишите его) → чтобы враг двигался к игроку
Снимите галоку с Rigidbody в Inspector → гравитация пропадёт.
Снимите с Mesh Renderer → враг станет невидимым (но продолжит работать по логике).
❌ «Мой скрипт не видит переменную Speed другого объекта»
✅ Надо понять: переменная лежит не в GameObject, а в конкретном компоненте (например, PlayerMovement). Получать её нужно так:
GameObject player = GameObject.Find("Player");
PlayerMovement movement = player.GetComponent<PlayerMovement>();
float speed = movement.speed;GameObject определяет ЧТО существует. Component определяет ЧТО ОНО ДЕЛАЕТ и КАК ВЫГЛЯДИТ.