Справочник по Unity


Назначение

Горячие клавиши, команды и форматы Unity для ежедневной работы. Учебный курс: раздел. Готовые скрипты с построчным разбором для новичков — Unity C# — скрипты для новичков.


Краткое пояснение

Шпаргалка по Unity — таблицы синтаксиса, API, команд и параметров — для быстрого поиска фактов.


Справочные таблицы

Содержание справочника


Блок 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() — вызывается в редакторе при изменении значений в инспекторе или загрузке сцены. Не вызывается в сборке.
Типичные ошибки lifecycle
  • Физика в 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 (ComponentGameObject.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 Аппаратная анимация скелета.
LightmapsMode 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).
OptimizationManaged 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).

🧠 PhysicsPhysics 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-камер (в инспекторе).

⚠️ Важно:

  • clearFlagsSkybox, 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.

⚠️ Ограничения:

  • Area light работает только в baked режиме.
  • В URP/HDRP realtime GI заменён на Screen Space GI, SSR, или light probes.
  • shadowResolutionLow (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 NormalUpdate), AnimatePhysicsFixedUpdate), 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 с Humanoid rig.
  • Вызывать только внутри 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 Позиция Экранные координаты.
*/&#123;PrimaryAction&#125; 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 LowHigh — удаление 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_WINCheckRemoteDebuggerPresent.
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 $&#123;propertyName&#125;
With Format $&#123;propertyName:0.00&#125; (требует SmartFormat integration)
Nested $&#123;inventory.items.Array.data[0].name&#125;

⚠️ Важно:

  • 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 Плейсхолдер: &#123;PlayerName&#125;, &#123;ItemCount&#125; — для динамических строк.
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 TableAsset 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 AnalyticsUnity 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 Enablebase.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.absoluteURLOnApplicationFocus(true). | | iOS | Info.plist:

<key>CFBundleURLTypes</key>
<array>
  <dict><key>CFBundleURLSchemes</key><array><string>mygame</string></array></dict>
</array>

Обработка: AppDelegateUnityAppControllerApplication.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 DebuggerStaticBatcher.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 CullingBake.
3 Настройка: Smallest Occluder, Smallest Hole, Backface Threshold.

| Результат | Просмотр в Scene View > Occlusion CullingVisualization. |

⚠️ Советы:

  • Избегайте 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 nunit3PublishTestResults@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.