Справочник по Unity
Назначение
Горячие клавиши, команды и форматы Unity для ежедневной работы. Учебный курс: раздел. Готовые скрипты с построчным разбором для новичков — Unity C# — скрипты для новичков.
Краткое пояснение
Шпаргалка по Unity — таблицы синтаксиса, API, команд и параметров — для быстрого поиска фактов.
Справочные таблицы
Содержание справочника
- Блок 1. Основа — Lifecycle, GameObject, Transform, Component, Project Settings
- Блок 2. Физика, Рендеринг, Освещение, Аудио — в т.ч. NavMeshAgent
- Блок 3. Анимация, Data-Oriented Design, Пакеты, Профилирование, Сборка
- Блок 4. Высокопроизводительные системы, графы, динамическая загрузка, безопасность
- Блок 5. UI, Локализация, Тестирование, Облако, Экстеншены редактора
- Блок 6. Мобильные, Сети, Оптимизация, Интеграции, CI/CD
Блок 1. Основа — Lifecycle, GameObject, Transform, Component, Project Settings
Устаревшие API: в новых проектах избегайте
FindObjectOfType/FindObjectsOfType(замена —FindFirstObjectByType,FindObjectsByType),GameObject.Findв runtime,SendMessageиBroadcastMessage. Ниже — справочник с актуальными и legacy-именами там, где они ещё встречаются в чужом коде.
1. MonoBehaviour Lifecycle (гарантированный порядок вызова)
| Метод | Когда вызывается | Примечания |
|---|---|---|
Awake() |
При инициализации объекта (до Start) — даже если enabled = false |
Вызывается один раз за жизненный цикл объекта. Подходит для инициализации ссылок (GetComponent, FindFirstObjectByType). |
OnEnable() |
После Awake, каждый раз при включении объекта (SetActive(true) или enabled = true) |
Может вызываться многократно. |
Start() |
Перед первым Update, только если скрипт включён (enabled == true) |
Не вызывается, если объект создан через Instantiate с SetActive(false). |
FixedUpdate() |
С фиксированным интервалом (Time.fixedDeltaTime, по умолчанию 0.02 с = 50 Гц) |
Физика (Rigidbody.AddForce). При Time.timeScale = 0 симуляция на паузе (шаг ≈ 0). |
Update() |
Один раз за кадр (частота зависит от FPS) | Основной цикл логики игры. |
LateUpdate() |
После всех Update |
Используется для камеры (Camera.main.transform.position = target.position), анимации, post-processing. |
OnPreCull() |
До начала рендеринга сцены (внутри Camera.Render) |
Редко используется. Camera уже имеет worldToCameraMatrix, но projectionMatrix ещё не установлен. |
OnWillRenderObject() |
Перед рендерингом каждого объекта (только если Camera видит объект и он имеет MeshRenderer) |
Может вызываться несколько раз за кадр (множество камер). |
OnRenderObject() |
После OnWillRenderObject, до OnPostRender (внутри Camera.Render) |
Можно вызывать GL.IssuePluginEvent, Graphics.DrawMeshNow. |
OnPostRender() |
После OnRenderObject, внутри Camera.Render |
Подходит для post-processing вручную (например, Graphics.Blit). |
OnBecameVisible() / OnBecameInvisible() |
При переходе в/из поля зрения любой активной камеры | Требует Renderer.enabled == true. |
OnApplicationFocus(bool focus) |
При потере/получении фокуса игрой (окно активно/неактивно) | |
OnApplicationPause(bool pause) |
При паузе (свёртывание на мобильных, Alt+Tab на ПК и т.д.) | На Android/iOS — вызывается при сворачивании. |
OnApplicationQuit() |
При завершении приложения (в редакторе — при нажатии Stop) | Вызывается только в standalone-сборках и при остановке в редакторе. Не вызывается при закрытии редактора. |
OnDestroy() |
При уничтожении объекта (Destroy(gameObject)) или при выходе из сцены |
Вызывается даже если скрипт отключён. Последний шанс на очистку (StopAllCoroutines, отписка от событий). |
⚠️ Важно:
Reset()— вызывается в редакторе при добавлении компонента или через Inspector>⚙️>Reset. Не часть runtime lifecycle.OnValidate()— вызывается в редакторе при изменении значений в инспекторе или загрузке сцены. Не вызывается в сборке.
- Физика в
Update— силы и прыжки черезRigidbodyзадавайте вFixedUpdate; вUpdateтолько ввод и логика без физики. - Смешение Transform и Rigidbody — у динамического тела не задавайте
transform.positionкаждый кадр; используйтеMovePosition/AddForce. - Без
Time.deltaTime— движение черезTranslateвUpdateдолжно масштабироваться на длительность кадра. Startне вызвался — объект создан черезInstantiateсSetActive(false)или скрипт отключён (enabled = false).GetComponentв hot path — кешируйте ссылки вAwake; в runtime избегайтеGameObject.Find.- Триггер молчит — нужен
Collider+Is TriggerиRigidbodyхотя бы на одной стороне; см. практику Unity.
Пошаговые примеры — Разработка на Unity. Готовые фрагменты с разбором строк — Unity C# — скрипты для новичков (триггеры, Rigidbody, частые ошибки).
2. GameObject
Основные свойства
| Свойство | Тип | Описание |
|---|---|---|
activeSelf |
bool |
Состояние активности именно этого GameObject (локальное). |
activeInHierarchy |
bool |
true, если объект и все его предки активны. |
isStatic |
bool |
Флаг Static (для оптимизаций: batching, lighting, culling). |
layer |
int |
Слой (0–31). Соответствует LayerMask.NameToLayer. |
tag |
string |
Тег. Доступные теги — в Edit > Project Settings > Tags and Layers. |
scene |
Scene |
Сцена, к которой принадлежит объект. |
transform |
Transform |
Ссылка на компонент Transform. Не может быть null. |
hideFlags |
HideFlags |
Управляет отображением в иерархии и инспекторе (HideInHierarchy, DontSave, HideInInspector и др.). |
Основные методы
| Метод | Описание |
|---|---|
SetActive(bool) |
Устанавливает activeSelf. |
GetComponent<T>() / GetComponent(Type) |
Быстрый доступ к первому компоненту указанного типа. |
GetComponents<T>(List<T>) / GetComponentsInChildren<T>(includeInactive) |
Массовый сбор компонентов (рекомендуется переиспользовать List<T> во избежание GC). |
AddComponent<T>() / AddComponent(Type) |
Добавление компонента. Не создаёт дубликаты (если компонент [DisallowMultipleComponent]). |
TryGetComponent<T>(out T) |
Безопасное получение компонента (возвращает bool). |
CompareTag(string) |
Безопасное сравнение тега (не создаёт GC, не падает при null). |
SendMessage(...) |
Legacy. Отправка сообщения по имени метода всем компонентам (медленно, без типобезопасности). Предпочитайте прямые ссылки, события C# или UnityEvent. |
FindFirstObjectByType<T>() / FindObjectsByType<T>() |
Поиск в сцене (Unity 2023+). Заменяют FindObjectOfType / FindObjectsOfType. |
3. Transform
Иерархия — костяк Unity. Все операции с позицией/вращением/масштабом — через Transform.
Свойства
| Свойство | Тип | Описание |
|---|---|---|
position |
Vector3 |
Мировая позиция (Vector3.zero = начало мировой системы). |
localPosition |
Vector3 |
Позиция относительно родителя. |
rotation |
Quaternion |
Мировое вращение. |
localRotation |
Quaternion |
Вращение относительно родителя. |
eulerAngles |
Vector3 |
Углы Эйлера (в градусах, мировые). Чтение — конвертация из rotation; запись — конвертация в Quaternion. |
localEulerAngles |
Vector3 |
Углы Эйлера (локальные). |
lossyScale |
Vector3 |
Фактический мировой масштаб (с учётом вращения родителей — может быть искажён). |
localScale |
Vector3 |
Локальный масштаб (применяется до вращения). |
parent |
Transform |
Родитель. null — корень. |
root |
Transform |
Корень иерархии. |
childCount |
int |
Количество дочерних объектов. |
hasChanged |
bool |
true, если position/rotation/localScale изменились с последнего кадра (сбрасывается в Update). Не учитывает изменение parent. |
Методы
| Метод | Описание |
|---|---|
SetParent(Transform, worldPositionStays) |
Изменение родителя. worldPositionStays = true — сохраняет мировую позицию. |
Translate(Vector3, Space) |
Смещение на вектор в Space.Self или Space.World. |
Rotate(Vector3, Space) |
Поворот (углы в градусах) относительно осей (Space.Self, Space.World, или TransformDirection). |
RotateAround(Vector3 point, Vector3 axis, float angle) |
Вращение вокруг точки в мировом пространстве. |
TransformPoint(Vector3) |
Преобразует точку из локального → мирового пространства. |
InverseTransformPoint(Vector3) |
Мировая → локальная точка. |
TransformDirection(Vector3) |
Направление (без учёта масштаба и сдвига) из локального → мирового. |
InverseTransformDirection(Vector3) |
Обратное преобразование направления. |
TransformVector(Vector3) |
Вектор (с учётом масштаба) из локального → мирового. |
LookAt(Transform / Vector3) |
Поворачивает объект, чтобы forward смотрел на цель. |
SetPositionAndRotation(Vector3, Quaternion) |
Атомарная установка позиции и вращения (предпочтительнее двух отдельных присваиваний). |
⚠️ Важно:
- Изменение
position/rotation/localScaleнапрямую приводит к рекурсивному обновлениюTransformвсей ветки — избегать в циклах без необходимости.SetParent(null, true)≠DontDestroyOnLoad— последний перемещает объект в скрытую сценуDontDestroyOnLoad.
4. Базовые компоненты — общие параметры и свойства
Общие для всех Component
| Свойство | Описание |
|---|---|
gameObject |
Ссылка на GameObject, к которому прикреплён компонент. |
transform |
Кэшированный gameObject.transform. |
enabled (Behaviour only) |
Включенность компонента (только для MonoBehaviour, Collider, Renderer, Light, AudioSource). |
tag (Component → GameObject.tag) |
Короткий доступ к тегу GameObject. |
Renderer (базовый класс для MeshRenderer, SkinnedMeshRenderer, SpriteRenderer и др.)
| Свойство | Тип | Описание |
|---|---|---|
enabled |
bool |
Видимость в рендере. |
isVisible |
bool |
Видим ли объект хотя бы одной камерой (только если enabled == true). |
bounds |
Bounds |
Ограничивающий объём в мировом пространстве (center, extents, size). |
localBounds |
Bounds |
Локальный bounding box (только SkinnedMeshRenderer). |
material / materials |
Material / Material[] |
Первый материал / все материалы. Присваивание создаёт инстанс (копию). |
sharedMaterial / sharedMaterials |
Material / Material[] |
Прямой доступ к материалам без копирования (опасно — изменяет все объекты, использующие материал). |
lightmapIndex / lightmapScaleOffset |
int / Vector4 |
Параметры baked lighting (Lightmap Index, UV scale/offset). |
receiveShadows |
bool |
Получает ли тени от других объектов. |
motionVectorGenerationMode |
MotionVectorGenerationMode |
Off / Camera / Object — для TAA и motion blur. |
allowOcclusionWhenDynamic |
bool |
Разрешает dynamic occlusion culling (требует OcclusionCulling в настройках). |
Collider (базовый класс)
| Свойство | Описание |
|---|---|
enabled |
Участвует ли коллайдер в физике. |
isTrigger |
true — триггер (вызывает OnTriggerEnter/Stay/Exit, не участвует в физике). |
sharedMaterial |
PhysicMaterial (3D) / PhysicsMaterial2D (2D) — трение, отскок. |
bounds |
Мировые границы (даже если enabled == false). |
5. Project Settings (Edit > Project Settings)
📁 Time
| Параметр | Значение по умолчанию | Описание |
|---|---|---|
Time.timeScale |
1.0 | Глобальный множитель времени (0 — пауза). |
Time.fixedDeltaTime |
0.02 (50 FPS) | Интервал FixedUpdate. Рекомендуется ≤ Application.targetFrameRate / 2. |
Maximum Allowed Timestep |
0.333... | Макс. длительность FixedUpdate, если игра "тормозит". |
Time.captureFramerate |
0 | Если ≠ 0 — фиксирует FPS = captureFramerate (для записи видео). |
🎮 Input
- Input Manager (устаревший, но поддерживается):
Axes— до 20 осей (Horizontal,Vertical,Jumpи др.), сSensitivity,Gravity,Dead,Snap,Invert,Type(Key/Axis/Mouse),Joy Num,Positive/Negative Button.
⚠️ Заменён на Input System Package (рекомендуется для новых проектов).
🖥️ Graphics
| Настройка | Описание |
|---|---|
Tier Settings |
Уровни качества графики (Tier 1/2/3 — для Low/Med/High-end GPU). |
Always Included Shaders |
Шейдеры, всегда включаемые в сборку (например, Unlit, Standard). |
Preloaded Shaders |
Шейдерные варианты, загружаемые при старте. |
Shader Stripping |
Удаление ненужных вариантов (lightmap modes, fog, instancing). |
Vertex Compression |
Сжатие позиций/нормалей/UV в мешах (экономия VRAM). |
Use GPU Skinning |
Аппаратная анимация скелета. |
Lightmaps → Mode |
Disabled / Non-Directional / Directional / Directional Specular. |
📦 Player
| Настройка | Описание |
|---|---|
Scripting Backend |
Mono (быстрая сборка) / IL2CPP (оптимизировано, AOT, поддержка 64-bit iOS/Android). |
Api Compatibility Level |
.NET Standard 2.1 (реком.) / .NET Framework / .NET 6+ (experimental). |
Active Input Handling |
Both / Input Manager (Old) / Input System (New). |
Optimization → Managed Stripping Level |
Disabled / Low / Medium / High — удаление неиспользуемых API (осторожно с reflection). |
Resolution and Presentation |
Fullscreen mode, Default resolution, VSync, Display resolution dialog. |
Icon |
Иконка сборки (Windows, macOS, Linux, Android, iOS). |
Splash Screen |
Экран загрузки; кастомизация зависит от тарифа Unity (см. актуальную лицензию на unity.com). |
🧠 Physics (и Physics 2D)
| Параметр | Описание |
|---|---|
Gravity |
Вектор гравитации (0, -9.81, 0 по умолчанию). |
Default Material |
PhysicMaterial по умолчанию (Bounciness=0, Friction=0.5). |
Bounce Threshold |
Мин. скорость для отскока (меньше — "прилипание"). |
Sleep Threshold |
Энергия, ниже которой Rigidbody "засыпает". |
Default Solver Iterations / Velocity Iterations |
Точность симуляции (выше — точнее, дороже). |
Queries Hit Triggers / Triggers Hit Triggers |
Влияют на Physics.Raycast, OverlapSphere и др. |
Layer Collision Matrix |
32×32 битовая матрица — какие слои сталкиваются. |
🎨 Quality
| Уровень | Основные параметры (настраиваемые) |
|---|---|
VSync Count |
Don’t Sync / Every V Blank / Every Second V Blank — борьба с tearing. |
Anti Aliasing |
2x–8x MSAA (только Forward), или Post-processing (FXAA, TAA). |
Anisotropic Textures |
Disabled / Per Texture / Forced On. |
Soft Particles |
Затемнение частиц при пересечении геометрии. |
Realtime Reflection Probes |
Refresh mode (On Awake / Every Frame / Via Script). |
Shadow Distance / Cascades |
Дальность и разбиение теней для Directional Light. |
Блок 2. Физика, Рендеринг, Освещение, Аудио
1. Rigidbody (3D)
Основные свойства
| Свойство | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
mass |
float |
1.0 | Масса в кг. Влияет на инерцию, импульс, силу гравитации (F = m·g). |
drag |
float |
0.0 | Линейное сопротивление воздуха (коэффициент пропорциональности F_drag = -v·drag). |
angularDrag |
float |
0.05 | Угловое сопротивление (аналогично drag, но для вращения). |
useGravity |
bool |
true |
Учитывать ли глобальную гравитацию (Physics.gravity). |
isKinematic |
bool |
false |
true — объект не участвует в физике, но может двигаться через Transform; триггеры работают. |
interpolation |
RigidbodyInterpolation |
None |
Interpolate/Extrapolate — сглаживание движения при дискретных физ. шагах (для сетевых игр). |
collisionDetectionMode |
CollisionDetectionMode |
Discrete |
Continuous/ContinuousDynamic/ContinuousSpeculative — анти-туннелирование для быстрых объектов. |
constraints |
RigidbodyConstraints |
None |
Флаги: FreezePositionX/Y/Z, FreezeRotationX/Y/Z. |
centerOfMass |
Vector3 |
Vector3.zero |
Центр масс в локальных координатах. Смещение влияет на вращение под действием сил. |
inertiaTensor |
Vector3 |
Автоматически | Тензор инерции (диагональная матрица, задаёт сопротивление вращению по осям). |
inertiaTensorRotation |
Quaternion |
Quaternion.identity |
Поворот осей тензора инерции. |
detectCollisions |
bool |
true |
Отключает обнаружение столкновений (но не триггеров), если false. |
Методы изменения состояния
| Метод | Сигнатура | Примечания |
|---|---|---|
AddForce |
AddForce(Vector3 force, ForceMode mode = ForceMode.Force) |
ForceMode: Force (F), Acceleration (a = F/m), Impulse (Δp), VelocityChange (Δv). |
AddRelativeForce |
Аналогично, но сила прикладывается в локальной СК. | |
AddTorque |
AddTorque(Vector3 torque, ForceMode mode) |
Вращающий момент (аналогично AddForce). |
AddRelativeTorque |
В локальной СК. | |
MovePosition |
MovePosition(Vector3 position) |
Атомарное перемещение (для isKinematic = true); сглаживается при interpolation. |
MoveRotation |
MoveRotation(Quaternion rot) |
Атомарный поворот (аналогично MovePosition). |
Sleep() / WakeUp() |
— | Принудительный переход в спящее/активное состояние. |
IsSleeping() |
bool |
Проверка состояния. |
ResetCenterOfMass() / ResetInertiaTensor() |
— | Возврат к автоматическому расчёту. |
⚠️ Важно:
- Все силы/импульсы, добавленные через
AddForceи т.п., действуют до следующегоFixedUpdate.linearVelocity/angularVelocity(Unity 6+; ранееvelocity/angularVelocity) можно читать/писать напрямую, но для реалистичной физики предпочтительнееAddForce/AddTorque.maxAngularVelocity— глобальное ограничение (вProject Settings > Physics), по умолчанию 7.
2. Rigidbody2D
Свойства (отличия от 3D)
| Свойство | Значение по умолчанию | Описание |
|---|---|---|
gravityScale |
1.0 | Множитель 2D-гравитации (Physics2D.gravity). |
freezeRotation |
false |
Заменяет constraints для Z-вращения. |
simulated |
true |
Аналог enabled, но для физики 2D: отключает симуляцию, сохраняя компонент. |
interpolation |
None |
Аналогично 3D: Interpolate, Extrapolate. |
sleepMode |
StartAwake |
StartAsleep — изначально спящий. |
collisionDetection |
Discrete |
Continuous — анти-туннелирование (только для RigidbodyType.Dynamic). |
mass, drag, angularDrag |
как в 3D | |
constraints |
None |
FreezePositionX/Y, FreezeRotation. |
Методы (2D-специфичные)
| Метод | Описание |
|---|---|
AddForce(Vector2, ForceMode2D) |
ForceMode2D.Force / Impulse. |
AddTorque(float, ForceMode2D) |
Вращение вокруг Z. |
MovePosition(Vector2) / MoveRotation(float) |
Атомарные операции. |
GetContacts(ContactPoint2D[]) |
Заполняет массив контактами за последний кадр. |
OverlapCollider(NonAlloc) |
Проверка пересечения без аллокаций. |
⚠️ Особенность:
Rigidbody2DиCollider2Dработают только в 2D-физике — не взаимодействуют с 3D-объектами.Physics2D.autoSimulation = falseпозволяет делатьPhysics2D.Simulate(deltaTime)вручную (для фиксированной логики в сетевых играх).
3. Коллайдеры
Общие для всех Collider
| Свойство | Тип | Описание |
|---|---|---|
isTrigger |
bool |
Триггер: вызывает события OnTrigger*, не участвует в физике. |
sharedMaterial |
PhysicMaterial / PhysicsMaterial2D |
Трение (dynamicFriction, staticFriction) и отскок (bounciness). |
attachedRigidbody |
Rigidbody / Rigidbody2D |
Первый Rigidbody, найденный при подъёме по иерархии (включая родителей). |
enabled |
bool |
Участвует ли в физике/триггерах. |
bounds |
Bounds (3D) / Bounds (2D → преобразуется в 3D) |
Габариты в мировом пространстве (даже если enabled = false). |
3D-коллайдеры
| Тип | Свойства | Особенности |
|---|---|---|
BoxCollider |
center, size |
Оси выровнены с Transform. Не поддерживает скейл с отрицательными компонентами (mirror). |
SphereCollider |
center, radius |
Самый дешёвый по вычислениям. |
CapsuleCollider |
center, radius, height, direction (0=X,1=Y,2=Z) |
Высота включает сферические "шапки". |
MeshCollider |
sharedMesh, convex, cookingOptions |
convex = true — требуется для Rigidbody (ограничение: ≤ 255 треугольников). cookingOptions: CookForFasterSimulation, EnableMeshCleaning, WeldColocatedVertices. |
TerrainCollider |
terrainData |
Привязан к Terrain. Не может быть триггером. |
WheelCollider |
center, radius, suspensionDistance, suspensionSpring, forwardFriction, sidewaysFriction, motorTorque, brakeTorque, steerAngle |
Физическая модель подвески (не геометрия — невидим). Требует Rigidbody. |
2D-коллайдеры
| Тип | Свойства | Особенности |
|---|---|---|
BoxCollider2D |
size, offset, autoTiling |
autoTiling — коррекция размера под SpriteRenderer.size. |
CircleCollider2D |
radius, offset |
|
CapsuleCollider2D |
size, direction (Vertical/Horizontal) |
|
PolygonCollider2D |
points (локальные), autoTiling |
Автоматическая генерация из Sprite (если Sprite не None). |
EdgeCollider2D |
points, edgeRadius |
Открытая ломаная (не замкнутая). edgeRadius — скругление углов. |
CompositeCollider2D |
geometryType (Outlines/Polygons), generationType (Manual/Synchronous/Asynchronous) |
Объединяет несколько Collider2D с UsedByComposite = true. Требует Rigidbody2D с BodyType = Static или Kinematic. |
⚠️ Ограничения:
MeshColliderбезconvex = trueне взаимодействует с другимиMeshColliderиTerrainCollider.WheelColliderне поддерживаетisTrigger.CompositeCollider2Dне может быть триггером.
4. Camera
Проекция и параметры
| Свойство | Тип | Описание |
|---|---|---|
fieldOfView |
float |
Угол обзора (в градусах) для projection = Perspective. |
orthographicSize |
float |
Половина высоты видимой области (в мировых единицах) для orthographic = true. |
nearClipPlane |
float |
Ближняя плоскость отсечения (по умолчанию 0.3). Уменьшение → артефакты Z-fighting. |
farClipPlane |
float |
Дальняя плоскость (по умолчанию 1000). Увеличение → снижение precision Z-buffer. |
projectionMatrix |
Matrix4x4 |
Пользовательская матрица проекции (переопределяет FOV/orthographicSize). |
cullingMask |
LayerMask |
Какие слои рендерить. |
targetDisplay |
int |
Номер Display (0 — основной). Для multi-monitor. |
rect |
Rect |
Область экрана (в нормализованных координатах: 0–1). Для splitscreen/UI. |
depth |
float |
Порядок рендеринга (больше — позже). |
Режимы проекции
| Параметр | perspective = true |
orthographic = true |
|---|---|---|
projection |
CameraProjection.Perspective |
CameraProjection.Orthographic |
size |
fieldOfView |
orthographicSize |
| Использование | 3D-сцены, погружение | 2D, изометрия, UI, CAD |
HDR и постобработка
| Свойство | Значение по умолчанию | Описание |
|---|---|---|
hdr |
true (в URP/HDRP) |
Рендеринг в HDR (32-bit float render texture). Требуется для bloom, tone mapping. |
allowHDR |
— | Доступно только в Built-in RP (в URP/HDRP управление через asset). |
allowMSAA |
true |
Включение MSAA (работает только в Forward, не в Deferred). |
useOcclusionCulling |
true |
Использовать precomputed occlusion data. |
stereoTargetEye |
StereoTargetEyeMask.Both |
Настройка для VR. |
cameraType |
CameraType.Game |
SceneView, Reflection, Preview, VR — влияет на поведение в редакторе. |
Методы
| Метод | Описание |
|---|---|
ScreenPointToRay(Vector3) |
Луч из точки экрана (в пикселях) в мировое пространство. |
WorldToScreenPoint(Vector3) |
Мировая точка → точка на экране (Z — расстояние до near plane). |
WorldToViewportPoint(Vector3) |
Мировая точка → нормализованные координаты (0–1 по X/Y, Z — 0..1 между near/far). |
ViewportToWorldPoint(Vector3) |
Обратное преобразование. |
Render() |
Принудительный рендеринг (вне основного цикла). |
CopyFrom(Camera) |
Копирование всех параметров из другой камеры. |
TryGetCullingParameters(out ScriptableCullingParameters) |
Получение параметров для custom culling (URP/HDRP). |
GetStereoProjectionMatrix(Camera.StereoscopicEye) |
Для VR. |
Stacking (URP/HDRP)
| Понятие | Описание |
|---|---|
| Base Camera | Главная камера, определяет viewport, clear flags, culling mask. |
| Overlay Camera | Доп. камера, рендерит поверх Base (например, UI, миникарта, crosshair). Имеет cameraType = CameraType.Overlay. |
| Order in Layer | Порядок overlay-камер (в инспекторе). |
⚠️ Важно:
clearFlags—Skybox,SolidColor,DepthOnly,DontClear.DepthOnly— для UI-камер (сохраняет цвет, очищает depth buffer).- В URP/HDRP параметры
hdr,msaa,colorGradingзадаются вRenderer Asset, а не в компонентеCamera.
5. Light
Типы и параметры
| Свойство | Тип | Описание |
|---|---|---|
type |
LightType |
Directional, Point, Spot, Area (только для baking). |
color |
Color |
Цвет света (gamma-corrected). |
intensity |
float |
Яркость (люмены): Directional — illuminance (lux), Point/Spot — luminous power (lumens). |
range |
float |
Дальность действия (кроме Directional). |
spotAngle |
float |
Угол конуса (только Spot). |
innerSpotAngle |
float |
Внутренний угол (для soft falloff). |
shadows |
LightShadows |
None, Hard, Soft. |
shadowStrength |
float |
Прозрачность теней (0–1). |
shadowBias |
float |
Смещение для борьбы с acne (требует подбора под сцену). |
shadowNormalBias |
float |
Смещение по нормали (для тонких объектов). |
shadowNearPlane |
float |
Near plane теневого frustum (только Directional). |
cookie |
Texture |
Текстура проекции (только для Spot). |
renderMode |
LightRenderMode |
Auto, Important, Not Important — управление per-pixel lighting. |
Baking и realtime
| Настройка | Built-in RP | URP | HDRP |
|---|---|---|---|
Mode |
Realtime, Mixed, Baked |
Realtime, Baked |
Realtime, Baked |
Mixed (Built-in) |
Shadowmask, Subtractive, Baked Indirect |
— | — |
| Light Layers | — | Поддержка (через asset) | Полная поддержка |
| Light Cookies | Поддержка (2D cookie) | Поддержка | Поддержка (3D cookie) |
Realtime GI (Built-in RP only)
| Параметр | Описание |
|---|---|
Bounce Intensity |
Множитель отражённого света. |
Color Temperature |
Цвет по шкале Кельвина (если Use Color Temperature = true). |
Indirect Multiplier |
Яркость indirect lighting. |
⚠️ Ограничения:
Arealight работает только в baked режиме.- В URP/HDRP realtime GI заменён на Screen Space GI, SSR, или light probes.
shadowResolution—Low(512),Medium(1024),High(2048),Very High(4096). Глобально вProject Settings > Quality.
6. AudioSource / AudioListener
AudioSource
| Свойство | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
clip |
AudioClip |
null |
Аудиоданные (OGG/Vorbis, PCM, ADPCM). |
outputAudioMixerGroup |
AudioMixerGroup |
null |
Группа в AudioMixer (для эффектов, volume Автоматизация). |
playOnAwake |
bool |
true |
Автовоспроизведение. |
volume |
float |
1.0 | Громкость (0–1). |
pitch |
float |
1.0 | Темп и тональность (0.5–2.0 рекомендовано). |
loop |
bool |
false |
Зацикливание. |
mute |
bool |
false |
Отключение (но isPlaying остаётся true). |
spatialBlend |
float |
0.0 | 0 — 2D (одинаково во всех динамиках), 1 — 3D (пространственное звучание). |
spatialize |
bool |
false |
Включение spatializer plugin (например, Oculus Spatializer). |
reverbZoneMix |
float |
1.0 | Вклад в эффект реверберации (в AudioReverbZone). |
dopplerLevel |
float |
1.0 | Интенсивность эффекта Доплера. |
spread |
float |
0.0 | Угол стереоразвёртки (в градусах, 0–360). |
priority |
int |
128 | При нехватке голосов — останавливаются с наибольшим priority. |
Пространственное звучание (3D)
| Свойство | Описание |
|---|---|
minDistance |
Расстояние, внутри которого громкость = volume. |
maxDistance |
Расстояние, за которым громкость = AudioListener.volume * AudioListener.gameObject.GetComponent<AudioLowPassFilter>()?.cutoffFrequency (если есть). |
rolloffMode |
AudioRolloffMode: Logarithmic, Linear, Custom. |
bypassEffects / bypassListenerEffects / bypassReverbZones |
Отключение обработки (для debug или оптимизации). |
AudioListener
| Свойство | Описание |
|---|---|
volume |
Глобальная громкость (умножается на AudioSource.volume). |
spatializeInternal |
Включение internal spatializer (если нет plugin). |
output |
AudioMixerGroup — глобальный выход. |
Методы AudioSource
| Метод | Описание |
|---|---|
Play() / PlayDelayed(float) / PlayScheduled(double) |
PlayScheduled — точное воспроизведение по DSP clock. |
Pause() / UnPause() |
|
Stop() |
Останавливает и сбрасывает позицию. |
PlayOneShot(AudioClip, volumeScale) |
Воспроизведение без изменения clip и isPlaying. |
SetScheduledStartTime(double) / SetScheduledEndTime(double) |
Для точного синхронного воспроизведения. |
GetOutputData(float[], int) |
Получение PCM-данных (для визуализации). |
⚠️ Важно:
- Макс. число одновременных голосов:
AudioSettings.dspBufferSize/AudioSettings.speakerMode.AudioMixerпозволяет группировать источники, применять эффекты (reverb, EQ, compressor), и управлять параметрами через скрипты (mixer.SetFloat("Volume", -10f)).
7. NavMesh и NavMeshAgent
Пакет AI Navigation (Window → AI → Navigation). Bake строит проходимую сетку из Navigation Static геометрии.
NavMeshAgent
| Свойство / метод | Описание |
|---|---|
speed |
Макс. скорость перемещения (м/с). |
angularSpeed |
Скорость поворота (град/с). |
acceleration |
Ускорение при изменении скорости. |
stoppingDistance |
Дистанция до цели, на которой агент считается прибывшим. |
autoBraking |
Замедление у цели. |
radius / height |
Объём агента для avoidance и bake. |
SetDestination(Vector3) |
Задать целевую точку на NavMesh. |
ResetPath() |
Сброс текущего пути. |
pathPending |
true, пока путь пересчитывается. |
remainingDistance |
Оставшаяся длина пути по полилинии. |
isOnNavMesh |
Агент стоит на запечённой сетке. |
isStopped |
Приостановка движения без сброса цели. |
velocity |
Текущая скорость (read-only, для отладки). |
Связанные компоненты
| Компонент | Назначение |
|---|---|
| NavMesh Surface (опционально) | Локальный bake для части сцены (мульти-уровни). |
| NavMesh Obstacle | Динамическое препятствие (дверь, ящик), которое "вырезает" или уклоняет агентов. |
| Off-Mesh Link | Прыжки, лестницы между островами NavMesh. |
⚠️ Важно:
- После изменения геометрии уровня перезапеките NavMesh.
- Цель
SetDestinationдолжна лежать на NavMesh (иначе ближайшая валидная точка).- Агент без bake на сцене —
isOnNavMesh == false, движения не будет.- Учебный патруль и преследование — Разработка на Unity.
Блок 3. Анимация, Data-Oriented Design, Пакеты, Профилирование, Сборка
1. Animator и Animation
Animator — компонент
| Свойство | Тип | Описание |
|---|---|---|
runtimeAnimatorController |
RuntimeAnimatorController |
Ссылка на AnimatorController (.controller asset). Может быть null. |
applyRootMotion |
bool |
true — перемещение/вращение из корня анимации применяется к Transform. |
updateMode |
AnimatorUpdateMode |
Normal (в Update), AnimatePhysics (в FixedUpdate), UnscaledTime (игнорирует Time.timeScale). |
cullingMode |
AnimatorCullingMode |
AlwaysAnimate, CullUpdateTransforms, CullCompletely — управление обновлением при isVisible = false. |
avatar |
Avatar |
Описание скелета (только для humanoid). |
layersAffectMassCenter |
bool (URP/HDRP) |
Влияют ли IK-слои на центр масс (для физики). |
Параметры анимации
| Тип | Диапазон | Примечания |
|---|---|---|
float |
±3.4e38 |
Основной тип для blend trees, thresholds. |
int |
±2^31 |
Для дискретных состояний (e.g. weaponState = 0/1/2). |
bool |
true/false |
Простые переключения (e.g. isGrounded). |
Trigger |
— | Автоматически сбрасывается после использования (Animator.ResetTrigger). |
⚠️ Производительность:
- Чтение/запись параметров — не бесплатна:
SetFloatвызывает копирование буфера параметров.- Кэшируйте
Animator.StringToHash("param")→ используйтеanimator.SetFloat(hash, value).- Избегайте
GetFloatв hot paths — лучше хранить состояние в скрипте.
Состояния и переходы
| Элемент | Свойства |
|---|---|
| State | Speed, Cycle Offset, Foot IK, Write Defaults, Transitions, Motion (AnimationClip или BlendTree). |
| Blend Tree | Type: 1D, 2D Simple Directional, 2D Freeform Directional, 2D Freeform Cartesian, Direct; Parameters, Thresholds, Child Motions. |
| Transition | Has Exit Time, Exit Time, Fixed Duration / Transition Duration (s), Transition Offset, Interruption Source, Ordered Interruption, Conditions. |
Особенности:
Write Defaults = true— при выходе из состояния все параметры сбрасываются в значения по умолчанию (указаны в контроллере). Может вызывать артефакты — отключайте при необходимости.Any State— виртуальное состояние, из которого можно перейти в любое другое. Осторожно: может нарушить логику.Solo/Mute— отладка слоёв:Soloпроигрывает только этот слой,Mute— исключает.
События анимации
| Тип | Где задаётся | Когда вызывается |
|---|---|---|
Animation Event |
В AnimationClip (в редакторе анимации) |
В указанный кадр анимации (независимо от speed). |
StateMachineBehaviour |
В контроллере (на состоянии/переходе) | OnStateEnter, OnStateUpdate, OnStateExit, OnStateMove, OnStateIK. |
OnAnimatorMove() |
В MonoBehaviour |
После Animator обработал root motion (если applyRootMotion = true). |
OnAnimatorIK(int layerIndex) |
В MonoBehaviour |
После Animator вычислил IK, до применения к Transform. |
IK (Inverse Kinematics)
| Метод | Описание |
|---|---|
SetIKPosition(AvatarIKGoal, Vector3) |
Установка целевой точки для кисти/ступни. |
SetIKRotation(AvatarIKGoal, Quaternion) |
Установка целевого вращения. |
SetLookAtPosition(Vector3) |
Глаза/голова смотрят на точку. |
SetLookAtWeight(float lookAtWeight, ...) |
Плавное управление: bodyWeight, headWeight, eyesWeight, clampWeight, clampBody. |
SetIKPositionWeight(AvatarIKGoal, float) |
Вес влияния IK (0 — выкл, 1 — полный). |
Требования:
- Только для
AvatarсHumanoidrig.- Вызывать только внутри
OnAnimatorIK.Animator.updateMode = AnimatePhysics, если IK связан с физикой.
Animation (устаревшая система)
| Свойство | Описание |
|---|---|
clip |
Текущий AnimationClip. |
playAutomatically |
Автопроигрывание при старте. |
wrapMode |
Once, Loop, PingPong, ClampForever. |
animatePhysics |
Обновление в FixedUpdate. |
| Метод | Описание |
|---|---|
Play(string) |
Запуск клипа (по имени). |
CrossFade(string, float fadeLength) |
Плавный переход. |
Blend(string, float targetWeight, float fadeLength) |
Наложение нескольких клипов (additive). |
⚠️ Рекомендация: избегать в новых проектах —
Animatorпредпочтителен.
2. ScriptableObject
Назначение
- Хранение данных, независимых от сцены и экземпляров GameObject.
- Конфигурации, таблицы уровней, инвентарь, локализация, настройки баланса.
Создание и управление
| Действие | Способ |
|---|---|
| Создание asset | [CreateAssetMenu(fileName = "data.asset", menuName = "Данные/MyData")] → ПКМ в Project. |
| Загрузка | Resources.Load<T>, Addressables.LoadAssetAsync<T>, AssetDatabase.LoadAssetAtPath<T> (только в редакторе). |
| Инстанцирование | ScriptableObject.CreateInstance<T>() (временный объект, не сохраняется). |
| Сохранение | AssetDatabase.CreateAsset(so, path) (редактор), EditorUtility.SetDirty(so) перед AssetDatabase.SaveAssets(). |
Свойства и методы
| Элемент | Описание |
|---|---|
hideFlags |
HideFlags.DontSave, HideInHierarchy и др. — управление видимостью. |
OnEnable() |
Вызывается при загрузке asset (аналог Awake для MonoBehaviour). |
OnValidate() |
В редакторе — при изменении в инспекторе. |
Reset() |
В редакторе — при сбросе до значений по умолчанию. |
Паттерны использования
| Паттерн | Описание |
|---|---|
| Данные-Driven Проектирование | Все параметры геймплея — в ScriptableObject. |
| Polymorphic References | Базовый класс [Serializable], наследники — [CreateAssetMenu]. |
| Event Channels | ScriptableObject как event bus (без UnityEvent, для loose coupling). |
| Editor-Only Данные | [HideInInspector] + [SerializeField] для временных данных в редакторе. |
⚠️ Важно:
ScriptableObject— не сериализуется черезJsonUtilityпо умолчанию (нетISerializationCallbackReceiver).- При использовании
Addressables— назначайтеAddressявно (иначе asset может быть выгружен).- Избегайте ссылок на
MonoBehaviourвнутриScriptableObject— это нарушает чистоту данных.
3. Ключевые пакеты
Input System (com.unity.inputsystem)
Архитектура
- Input Action Asset (
.inputactions) — описание действий (action,binding,composite). - Input System UI Input Module — интеграция с
EventSystem. - Input Debugger — окно для мониторинга (Window > Input Debugger).
Типы привязок
| Binding | Пример | Описание |
|---|---|---|
<Gamepad>/leftStick |
Ось | 2D вектор. |
<Keyboard>/space |
Кнопка | press, hold, release. |
<Mouse>/position |
Позиция | Экранные координаты. |
*/{PrimaryAction} |
Composite | Универсальная привязка (A на геймпаде, ЛКМ, Space). |
Режимы обработки
| Режим | Описание |
|---|---|
| Polling | action.ReadValue<T>() — опрос в Update. |
| Events | action.performed += ctx => { } — события при срабатывании. |
| Control schemes | Разные схемы ввода (клавиатура / геймпад) через PlayerInput и InputActionAsset. |
Производительность
PlayerInputкомпонент —Send Messages(устаревший),Invoke Unity Events,Call Events.InputActionAsset.Enable()— активирует все действия.Disable()— деактивирует.- В сборке:
Player Settings > Active Input Handling = Input System (New).
Addressables (com.unity.addressables)
Основные команды
| Команда | Описание |
|---|---|
Addressables.LoadAssetAsync<T>(key) |
Асинхронная загрузка. |
Addressables.InstantiateAsync(key, parent, ...) |
Создание экземпляра с правильным управлением ссылками. |
Addressables.Release(object) |
Счётчик ссылок — объект удаляется при refCount = 0. |
Addressables.ClearDependencyCacheAsync() |
Очистка кэша зависимостей. |
Типы ключей
| Ключ | Формат | Примечания |
|---|---|---|
| Address | string |
Уникальная строка (задаётся в инспекторе). |
| Label | string |
Группировка (platform:Android, lang:ru). |
| Asset GUID | GUID |
Внутренний идентификатор. |
| AssetReference | AssetReference |
Сериализуемая ссылка (в инспекторе — drag & drop). |
Build и настройки
| Настройка | Описание |
|---|---|
Build Path |
LocalBuildPath, RemoteBuildPath (для CDN). |
Bundle Mode |
Pack Together, Pack Separately, No Bundles (режим кэширования). |
Compression |
LZ4, LZMA, Uncompressed. LZ4 — баланс скорости/размера. |
⚠️ Важно:
Addressables.InitializeAsync()должен завершиться до первогоLoadAsset.- В редакторе:
Addressables > Groups > Build > New Build > Default Build Script.- Избегайте
Addressables.LoadAsset<GameObject>— лучше загружатьAssetReferenceиInstantiate.
URP (Universal Render Pipeline)
Core Settings (UniversalRenderPipelineAsset)
| Параметр | Описание |
|---|---|
Rendering Path |
Forward, Deferred (только с DepthNormals и MotionVectors). |
Color Rendering |
HDR, MSAA, Color Grading LUT Size. |
Shadows |
Max Distance, Cascades, Depth Bias, Normal Bias, Soft Shadows. |
Post-processing |
Post-pipeline, After Opaque, Before Transparent — порядок. |
Renderer Features |
Кастомные pass’ы (Outline, Custom SSAO, Decals). |
Render Features (часто используемые)
| Feature | Назначение |
|---|---|
| Render Objects | Рендер одних объектов поверх других (например, outline через depth bias). |
| Render Profiling | Визуализация затрат (overdraw, depth, albedo). |
| Decal Projector | Наклейки на геометрию (требует Decal Renderer Feature). |
HDRP (High Definition Render Pipeline)
Key Differences и URP
| Аспект | HDRP |
|---|---|
| Lighting | Physically Based (lux, lumens), Area lights realtime (GPU). |
| Volumetrics | Volumetric fog, clouds, god rays. |
| Decals | Native support (material-based). |
| Ray Tracing | DXR/Vulkan RT: reflections, shadows, GI, AO. |
| Custom Passes | FullScreen, Before Opaque, After Post-processing, After Opaque And Sky. |
Frame Settings
| Группа | Параметры |
|---|---|
| Lighting | Screen Space Reflection, Ray Tracing, Light Layers. |
| Rendering | Motion Vectors, Subsurface Scattering, Distortion. |
| Post-processing | Depth of Field, Bloom, Lens Flare, Tonemapping (ACES, Neutral). |
⚠️ Требования:
- GPU: DX11.1+ / Vulkan / Metal.
- Для Ray Tracing: драйверы
≥471.11 (NVIDIA), RTX 20xx+.HDAdditionalCameraData— обязательный компонент на камере.
4. Профилирование
Unity Profiler (Window > Analysis > Profiler)
Модули
| Модуль | Что измеряет |
|---|---|
| CPU Usage | Время в Update, FixedUpdate, рендер, физика. |
| Memory | GC.Alloc, managed heap, native memory, assets. |
| Rendering | Draw calls, batches, set pass calls, shader variants. |
| Physics | FixedUpdate time, contact pairs, CCD checks. |
| Audio | Голоса, DSP load, mixer bus load. |
| UI | Canvas.BuildBatch, Graphic.Rebuild, input events. |
| Video | Декодирование, синхронизация. |
| Global Illumination | Light probe updates, reflection probes. |
Hot Path Analysis
- Self ms — время в методе без учёта вызовов.
- Total ms — с учётом вызовов.
- Правый клик → Add Bookmark — фиксация baseline.
GC.Collect()вручную — для проверки пиков GC.
Frame Debugger (Window > Analysis > Frame Debugger)
| Функция | Описание |
|---|---|
| Step Through | Пошаговое выполнение draw call’ов. |
| Shader Variant | Просмотр конкретного шейдера (pass, keywords). |
| State Changes | SetPass, SetTexture, SetFloat — источники overhead. |
| Occlusion Culling | Проверка, какие объекты отсекаются. |
Memory Profiler (отдельный пакет)
| Отчёт | Содержание |
|---|---|
| Managed Memory | Объекты в managed heap, roots, GC pressure. |
| Native Memory | Texture2D, Mesh, AudioClip в native memory. |
| Asset Memory | Размер AssetBundle, Resources.UnloadUnusedAssets() эффект. |
| Compare Snapshots | Утечки: объекты, появившиеся между снимками. |
Rendering Debugger (URP/HDRP)
| Вкладка | Инструменты |
|---|---|
| Lighting | Light overlap, probe visualization, GI cache. |
| Material | Albedo, specular, smoothness override. |
| Post-processing | Bloom, DoF, motion vectors. |
| Custom Passes | Визуализация custom render features. |
⚠️ Советы:
- В релизе:
Разработка Build + Autoconnect Profiler→ профилирование на устройстве.- Избегайте
Debug.Logв hot paths — это allocation + I/O.- Используйте
Profiler.BeginSample("MyCode")/EndSample()для кастомных маркеров.
5. Сборка и дистрибуция
Build Settings (File > Build Settings)
| Платформа | Особенности |
|---|---|
| PC, Mac, Linux Standalone | Target Architecture: x86, x86_64, Universal. IL2CPP only for 64-bit. |
| Android | Scripting Backend: IL2CPP (required for 64-bit), Target API Level, Min API Level, Split Application Binary. |
| iOS | Target SDK: Device SDK, Architecture: ARM64, Strip Engine Code. Bitcode устарел (Apple не требует с 2023 г.). |
| WebGL | Compression Format: Brotli (best), Gzip, Disabled; Memory Size: 256–512 MB. |
IL2CPP
| Настройка | Описание |
|---|---|
Engine Code Stripping |
Удаление неиспользуемых классов движка (осторожно с reflection). |
Managed Stripping Level |
Low → High — удаление API (System.Reflection.Emit, CultureInfo и др.). |
Debug Symbols |
Включение *.pdb / *.map для crash reporting. |
Incremental GC |
Уменьшает паузы GC (URP/HDRP recommended). |
AOT (Ahead-of-Time Compilation)
| Платформа | Поддержка |
|---|---|
| iOS, WebGL, Consoles | Обязательно (JIT запрещён). |
| Android (IL2CPP) | Да. |
| Windows (IL2CPP) | Опционально. |
⚠️ Проблемы AOT:
- Generic virtual methods — могут не компилироваться (требуется
Preserveатрибут илиlink.xml).- Reflection — только на типах/методах, упомянутых в коде или
link.xml.
Symbolication (Crash Reporting)
| Формат | Где взять |
|---|---|
| Windows | Game_Data/Managed/Game.pdb |
| Android | Game_Data/Native/ + split_symbols (при включённых symbols) |
| iOS | dSYM папка (в Build при Debug Symbols = true) |
| WebGL | Game.wasm.map |
link.xml (для IL2CPP)
<linker>
<assembly fullname="Assembly-CSharp">
<type fullname="MyNamespace.MyClass" preserve="all"/>
<namespace fullname="MyNamespace.Utilities" preserve="methods"/>
</assembly>
<assembly fullname="System.Core">
<type fullname="System.Linq.Enumerable" preserve="methods"/>
</assembly>
</linker>
Расположение:
Assets/link.xml(автоматически обрабатывается при сборке).
Блок 4. Высокопроизводительные системы, графы, динамическая загрузка, безопасность
1. Job System и Burst Compiler
Архитектура Job System
| Компонент | Описание |
|---|---|
| Job | Единица работы: реализует IJob, IJobParallelFor, IJobChunk и др. |
| NativeContainer | NativeArray<T>, NativeList<T>, NativeHashMap<K,V> — память вне managed heap. |
| Dependency Graph | JobHandle — управление порядком выполнения (CombineDependencies, Schedule, Complete). |
| Safety System | Проверка aliasing: один NativeArray не может быть записан в нескольких job’ах одновременно. |
Типы Job’ов
| Интерфейс | Сигнатура | Применение |
|---|---|---|
IJob |
void Execute() |
Однопоточная задача. |
IJobParallelFor |
void Execute(int index) |
Параллельный цикл (0..length-1). |
IJobParallelForTransform |
void Execute(int index, TransformAccess transform) |
Параллельная работа с Transform (через TransformAccessArray). |
IJobChunk |
void Execute(ArchetypeChunk chunk, int chunkIndex, int firstEntityIndex) |
Работа с чанками (только в ECS). |
IJobEntity |
[BurstCompile] void Execute(ref T0 c0, ...) |
ECS-only, высокоуровневый Entities.ForEach. |
NativeArray<T> — ключевые параметры
| Параметр | Значения | Описание |
|---|---|---|
Allocator |
Temp (1 frame), TempJob (4 frames), Persistent |
Управление временем жизни. |
NativeArrayOptions |
UninitializedMemory, ClearMemory |
Инициализация содержимого. |
ReadOnly / ReadWrite |
Атрибуты: [ReadOnly], [WriteOnly] |
Указание намерения — разрешает параллелизм. |
Пример — IJobParallelFor
⚠️ Требования Burst:
- Только подмножество C# — нет исключений,
virtual,interface,reflection,string,managed types.- Поддержка
math(Unity.Mathematics) —float3,quaternion, SIMD.#if BURST_COMPILE— условная компиляция.
Safety System — отключение
| Способ | Опасность | Применение |
|---|---|---|
NativeArray<T>.GetUnsafePtr() |
Нет проверок | Только в [BurstCompile] job’ах. |
JobsUtility.DisableJobCompilerSafetyChecks |
Отключает все проверки | Только в release-сборках, после полного тестирования. |
2. ECS (Entities Package, версия 1.0+)
Ядро — World, EntityManager, Entity
| Элемент | Описание |
|---|---|
World |
Контейнер для систем и данных. World.DefaultGameObjectInjectionWorld — основной. |
EntityManager |
Фабрика и менеджер Entity. Доступ: world.EntityManager. |
Entity |
64-битный идентификатор (Index, Version). Не содержит данных — только ключ. |
ComponentType |
Описание типа компонента: ComponentType.ReadOnly<T>(), ComponentType.Exclude<T>(). |
Archetype |
Комбинация типов компонентов. Все Entity с одинаковым набором — в одном archetype. |
Chunk |
Блок памяти (обычно 16 КБ), хранит несколько Entity одного archetype. |
Создание сущностей
| Метод | Описание |
|---|---|
EntityManager.CreateEntity(ComponentType[]) |
Создать Entity с заданными компонентами. |
EntityManager.Instantiate(Entity) |
Клонирование (только структурные компоненты). |
EntityManager.SetComponentData<T>(Entity, T) |
Установка значения компонента. |
EntityManager.AddComponentData<T>(Entity, T) |
Добавление компонента со значением. |
EntityManager.RemoveComponent<T>(Entity) |
Удаление компонента (изменяет archetype). |
Системы
| Базовый класс | Особенности |
|---|---|
SystemBase |
Современный подход: OnUpdate(), Entities.ForEach(...). |
JobComponentSystem |
Устаревший: OnUpdate() → JobHandle. |
ComponentSystem |
Без job’ов (только для инициализации). |
Entities.ForEach (SystemBase)
protected override void OnUpdate()
{
float deltaTime = Time.DeltaTime;
Entities
.WithName("Movement")
.WithBurst(FloatMode.Default, FloatPrecision.Standard, true)
.ForEach((ref Translation pos, in Velocity vel) =>
{
pos.Value += vel.Value * deltaTime;
})
.ScheduleParallel(); // или .Run()
}
| Модификатор | Эффект |
|---|---|
.WithNativeDisableParallelForRestriction() |
Разрешает запись в shared NativeArray. |
.WithReadOnly(component) |
Чтение без блокировки. |
.WithStructuralChanges() |
Разрешает добавление/удаление компонентов (только .Run()). |
.WithDisposeOnCompletion(array) |
Авто-Dispose NativeArray после job’а. |
Shared Component и Buffer
| Тип | Описание |
|---|---|
ISharedComponentData |
Значение разделяется между Entity (например, Material). Изменение — копирование archetype. |
IBufferElementData |
Динамический массив на Entity (например, WeaponAmmo). Доступ: EntityManager.GetBuffer<T>(entity). |
3. Shader Graph и VFX Graph
Shader Graph (URP/HDRP)
Типы шейдеров
| Тип | Назначение |
|---|---|
| Unlit | Без освещения (UI, particles). |
| Lit | Стандартное PBR-освещение. |
| Transparent | Алгоритмы blending: Alpha, Premultiply, Additive, Multiply. |
| 2D | Sprite-специфичные: Sprite, Sprite Lit, Sprite Unlit. |
Ключевые ноды
| Группа | Ноды |
|---|---|
| Input | Time, Screen Position, Object Position, Tiling & Offset, Properties (Vector2, Texture, Color). |
| Math | Add, Multiply, Power, Sine, Step, Smoothstep, Lerp. |
| Vector | Normalize, Cross Product, Dot Product, Transform. |
| UV | Tiling And Offset, Mirror, Rotate, Polar Coordinates. |
| Procedural | Noise, Gradient, Checkerboard, Voronoi. |
| Lighting | Main Light, Additional Lights, Vertex Normal, World Space Reflections. |
Параметры шейдера (в инспекторе)
| Параметр | Описание |
|---|---|
Surface |
Opaque, Transparent. |
Blend Mode |
Alpha, Additive, Multiply, Premultiply. |
Culling |
Off, Front, Back. |
Queue Offset |
Смещение render queue (Geometry+100 = 2500+100). |
Two Sided |
Отключение backface culling. |
Depth Write |
Запись в depth buffer (отключать для transparent). |
VFX Graph (HDRP / URP с VFX Feature)
Архитектура
| Блок | Описание |
|---|---|
| Context | Spawn, Initialize, Update, Output. |
| Block | Add Velocity, Apply Force, Collision, Color Over Life. |
| Operator | Add, Multiply, Sample Texture, Noise. |
| Event | Collision Event, Trigger Event — реакция на события. |
Типы систем
| Тип | Особенности |
|---|---|
| GPU | Выполняется на GPU (миллионы частиц). Требует VFXRenderer. |
| CPU | Для сложной логики (colliders, events). Макс. ~10k частиц. |
Интеграция с кодом
VFXEventAttribute attr = vfxSystem.CreateVFXEventAttribute();
attr.SetFloat("Speed", 5.0f);
attr.SetVector3("Direction", transform.forward);
vfxSystem.SendEvent("Spawn", attr);
vfxSystem.SetFloat("GlobalIntensity", 0.8f); // глобальный параметр
⚠️ Требования:
- В URP:
Renderer Features > VFX Renderer.- Текстуры:
VFXLit,VFXUnlit— специальные шейдеры частиц.- Для GPU-частиц:
VFX Property Binder— связь сTransform,SkinnedMeshRenderer.
4. Asset Bundles
Сборка
| Команда | Описание |
|---|---|
BuildPipeline.BuildAssetBundles(outputPath, BuildAssetBundleOptions, BuildTarget) |
Основной метод. |
AssetBundleBuild |
Пакетная сборка: assetBundleName, assetNames, assetBundleVariant. |
BuildAssetBundleOptions
| Флаг | Эффект |
|---|---|
None |
Без сжатия. |
UncompressedAssetBundle |
Не сжимать (быстрая загрузка, большой размер). |
DisableWriteTypeTree |
Уменьшает размер, но ломает обратную совместимость. |
StrictMode |
Ошибка при циклических зависимостях. |
DeterministicAssetBundle |
Одинаковый хеш при одинаковом содержимом. |
ChunkBasedCompression |
LZ4 (быстрее LZMA, размер +~30%). |
Загрузка
| Метод | Описание |
|---|---|
AssetBundle.LoadFromFileAsync(path) |
Быстро — memory-mapped. |
AssetBundle.LoadFromMemoryAsync(byte[]) |
Для скачанных данных. |
AssetBundle.LoadAssetAsync<T>(name) |
Асинхронная загрузка ассета. |
AssetBundle.Unload(bool unloadAllLoadedObjects) |
true — выгрузить и ассеты, false — только bundle. |
Кэширование (для онлайн-загрузки)
| API | Описание |
|---|---|
Caching.ClearCache() |
Очистка всего кэша. |
Caching.ClearAllCachedVersions(key) |
Удаление старых версий. |
UnityWebRequest.GetAssetBundle(url, hash, crc) |
Автоматическое кэширование через Caching. |
⚠️ Практика:
- Всегда вызывайте
AssetBundle.Unload(false)после загрузки ассетов — освобождает bundle, оставляя ассеты.- Для hot reload:
Resources.UnloadUnusedAssets()+GC.Collect().AssetBundle.mainAsset— устаревшее; используйте явное имя.
5. Безопасность
Обфускация кода
| Инструмент | Возможности |
|---|---|
| Obfuscator (Unity) | Базовая переименовка (встроен в IL2CPP при Engine Code Stripping). |
| Babel Obfuscator, Dotfuscator | Полная обфускация: renaming, control flow, string encryption, anti-debug. |
| ConfuserEx | Open-source; поддержка Unity (только managed assemblies). |
Ограничения:
- IL2CPP конвертирует C# → C++ → native, что затрудняет reverse engineering.
- Burst-скомпилированный код — машинный, без метаданных.
Защита от читов
| Уровень | Меры |
|---|---|
| Клиент | Валидация входных данных, Time.unscaledDeltaTime для анти-таймчейт, Debug.isDebugBuild guard. |
| Сетевой | Серверная валидация (координаты, скорости), signed RPC, server-authoritative state. |
| Память | SecurePlayerPrefs (шифрование), Unity.MemoryProfiler для поиска memory editors. |
Secure Storage
| API | Описание |
|---|---|
PlayerPrefs |
Не безопасен — хранится в открытом виде (registry / plist / shared_prefs). |
| Unity Encrypted PlayerPrefs | Пакет com.unity.nuget.mono-cecil + AES-256 (community solutions). |
| Native Plugins | Keychain (iOS), Keystore (Android), DPAPI (Windows) — через C++ plugin. |
| PlayFab | Cloud Script + Player Данные с encryption at rest. |
Анти-отладка
| Приём | Реализация |
|---|---|
| Проверка отладчика | #if !UNITY_EDITOR && UNITY_STANDALONE_WIN → CheckRemoteDebuggerPresent. |
| Integrity Check | Хеш сборки (Application.version, crc) → сравнение с сервером. |
| Tamper Detection | Проверка Assembly.GetExecutingAssembly().Location на изменение. |
⚠️ Реалистично:
- Полная защита невозможна — цель: повысить стоимость взлома.
- Критичные данные (ключи, баланс) — только на сервере.
- Используйте
DOTNET_DEFAULT_DICTIONARY_CAPACITY=0вboot.configдля уменьшения метаданных.
Блок 5. UI, Локализация, Тестирование, Облако, Экстеншены редактора
1. UI Toolkit
Архитектура
| Компонент | Описание |
|---|---|
| UXML | Декларативное описание UI (аналог HTML). Расширение .uxml. |
| USS | Стилизация (аналог CSS). Расширение .uss. Поддержка классов, псевдоклассов, :hover, :focus. |
VisualElement |
Базовый класс всех UI-элементов. Аналог GameObject в UI иерархии. |
PanelSettings |
Настройки рендерера: scaleMode, referenceResolution, renderMode (WorldSpace, ScreenSpaceOverlay, ScreenSpaceCamera). |
UIDocument |
Компонент для привязки UXML/USS к GameObject (в сцене). |
UXML — синтаксис
<UXML xmlns:ui="UnityEngine.UIElements" xmlns:engine="UnityEditor.UIElements">
<ui:Label text="Score:" class="header" />
<ui:Box name="score-container">
<ui:Label name="score-value" text="0" />
</ui:Box>
<ui:Button text="Restart" name="restart-btn" />
</UXML>
| Атрибут | Назначение |
|---|---|
class |
CSS-класс (множественные: "btn primary"). |
name |
Уникальный идентификатор (для поиска через root.Q<Label>("score-value")). |
picking-mode |
Position, Ignore — влияет на клики. |
style |
Inline-стили (избегать — нарушает разделение слоёв). |
USS — ключевые правила
| Правило | Поддержка |
|---|---|
flex-direction, justify-content, align-items |
Полная (Flexbox). |
unity-text-outline-color, unity-text-outline-width |
Outline текста. |
unity-background-image |
Текстура фона (только VisualElement, не Label). |
--property-name |
CSS-переменные (через style.SetProperty("--prop", "value") в коде). |
Runtime API
| Класс/Метод | Описание |
|---|---|
VisualTreeAsset.CloneTree() |
Создание экземпляра из .uxml. |
root.Q<T>(name, className) |
Поиск элемента по name и/или class. |
element.Add(child) / element.Remove(child) |
Изменение иерархии. |
element.ToggleInClassList("active") |
Переключение CSS-класса. |
element.RegisterCallback<ClickEvent>(evt => { }) |
Обработка событий. |
element.Bind(new SerializedObject(target)) |
Привязка к ScriptableObject/MonoBehaviour. |
Binding (UI Toolkit + SerializedObject)
// В UXML: <ui:Label binding-path="health" text="${health}"/>
var so = new SerializedObject(playerStats);
document.rootVisualElement.Bind(so);
so.Update(); // перед изменением
playerStats.health = 75;
so.ApplyModifiedProperties(); // обновляет UI
| Binding Type | Синтаксис |
|---|---|
| Simple | ${propertyName} |
| With Format | ${propertyName:0.00} (требует SmartFormat integration) |
| Nested | ${inventory.items.Array.data[0].name} |
⚠️ Важно:
UIDocument.panelSettingsдолжен быть назначен.- В runtime:
UIDocument.component.gameObject.SetActive(false)не останавливает рендеринг — используйтеdocument.rootVisualElement.style.display = DisplayStyle.None.IMGUIContainer— для встраивания legacy UI (избегать в новых проектах).
2. Localization (com.unity.localization)
Архитектура
| Элемент | Описание |
|---|---|
Locale |
Язык + регион (en, ru-RU, zh-Hans). Добавляется в Localization Settings. |
String Table (String Table Collection) |
Коллекция строк: Table Name, Entry Id, Key, Value. |
Term |
Плейсхолдер: {PlayerName}, {ItemCount} — для динамических строк. |
Localized String |
Компонент для GameObject: Table Reference, Table Entry Reference, Format Arguments. |
Smart |
Расширение форматирования: pluralization, gender, conditional. |
SmartFormat — синтентаксис
"Вы собрали {ItemCount:plural:zero=ничего|one=1 предмет|few={ItemCount} предмета|many={ItemCount} предметов|other={ItemCount} предметов}."
Runtime API
// Получение строки
var table = LocalizationSettings.StringDatabase.GetTable("GameText");
string text = table.GetEntry("WELCOME_MESSAGE").Format("Player1");
// Смена локали
await LocalizationSettings.Instance.SetLocaleAsync(locale);
// События
LocalizationSettings.SelectedLocaleChanged += OnLocaleChanged;
| Настройка | Расположение |
|---|---|
Localization Settings |
Project Settings > Localization |
Asset References |
String Table → Asset Table (для спрайтов, аудио) |
Google Sheets Sync |
Требует com.unity.localization.google-sheets |
⚠️ Производительность:
- Кэшируйте
LocalizedString.GetLocalizedString()— повторные вызовы с теми же аргументами не аллоцируют.- Избегайте
LocalizedString.GetLocalizedString()вUpdate— используйтеOnLocaleChanged.
3. Test Framework (com.unity.test-framework)
Типы тестов
| Тип | Атрибут | Выполняется | Особенности |
|---|---|---|---|
| EditMode | [Test] |
Вне игрового цикла | Быстро, доступ к private/protected, Editor assemblies. |
| PlayMode | [UnityTest] |
Внутри PlayMode |
Доступ к GameObject, MonoBehaviour, Time. |
| Performance | [PerformanceTest] |
В PlayMode | Метрики: GC, FPS, duration. |
Жизненный цикл
| Атрибут | Вызывается |
|---|---|
[OneTimeSetUp] |
Один раз перед всеми тестами в классе |
[SetUp] |
Перед каждым тестом |
[TearDown] |
После каждого теста |
[OneTimeTearDown] |
Один раз после всех тестов |
Assertion API
| Метод | Пример |
|---|---|
Assert.AreEqual(expected, actual) |
Assert.AreEqual(42, result) |
Assert.IsTrue(condition) |
Assert.IsTrue(obj.activeSelf) |
Assert.Throws<T>(code) |
Assert.Throws<ArgumentNullException>(() => method(null)) |
LogAssert.Expect(LogType.Warning, "message") |
Проверка логов |
yield return new WaitForSeconds(1f) |
В [UnityTest] |
Performance Testing
[PerformanceTest]
public IEnumerator Movement_Speed()
{
var obj = new GameObject().AddComponent<Rigidbody>();
yield return Measure.Frames()
.WarmupCount(10)
.MeasurementCount(50)
.Run(() =>
{
obj.AddForce(Vector3.forward);
});
}
| Метрика | Единица |
|---|---|
GC.Alloc |
байты |
Duration |
секунды |
FrameCount |
кадры |
FPS |
frames per second |
⚠️ Практика:
EditModeтесты — для pure-логики, алгоритмов, serialization.PlayMode— для интеграции с движком.- В CI:
Unity.exe -runTests -testPlatform EditMode -logFile -→ вывод в stdout.
4. Cloud Services
Unity Cloud Build (UCB)
| Настройка | Описание |
|---|---|
| Targets | Android_Development, iOS_Release — комбинация platform + config. |
| Build Hooks | preBuild.sh, postBuild.sh — скрипты на агенте. |
| Variables | UNITY_USERNAME, UNITY_PASSWORD — для license activation. |
| Artifacts | .apk, .ipa, .zip — доступны по URL или через API. |
Plastic SCM (Unity Version Control)
| Команда CLI | Описание |
|---|---|
cm checkout /main@rep:project |
Переключение на ветку. |
cm add . |
Добавление новых файлов. |
cm checkin -c "message" |
Коммит. |
cm merge /main@rep:project |
Слияние. |
cm cloud sync |
Синхронизация с облаком. |
.plasticignore |
Пример |
|---|---|
*.meta |
Library/ |
Temp/ |
UserSettings/ |
Unity Services Dashboard
| Сервис | Назначение |
|---|---|
| Analytics | События: customEvent, transaction, userAttribute. |
| Remote Settings | Динамические параметры: float, string, bool. |
| Authentication | Anonymous, Apple, Google, Custom. |
| Cloud Code | JavaScript-функции на сервере (аналог Cloud Script). |
| Economy | Валюты, предметы, баланс. |
⚠️ Миграция:
Unity Analytics→Unity Gaming Services (UGS).Unity IAP— теперь частьUnity Monetization.Unity AdsиUnity LevelPlay— объединены вUnity Ads Monetization.
5. Editor Scripting
EditorWindow
public class MyWindow : EditorWindow
{
[MenuItem("Tools/My Window")]
public static void ShowWindow() => GetWindow<MyWindow>("My Tool");
private void OnGUI()
{
if (GUILayout.Button("Process"))
Process();
}
private void OnInspectorUpdate() => Repaint(); // автообновление
}
| Метод | Вызов |
|---|---|
OnGUI() |
При перерисовке окна. |
OnEnable() |
При открытии/фокусе. |
OnDisable() |
При закрытии/потере фокуса. |
OnInspectorUpdate() |
Каждые 0.1s (по умолчанию). |
CustomEditor
[CustomEditor(typeof(PlayerStats))]
public class PlayerStatsEditor : Editor
{
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(serializedObject.FindProperty("health"));
serializedObject.ApplyModifiedProperties();
}
}
| Метод | Применение |
|---|---|
OnSceneGUI() |
Рисование в сцене (handles, gizmos). |
OnPreviewGUI() |
Превью в инспекторе (для ScriptableObject). |
RequiresConstantRepaint() |
return true — постоянный Repaint(). |
PropertyDrawer
[CustomPropertyDrawer(typeof(RangeFloat))]
public class RangeFloatDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
var minProp = property.FindPropertyRelative("min");
var maxProp = property.FindPropertyRelative("max");
EditorGUI.MinMaxSlider(position, label, minProp, maxProp, 0f, 100f);
}
}
Build Pipeline (Callbacks)
| Интерфейс | Фаза |
|---|---|
IPreprocessBuildWithReport |
До сборки |
IProcessSceneWithReport |
После обработки сцены (lightmapping, stripping) |
IPostprocessBuildWithReport |
После сборки |
IOrderedCallback |
Управление порядком (callbackOrder) |
⚠️ Практика:
- Все editor-скрипты — в папке
Editor/.Undo.RecordObject(target, "Change")— для отмены действий.EditorUtility.DisplayProgressBar()— прогресс длительных операций.
Блок 6. Мобильные, Сети, Оптимизация, Интеграции, CI/CD
1. Мобильная разработка
Player Settings (Android)
| Категория | Параметр | Описание |
|---|---|---|
| Other Settings | Bundle Identifier |
com.company.game — должен быть уникальным. |
Version / Bundle Version Code |
1.0.0 / 100 — версия отображаемая / внутренний инкремент. |
|
Minimum API Level |
Android 5.0 (API level 21) — минимум для IL2CPP. |
|
Target API Level |
Automatic / API level 34 (Android 14) — для Google Play (требуется ≥ 33 с 2024 г.). |
|
Scripting Backend |
IL2CPP (обязательно для 64-bit). |
|
Target Architectures |
ARM64 (обязательно), ARMv7 (опционально). |
|
| Publishing Settings | Keystore |
Create New / Use Existing — release signing. Debug: debug.keystore. |
Build |
Internal (монолитный APK), Gradle (рекомендуется), ADT (устарело). |
|
Split Application Binary |
Enable → base.apk + UnityData (для >100 МБ). |
Player Settings (iOS)
| Параметр | Описание |
|---|---|
Target SDK |
Device SDK (release), Simulator SDK (debug). |
Architecture |
ARM64 (обязательно), ARM64 + Simulator (для тестирования в Xcode). |
Strip Engine Code |
Удаляет неиспользуемые модули движка (экономия 20–50 МБ). |
Bitcode |
Disabled (Apple не требует с 2023 г.). |
Camera Usage Description |
Обязательно, если используется камера (иначе rejection в App Store). |
Supported URL Schemes |
Для deep linking: mygame://. |
Permissions (Android)
| Permission | Где объявить | Runtime? |
|---|---|---|
INTERNET |
AndroidManifest.xml (автоматически при Networking) |
Нет |
WRITE_EXTERNAL_STORAGE |
Player Settings > Publishing > Custom Main Gradle Template |
Да (Android 6.0+) |
VIBRATE |
AndroidManifest.xml |
Нет |
ACCESS_FINE_LOCATION |
Через plugin или Plugins/Android/AndroidManifest.xml |
Да |
Пример runtime-запроса (Android):
if (!Permission.HasUserAuthorizedPermission(Permission.FineLocation))
Permission.RequestUserPermission(Permission.FineLocation);
Deep Linking
| Платформа | Реализация |
|---|---|
| Android | AndroidManifest.xml: |
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<Данные android:scheme="mygame" android:host="open" />
</intent-filter>
Обработка: Application.absoluteURL → OnApplicationFocus(true). |
| iOS | Info.plist:
<key>CFBundleURLTypes</key>
<array>
<dict><key>CFBundleURLSchemes</key><array><string>mygame</string></array></dict>
</array>
Обработка: AppDelegate → UnityAppController → Application.absoluteURL. |
⚠️ Важно:
- На iOS:
LSApplicationQueriesSchemes— если открываете другие приложения (whatsapp://,tg://).Application.absoluteURLвозвращаетnull, если игра запущена не из ссылки.
2. Сетевые решения
Unity Transport (com.unity.transport)
| Компонент | Описание |
|---|---|
UnityTransport |
Транспортный уровень: UDP (на основе Netcode.Transports). |
| Protocols | UNET (устарело), Ruffles (новый, с congestion control). |
| Channels | ReliableSequenced, Unreliable, UnreliableSequenced. |
| Connection Approval | Серверная валидация подключения (токены, bans). |
Netcode for GameObjects (com.unity.netcode.gameobjects)
| Понятие | Описание |
|---|---|
NetworkObject |
Компонент на GameObject: Spawn With Scene, Destroy With Scene. |
NetworkVariable<T> |
Синхронизируемая переменная: ReadPermission, WritePermission, OnValueChanged. |
Rpc |
[ServerRpc], [ClientRpc] — remote procedure calls. Поддержка Delivery (Reliable/Unreliable). |
NetworkBehaviour |
Базовый класс: IsServer, IsClient, IsLocalPlayer, OwnerClientId. |
Пример
NAT Traversal
| Метод | Описание |
|---|---|
| Relay Server | Unity Relay (UGS) — сервер-посредник (STUN/TURN). |
| UPnP | Автоматическое пробрасывание портов (ненадёжно). |
| Manual Port Forwarding | Указание порта в настройках роутера. |
| Connection Approval Token | Защита от подделки: JWT, подписанный сервером. |
⚠️ Ограничения:
NetworkVariable<T>поддерживает толькоINetworkSerializableтипы —int,float,FixedString,NetworkList<T>.ClientRpcбезTargetрассылается всем клиентам — избегайте в hot paths.NetworkSceneManager— для загрузки сцен —LoadScene,UnloadScene,ClientSynchronizationMode.
3. Оптимизации
Static Batching
| Условие | Требования |
|---|---|
Static flag |
GameObject должен быть Static (в инспекторе). |
| Одинаковый материал | Все объекты — один Material. |
| Не анимированы | Нет скелетной анимации, morph targets. |
Результат: объединение в один mesh при сборке. В редакторе:
Window > Analysis > Frame Debugger→StaticBatcher.Combine.
GPU Instancing
| Условие | Требования |
|---|---|
| Одинаковый mesh/material | Все инстансы — один Mesh + Material. |
Enable GPU Instancing |
В инспекторе материала (URP/HDRP: GPU Instancing). |
| Поддержка шейдера | #pragma multi_compile_instancing, UNITY_INSTANCING_BUFFER_START. |
| Метод | Описание |
|---|---|
Graphics.DrawMeshInstanced(mesh, submeshIndex, material, ...) |
Ручной вызов (до 1023 инстансов). |
Graphics.DrawMeshInstancedIndirect(...) |
Через compute buffer (миллионы). |
Texture Atlasing
| Инструмент | Описание |
|---|---|
| Sprite Atlas (2D) | Create > Sprite Atlas → Drag sprites → Pack Preview. |
| Texture2D.PackTextures | Runtime атласинг (избегать в runtime — аллокации). |
| Shader Keywords | UNITY_TEXTURE_ALPHASPLIT_DISABLE — для alpha-split текстур. |
LOD (Level of Detail)
| Компонент | Свойства |
|---|---|
LOD Group |
LOD 0..5: Screen Relative Transition Height, Renderers. |
LOD Bias |
В Quality Settings — смещение автоматического выбора LOD. |
Culling |
Animate Physics, Cross Fade — управление переходами. |
Occlusion Culling
| Шаг | Действие |
|---|---|
| 1 | Пометить Occluder Static / Occludee Static. |
| 2 | Window > Rendering > Occlusion Culling → Bake. |
| 3 | Настройка: Smallest Occluder, Smallest Hole, Backface Threshold. |
| Результат | Просмотр в Scene View > Occlusion Culling → Visualization. |
⚠️ Советы:
- Избегайте
Mesh.CombineMeshesв runtime — используйте static batching заранее.Shader.Find("Standard")→ кэшируйте ссылки.MaterialPropertyBlock— для изменения параметров без инстансинга материала.
4. Сторонние интеграции
Firebase (com.google.firebase)
| Пакет | Назначение |
|---|---|
Firebase Analytics |
События, пользовательские параметры. |
Firebase Crashlytics |
Отчёты об ошибках (включая native crashes). |
Firebase Remote Config |
Динамические параметры (GetLong("speed")). |
Firebase Cloud Messaging |
Push-уведомления. |
Инициализация
FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
if (task.Result == DependencyStatus.Available)
FirebaseAnalytics.LogEvent("game_start");
});
Sentry (io.sentry.unity)
| Функция | Описание |
|---|---|
SentrySdk.CaptureMessage("Info") |
Логирование. |
SentrySdk.CaptureException(ex) |
Исключения. |
ConfigureScope |
Добавление тегов: scope.SetTag("level", "5"). |
BeforeSend |
Фильтрация событий. |
Discord Rich Presence
| Подход | Описание |
|---|---|
| Discord Game SDK | Нативный SDK; обёртки в Asset Store / GitHub (проверьте актуальный package id в Package Manager). |
| Rich Presence | details, state, largeImageKey — статус "в игре" в клиенте Discord. |
| Инициализация | clientId из Developer Portal; вызовы SDK — из Awake/Start, обновление — при смене уровня. |
Steamworks.NET
| Компонент | Описание |
|---|---|
SteamAPI.Init() |
Инициализация (в Awake). |
SteamUserStats.SetStat("Kills", 42) |
Статистика. |
SteamUserStats.StoreStats() |
Сохранение на сервере. |
SteamFriends.SetRichPresence("status", "In Game") |
Rich Presence. |
⚠️ Важно:
- Firebase требует
google-services.json(Android) /GoogleService-Info.plist(iOS).- Sentry:
options.Dsn = "https://...@o123456.ingest.sentry.io/123456"вSentryOptions.- Steamworks.NET:
steam_appid.txtв корне сборки (только для debug).
5. CI/CD
GitHub Actions (/.github/workflows/build.yml)
Jenkins Pipeline
Azure Pipelines (azure-pipelines.yml)
- task: UnityBuild@3
inputs:
buildTarget: 'StandaloneWindows64'
outputPath: 'build/windows'
buildMethod: 'BuildScript.BuildWindows'
Unity Builder (game-ci)
| Параметр | Описание |
|---|---|
customImage |
Кастомный Docker-образ (с Android SDK, Xcode). |
allowDirtyBuild |
Сборка при dirty working tree (только для debug). |
versioning |
None, Automatic, Custom. |
androidVersionCode |
Автоматическое увеличение: $(date +%s). |
Постобработка
| Действие | Инструмент |
|---|---|
| APK Signing | apksigner (Android), codesign (iOS). |
| ProGuard/R8 | Уменьшение размера (Android). |
| AssetBundle Upload | aws s3 cp, az storage blob upload. |
| Test Reports | nunit3 → PublishTestResults@2 (Azure). |
⚠️ Практика:
- Используйте
--no-graphicsв CI для ускорения.Unity.exe -quit -batchmode -nographics -logFile - -executeMethod BuildScript.PerformBuild.- Кэшируйте
Library/между сборками (осторожно: может вызывать артефакты).
Ошибки
| Ситуация | Что проверить |
|---|---|
| Команда не найдена | PATH, установка пакета, alias |
| Permission denied | пользователь, группа, sudo, ACL |
| Неверная версия | см. "Совместимость", --version |
В подборках
Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:
Справочники — Справочник по Roblox, Справочник по Adobe Photoshop, Справочник по Kubernetes, Справочник по Docker, Справочник по Apache Kafka, Справочник по RabbitMQ.