Перейти к основному содержимому

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

Всем

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

📌 Блок 1. Основа: Lifecycle, GameObject, Transform, Component, Project Settings

1. MonoBehaviour Lifecycle (гарантированный порядок вызова)

МетодКогда вызываетсяПримечания
Awake()При инициализации объекта (до Start) — даже если enabled = falseВызывается один раз за жизненный цикл объекта. Подходит для инициализации ссылок (GetComponent, Find, FindObjectOfType).
OnEnable()После Awake, каждый раз при включении объекта (SetActive(true) или enabled = true)Может вызываться многократно.
Start()Перед первым Update, только если скрипт включён (enabled == true)Не вызывается, если объект создан через Instantiate с SetActive(false).
FixedUpdate()С фиксированным интервалом (Time.fixedDeltaTime, по умолчанию 0.02 с = 50 Гц)Используется для физики (Rigidbody.AddForce, Physics.Raycast). Вызывается даже при паузе (Time.timeScale = 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() — вызывается в редакторе при изменении значений в инспекторе или загрузке сцены. Не вызывается в сборке.

2. GameObject

Основные свойства:

СвойствоТипОписание
activeSelfboolСостояние активности именно этого GameObject (локальное).
activeInHierarchybooltrue, если объект и все его предки активны.
isStaticboolФлаг Static (для оптимизаций: batching, lighting, culling).
layerintСлой (0–31). Соответствует LayerMask.NameToLayer.
tagstringТег. Доступные теги — в Edit > Project Settings > Tags and Layers.
sceneSceneСцена, к которой принадлежит объект.
transformTransformСсылка на компонент Transform. Не может быть null.
hideFlagsHideFlagsУправляет отображением в иерархии и инспекторе (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(string, object, SendMessageOptions)Отправка сообщения всем компонентам (медленно, избегать в runtime).

3. Transform

Иерархия — костяк Unity. Все операции с позицией/вращением/масштабом — через Transform.

Свойства:

СвойствоТипОписание
positionVector3Мировая позиция (Vector3.zero = начало мировой системы).
localPositionVector3Позиция относительно родителя.
rotationQuaternionМировое вращение.
localRotationQuaternionВращение относительно родителя.
eulerAnglesVector3Углы Эйлера (в градусах, мировые). Чтение — конвертация из rotation; запись — конвертация в Quaternion.
localEulerAnglesVector3Углы Эйлера (локальные).
lossyScaleVector3Фактический мировой масштаб (с учётом вращения родителей — может быть искажён).
localScaleVector3Локальный масштаб (применяется до вращения).
parentTransformРодитель. null — корень.
rootTransformКорень иерархии.
childCountintКоличество дочерних объектов.
hasChangedbooltrue, если 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 и др.)

СвойствоТипОписание
enabledboolВидимость в рендере.
isVisibleboolВидим ли объект хотя бы одной камерой (только если enabled == true).
boundsBoundsОграничивающий объём в мировом пространстве (center, extents, size).
localBoundsBoundsЛокальный bounding box (только SkinnedMeshRenderer).
material / materialsMaterial / Material[]Первый материал / все материалы. Присваивание создаёт инстанс (копию).
sharedMaterial / sharedMaterialsMaterial / Material[]Прямой доступ к материалам без копирования (опасно — изменяет все объекты, использующие материал).
lightmapIndex / lightmapScaleOffsetint / Vector4Параметры baked lighting (Lightmap Index, UV scale/offset).
receiveShadowsboolПолучает ли тени от других объектов.
motionVectorGenerationModeMotionVectorGenerationModeOff / Camera / Object — для TAA и motion blur.
allowOcclusionWhenDynamicboolРазрешает dynamic occlusion culling (требует OcclusionCulling в настройках).

Collider (базовый класс)

СвойствоОписание
enabledУчаствует ли коллайдер в физике.
isTriggertrue — триггер (вызывает OnTriggerEnter/Stay/Exit, не участвует в физике).
sharedMaterialPhysicMaterial (3D) / PhysicsMaterial2D (2D) — трение, отскок.
boundsМировые границы (даже если enabled == false).

5. Project Settings (Edit > Project Settings)

📁 Time

ПараметрЗначение по умолчаниюОписание
Time.timeScale1.0Глобальный множитель времени (0 — пауза).
Time.fixedDeltaTime0.02 (50 FPS)Интервал FixedUpdate. Рекомендуется Application.targetFrameRate / 2.
Maximum Allowed Timestep0.333...Макс. длительность FixedUpdate, если игра «тормозит».
Time.captureFramerate0Если 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Аппаратная анимация скелета.
LightmapsModeDisabled / Non-Directional / Directional / Directional Specular.

📦 Player

НастройкаОписание
Scripting BackendMono (быстрая сборка) / IL2CPP (оптимизировано, AOT, поддержка 64-bit iOS/Android).
Api Compatibility Level.NET Standard 2.1 (реком.) / .NET Framework / .NET 6+ (experimental).
Active Input HandlingBoth / Input Manager (Old) / Input System (New).
OptimizationManaged Stripping LevelDisabled / Low / Medium / High — удаление неиспользуемых API (осторожно с reflection).
Resolution and PresentationFullscreen mode, Default resolution, VSync, Display resolution dialog.
IconИконка сборки (Windows, macOS, Linux, Android, iOS).
Splash ImageИзображение загрузки (Unity Pro required для кастомизации).

🧠 PhysicsPhysics 2D)

ПараметрОписание
GravityВектор гравитации (0, -9.81, 0 по умолчанию).
Default MaterialPhysicMaterial по умолчанию (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 Matrix32×32 битовая матрица — какие слои сталкиваются.

🎨 Quality

УровеньОсновные параметры (настраиваемые)
VSync CountDon’t Sync / Every V Blank / Every Second V Blank — борьба с tearing.
Anti Aliasing2x–8x MSAA (только Forward), или Post-processing (FXAA, TAA).
Anisotropic TexturesDisabled / Per Texture / Forced On.
Soft ParticlesЗатемнение частиц при пересечении геометрии.
Realtime Reflection ProbesRefresh mode (On Awake / Every Frame / Via Script).
Shadow Distance / CascadesДальность и разбиение теней для Directional Light.

📌 Блок 2. Физика, Рендеринг, Освещение, Аудио

1. Rigidbody (3D)

Основные свойства

СвойствоТипЗначение по умолчаниюОписание
massfloat1.0Масса в кг. Влияет на инерцию, импульс, силу гравитации (F = m·g).
dragfloat0.0Линейное сопротивление воздуха (коэффициент пропорциональности F_drag = -v·drag).
angularDragfloat0.05Угловое сопротивление (аналогично drag, но для вращения).
useGravitybooltrueУчитывать ли глобальную гравитацию (Physics.gravity).
isKinematicboolfalsetrue — объект не участвует в физике, но может двигаться через Transform; триггеры работают.
interpolationRigidbodyInterpolationNoneInterpolate/Extrapolate — сглаживание движения при дискретных физ. шагах (для сетевых игр).
collisionDetectionModeCollisionDetectionModeDiscreteContinuous/ContinuousDynamic/ContinuousSpeculative — анти-туннелирование для быстрых объектов.
constraintsRigidbodyConstraintsNoneФлаги: FreezePositionX/Y/Z, FreezeRotationX/Y/Z.
centerOfMassVector3Vector3.zeroЦентр масс в локальных координатах. Смещение влияет на вращение под действием сил.
inertiaTensorVector3АвтоматическиТензор инерции (диагональная матрица, задаёт сопротивление вращению по осям).
inertiaTensorRotationQuaternionQuaternion.identityПоворот осей тензора инерции.
detectCollisionsbooltrueОтключает обнаружение столкновений (но не триггеров), если false.

Методы изменения состояния

МетодСигнатураПримечания
AddForceAddForce(Vector3 force, ForceMode mode = ForceMode.Force)ForceMode: Force (F), Acceleration (a = F/m), Impulse (Δp), VelocityChange (Δv).
AddRelativeForceАналогично, но сила прикладывается в локальной СК.
AddTorqueAddTorque(Vector3 torque, ForceMode mode)Вращающий момент (аналогично AddForce).
AddRelativeTorqueВ локальной СК.
MovePositionMovePosition(Vector3 position)Атомарное перемещение (для isKinematic = true); сглаживается при interpolation.
MoveRotationMoveRotation(Quaternion rot)Атомарный поворот (аналогично MovePosition).
Sleep() / WakeUp()Принудительный переход в спящее/активное состояние.
IsSleeping()boolПроверка состояния.
ResetCenterOfMass() / ResetInertiaTensor()Возврат к автоматическому расчёту.

⚠️ Важно:

  • Все силы/импульсы, добавленные через AddForce и т.п., действуют до следующего FixedUpdate.
  • velocity и angularVelocity можно читать/писать напрямую, но это обходит физ. движок (рекомендуется использовать AddForce/AddTorque для корректной симуляции).
  • maxAngularVelocity — глобальное ограничение (в Project Settings > Physics), по умолчанию 7.

2. Rigidbody2D

Свойства (отличия от 3D)

СвойствоЗначение по умолчаниюОписание
gravityScale1.0Множитель 2D-гравитации (Physics2D.gravity).
freezeRotationfalseЗаменяет constraints для Z-вращения.
simulatedtrueАналог enabled, но для физики 2D: отключает симуляцию, сохраняя компонент.
interpolationNoneАналогично 3D: Interpolate, Extrapolate.
sleepModeStartAwakeStartAsleep — изначально спящий.
collisionDetectionDiscreteContinuous — анти-туннелирование (только для RigidbodyType.Dynamic).
mass, drag, angularDragкак в 3D
constraintsNoneFreezePositionX/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

СвойствоТипОписание
isTriggerboolТриггер: вызывает события OnTrigger*, не участвует в физике.
sharedMaterialPhysicMaterial / PhysicsMaterial2DТрение (dynamicFriction, staticFriction) и отскок (bounciness).
attachedRigidbodyRigidbody / Rigidbody2DПервый Rigidbody, найденный при подъёме по иерархии (включая родителей).
enabledboolУчаствует ли в физике/триггерах.
boundsBounds (3D) / Bounds (2D → преобразуется в 3D)Габариты в мировом пространстве (даже если enabled = false).

3D-коллайдеры

ТипСвойстваОсобенности
BoxCollidercenter, sizeОси выровнены с Transform. Не поддерживает скейл с отрицательными компонентами (mirror).
SphereCollidercenter, radiusСамый дешёвый по вычислениям.
CapsuleCollidercenter, radius, height, direction (0=X,1=Y,2=Z)Высота включает сферические «шапки».
MeshCollidersharedMesh, convex, cookingOptionsconvex = true — требуется для Rigidbody (ограничение: ≤ 255 треугольников). cookingOptions: CookForFasterSimulation, EnableMeshCleaning, WeldColocatedVertices.
TerrainColliderterrainDataПривязан к Terrain. Не может быть триггером.
WheelCollidercenter, radius, suspensionDistance, suspensionSpring, forwardFriction, sidewaysFriction, motorTorque, brakeTorque, steerAngleФизическая модель подвески (не геометрия — невидим). Требует Rigidbody.

2D-коллайдеры

ТипСвойстваОсобенности
BoxCollider2Dsize, offset, autoTilingautoTiling — коррекция размера под SpriteRenderer.size.
CircleCollider2Dradius, offset
CapsuleCollider2Dsize, direction (Vertical/Horizontal)
PolygonCollider2Dpoints (локальные), autoTilingАвтоматическая генерация из Sprite (если Sprite не None).
EdgeCollider2Dpoints, edgeRadiusОткрытая ломаная (не замкнутая). edgeRadius — скругление углов.
CompositeCollider2DgeometryType (Outlines/Polygons), generationType (Manual/Synchronous/Asynchronous)Объединяет несколько Collider2D с UsedByComposite = true. Требует Rigidbody2D с BodyType = Static или Kinematic.

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

  • MeshCollider без convex = true не взаимодействует с другими MeshCollider и TerrainCollider.
  • WheelCollider не поддерживает isTrigger.
  • CompositeCollider2D не может быть триггером.

4. Camera

Проекция и параметры

СвойствоТипОписание
fieldOfViewfloatУгол обзора (в градусах) для projection = Perspective.
orthographicSizefloatПоловина высоты видимой области (в мировых единицах) для orthographic = true.
nearClipPlanefloatБлижняя плоскость отсечения (по умолчанию 0.3). Уменьшение → артефакты Z-fighting.
farClipPlanefloatДальняя плоскость (по умолчанию 1000). Увеличение → снижение precision Z-buffer.
projectionMatrixMatrix4x4Пользовательская матрица проекции (переопределяет FOV/orthographicSize).
cullingMaskLayerMaskКакие слои рендерить.
targetDisplayintНомер Display (0 — основной). Для multi-monitor.
rectRectОбласть экрана (в нормализованных координатах: 0–1). Для splitscreen/UI.
depthfloatПорядок рендеринга (больше — позже).

Режимы проекции

Параметрperspective = trueorthographic = true
projectionCameraProjection.PerspectiveCameraProjection.Orthographic
sizefieldOfVieworthographicSize
Использование3D-сцены, погружение2D, изометрия, UI, CAD

HDR и постобработка

СвойствоЗначение по умолчаниюОписание
hdrtrue (в URP/HDRP)Рендеринг в HDR (32-bit float render texture). Требуется для bloom, tone mapping.
allowHDRДоступно только в Built-in RP (в URP/HDRP управление через asset).
allowMSAAtrueВключение MSAA (работает только в Forward, не в Deferred).
useOcclusionCullingtrueИспользовать precomputed occlusion data.
stereoTargetEyeStereoTargetEyeMask.BothНастройка для VR.
cameraTypeCameraType.GameSceneView, 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

Типы и параметры

СвойствоТипОписание
typeLightTypeDirectional, Point, Spot, Area (только для baking).
colorColorЦвет света (gamma-corrected).
intensityfloatЯркость (люмены): Directional — illuminance (lux), Point/Spot — luminous power (lumens).
rangefloatДальность действия (кроме Directional).
spotAnglefloatУгол конуса (только Spot).
innerSpotAnglefloatВнутренний угол (для soft falloff).
shadowsLightShadowsNone, Hard, Soft.
shadowStrengthfloatПрозрачность теней (0–1).
shadowBiasfloatСмещение для борьбы с acne (требует подбора под сцену).
shadowNormalBiasfloatСмещение по нормали (для тонких объектов).
shadowNearPlanefloatNear plane теневого frustum (только Directional).
cookieTextureТекстура проекции (только для Spot).
renderModeLightRenderModeAuto, Important, Not Important — управление per-pixel lighting.

Baking и realtime

НастройкаBuilt-in RPURPHDRP
ModeRealtime, Mixed, BakedRealtime, BakedRealtime, 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.
  • shadowResolution: Low (512), Medium (1024), High (2048), Very High (4096). Глобально в Project Settings > Quality.

6. AudioSource / AudioListener

AudioSource

СвойствоТипЗначение по умолчаниюОписание
clipAudioClipnullАудиоданные (OGG/Vorbis, PCM, ADPCM).
outputAudioMixerGroupAudioMixerGroupnullГруппа в AudioMixer (для эффектов, volume automation).
playOnAwakebooltrueАвтовоспроизведение.
volumefloat1.0Громкость (0–1).
pitchfloat1.0Темп и тональность (0.5–2.0 рекомендовано).
loopboolfalseЗацикливание.
muteboolfalseОтключение (но isPlaying остаётся true).
spatialBlendfloat0.00 — 2D (одинаково во всех динамиках), 1 — 3D (пространственное звучание).
spatializeboolfalseВключение spatializer plugin (например, Oculus Spatializer).
reverbZoneMixfloat1.0Вклад в эффект реверберации (в AudioReverbZone).
dopplerLevelfloat1.0Интенсивность эффекта Доплера.
spreadfloat0.0Угол стереоразвёртки (в градусах, 0–360).
priorityint128При нехватке голосов — останавливаются с наибольшим priority.

Пространственное звучание (3D)

СвойствоОписание
minDistanceРасстояние, внутри которого громкость = volume.
maxDistanceРасстояние, за которым громкость = AudioListener.volume * AudioListener.gameObject.GetComponent<AudioLowPassFilter>()?.cutoffFrequency (если есть).
rolloffModeAudioRolloffMode: Logarithmic, Linear, Custom.
bypassEffects / bypassListenerEffects / bypassReverbZonesОтключение обработки (для debug или оптимизации).

AudioListener

СвойствоОписание
volumeГлобальная громкость (умножается на AudioSource.volume).
spatializeInternalВключение internal spatializer (если нет plugin).
outputAudioMixerGroup — глобальный выход.

Методы 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)).

📌 Блок 3. Анимация, Data-Oriented Design, Пакеты, Профилирование, Сборка

1. Animator и Animation

Animator — компонент

СвойствоТипОписание
runtimeAnimatorControllerRuntimeAnimatorControllerСсылка на AnimatorController (.controller asset). Может быть null.
applyRootMotionbooltrue — перемещение/вращение из корня анимации применяется к Transform.
updateModeAnimatorUpdateModeNormalUpdate), AnimatePhysicsFixedUpdate), UnscaledTime (игнорирует Time.timeScale).
cullingModeAnimatorCullingModeAlwaysAnimate, CullUpdateTransforms, CullCompletely — управление обновлением при isVisible = false.
avatarAvatarОписание скелета (только для humanoid).
layersAffectMassCenterbool (URP/HDRP)Влияют ли IK-слои на центр масс (для физики).

Параметры анимации

ТипДиапазонПримечания
float±3.4e38Основной тип для blend trees, thresholds.
int±2^31Для дискретных состояний (e.g. weaponState = 0/1/2).
booltrue/falseПростые переключения (e.g. isGrounded).
TriggerАвтоматически сбрасывается после использования (Animator.ResetTrigger).

⚠️ Производительность:

  • Чтение/запись параметров — не бесплатна: SetFloat вызывает копирование буфера параметров.
  • Кэшируйте Animator.StringToHash("param") → используйте animator.SetFloat(hash, value).
  • Избегайте GetFloat в hot paths — лучше хранить состояние в скрипте.

Состояния и переходы

ЭлементСвойства
StateSpeed, Cycle Offset, Foot IK, Write Defaults, Transitions, Motion (AnimationClip или BlendTree).
Blend TreeType: 1D, 2D Simple Directional, 2D Freeform Directional, 2D Freeform Cartesian, Direct; Parameters, Thresholds, Child Motions.
TransitionHas 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Автопроигрывание при старте.
wrapModeOnce, 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 = "Data/MyData")] → ПКМ в Project.
ЗагрузкаResources.Load<T>, Addressables.LoadAssetAsync<T>, AssetDatabase.LoadAssetAtPath<T> (только в редакторе).
ИнстанцированиеScriptableObject.CreateInstance<T>() (временный объект, не сохраняется).
СохранениеAssetDatabase.CreateAsset(so, path) (редактор), EditorUtility.SetDirty(so) перед AssetDatabase.SaveAssets().

Свойства и методы

ЭлементОписание
hideFlagsHideFlags.DontSave, HideInHierarchy и др. — управление видимостью.
OnEnable()Вызывается при загрузке asset (аналог Awake для MonoBehaviour).
OnValidate()В редакторе — при изменении в инспекторе.
Reset()В редакторе — при сбросе до значений по умолчанию.

Паттерны использования

ПаттернОписание
Data-Driven DesignВсе параметры геймплея — в ScriptableObject.
Polymorphic ReferencesБазовый класс [Serializable], наследники — [CreateAssetMenu].
Event ChannelsScriptableObject как event bus (без UnityEvent, для loose coupling).
Editor-Only Data[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).
Режимы обработки
РежимОписание
Pollingaction.ReadValue<T>() — опрос в Update.
Eventsaction.performed += ctx => { } — события при срабатывании.
Buffersaction.ReadValueIntoBuffers() — для многопользовательских устройств.
Производительность
  • 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()Очистка кэша зависимостей.
Типы ключей
КлючФорматПримечания
AddressstringУникальная строка (задаётся в инспекторе).
LabelstringГруппировка (platform:Android, lang:ru).
Asset GUIDGUIDВнутренний идентификатор.
AssetReferenceAssetReferenceСериализуемая ссылка (в инспекторе — drag & drop).
Build и настройки
НастройкаОписание
Build PathLocalBuildPath, RemoteBuildPath (для CDN).
Bundle ModePack Together, Pack Separately, No Bundles (режим кэширования).
CompressionLZ4, 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 PathForward, Deferred (только с DepthNormals и MotionVectors).
Color RenderingHDR, MSAA, Color Grading LUT Size.
ShadowsMax Distance, Cascades, Depth Bias, Normal Bias, Soft Shadows.
Post-processingPost-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 vs URP
АспектHDRP
LightingPhysically Based (lux, lumens), Area lights realtime (GPU).
VolumetricsVolumetric fog, clouds, god rays.
DecalsNative support (material-based).
Ray TracingDXR/Vulkan RT: reflections, shadows, GI, AO.
Custom PassesFullScreen, Before Opaque, After Post-processing, After Opaque And Sky.
Frame Settings
ГруппаПараметры
LightingScreen Space Reflection, Ray Tracing, Light Layers.
RenderingMotion Vectors, Subsurface Scattering, Distortion.
Post-processingDepth 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, рендер, физика.
MemoryGC.Alloc, managed heap, native memory, assets.
RenderingDraw calls, batches, set pass calls, shader variants.
PhysicsFixedUpdate time, contact pairs, CCD checks.
AudioГолоса, DSP load, mixer bus load.
UICanvas.BuildBatch, Graphic.Rebuild, input events.
VideoДекодирование, синхронизация.
Global IlluminationLight 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 ChangesSetPass, SetTexture, SetFloat — источники overhead.
Occlusion CullingПроверка, какие объекты отсекаются.

Memory Profiler (отдельный пакет)

ОтчётСодержание
Managed MemoryОбъекты в managed heap, roots, GC pressure.
Native MemoryTexture2D, Mesh, AudioClip в native memory.
Asset MemoryРазмер AssetBundle, Resources.UnloadUnusedAssets() эффект.
Compare SnapshotsУтечки: объекты, появившиеся между снимками.

Rendering Debugger (URP/HDRP)

ВкладкаИнструменты
LightingLight overlap, probe visualization, GI cache.
MaterialAlbedo, specular, smoothness override.
Post-processingBloom, DoF, motion vectors.
Custom PassesВизуализация custom render features.

⚠️ Советы:

  • В релизе: Development Build + Autoconnect Profiler → профилирование на устройстве.
  • Избегайте Debug.Log в hot paths — это allocation + I/O.
  • Используйте Profiler.BeginSample("MyCode") / EndSample() для кастомных маркеров.

5. Сборка и дистрибуция

Build Settings (File > Build Settings)

ПлатформаОсобенности
PC, Mac, Linux StandaloneTarget Architecture: x86, x86_64, Universal. IL2CPP only for 64-bit.
AndroidScripting Backend: IL2CPP (required for 64-bit), Target API Level, Min API Level, Split Application Binary.
iOSTarget SDK: Device SDK, Architecture: ARM64, Strip Engine Code, Bitcode.
WebGLCompression Format: Brotli (best), Gzip, Disabled; Memory Size: 256–512 MB.

IL2CPP

НастройкаОписание
Engine Code StrippingУдаление неиспользуемых классов движка (осторожно с reflection).
Managed Stripping LevelLowHigh — удаление 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)

ФорматГде взять
WindowsGame_Data/Managed/Game.pdb
AndroidGame_Data/Native/ + split_symbols (при включённых symbols)
iOSdSYM папка (в Build при Debug Symbols = true)
WebGLGame.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 и др.
NativeContainerNativeArray<T>, NativeList<T>, NativeHashMap<K,V> — память вне managed heap.
Dependency GraphJobHandle — управление порядком выполнения (CombineDependencies, Schedule, Complete).
Safety SystemПроверка aliasing: один NativeArray не может быть записан в нескольких job’ах одновременно.

Типы Job’ов

ИнтерфейсСигнатураПрименение
IJobvoid Execute()Однопоточная задача.
IJobParallelForvoid Execute(int index)Параллельный цикл (0..length-1).
IJobParallelForTransformvoid Execute(int index, TransformAccess transform)Параллельная работа с Transform (через TransformAccessArray).
IJobChunkvoid Execute(ArchetypeChunk chunk, int chunkIndex, int firstEntityIndex)Работа с чанками (только в ECS).
IJobEntity[BurstCompile] void Execute(ref T0 c0, ...)ECS-only, высокоуровневый Entities.ForEach.

NativeArray<T> — ключевые параметры

ПараметрЗначенияОписание
AllocatorTemp (1 frame), TempJob (4 frames), PersistentУправление временем жизни.
NativeArrayOptionsUninitializedMemory, ClearMemoryИнициализация содержимого.
ReadOnly / ReadWriteАтрибуты: [ReadOnly], [WriteOnly]Указание намерения — разрешает параллелизм.

Пример: IJobParallelFor

[BurstCompile]
struct SineJob : IJobParallelFor
{
[ReadOnly] public NativeArray<float> input;
[WriteOnly] public NativeArray<float> output;
public float frequency;

public void Execute(int i)
{
output[i] = Mathf.Sin(input[i] * frequency * Mathf.PI * 2.0f);
}
}

// Использование:
var input = new NativeArray<float>(1000, Allocator.TempJob);
var output = new NativeArray<float>(1000, Allocator.TempJob);
var job = new SineJob { input = input, output = output, frequency = 1.0f };
JobHandle handle = job.Schedule(1000, 64); // 64 — batch size
handle.Complete();
output.Dispose();
input.Dispose();

⚠️ Требования 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.
Entity64-битный идентификатор (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.
2DSprite-специфичные: Sprite, Sprite Lit, Sprite Unlit.
Ключевые ноды
ГруппаНоды
InputTime, Screen Position, Object Position, Tiling & Offset, Properties (Vector2, Texture, Color).
MathAdd, Multiply, Power, Sine, Step, Smoothstep, Lerp.
VectorNormalize, Cross Product, Dot Product, Transform.
UVTiling And Offset, Mirror, Rotate, Polar Coordinates.
ProceduralNoise, Gradient, Checkerboard, Voronoi.
LightingMain Light, Additional Lights, Vertex Normal, World Space Reflections.
Параметры шейдера (в инспекторе)
ПараметрОписание
SurfaceOpaque, Transparent.
Blend ModeAlpha, Additive, Multiply, Premultiply.
CullingOff, 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)

Архитектура
БлокОписание
ContextSpawn, Initialize, Update, Output.
BlockAdd Velocity, Apply Force, Collision, Color Over Life.
OperatorAdd, Multiply, Sample Texture, Noise.
EventCollision 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Одинаковый хеш при одинаковом содержимом.
ChunkBasedCompressionLZ4 (быстрее 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.
ConfuserExOpen-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 PluginsKeychain (iOS), Keystore (Android), DPAPI (Windows) — через C++ plugin.
PlayFabCloud Script + Player Data с 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>
АтрибутНазначение
classCSS-класс (множественные: "btn primary").
nameУникальный идентификатор (для поиска через root.Q<Label>("score-value")).
picking-modePosition, Ignore — влияет на клики.
styleInline-стили (избегать — нарушает разделение слоёв).

USS — ключевые правила

.header {
font-size: 24px;
color: #ffffff;
unity-font-definition: "Assets/Fonts/Roboto-Bold.asset";
}

#score-value {
color: #ffcc00;
}

.restart-btn:hover {
background-color: #ff5555;
}

.score-container {
flex-direction: row;
align-items: center;
margin: 10px;
}
ПравилоПоддержка
flex-direction, justify-content, align-itemsПолная (Flexbox).
unity-text-outline-color, unity-text-outline-widthOutline текста.
unity-background-imageТекстура фона (только VisualElement, не Label).
--property-nameCSS-переменные (через 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 SettingsProject Settings > Localization
Asset ReferencesString 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кадры
FPSframes per second

⚠️ Практика:

  • EditMode тесты — для pure-логики, алгоритмов, serialization.
  • PlayMode — для интеграции с движком.
  • В CI: Unity.exe -runTests -testPlatform EditMode -logFile - → вывод в stdout.

4. Cloud Services

Unity Cloud Build (UCB)

НастройкаОписание
TargetsAndroid_Development, iOS_Release — комбинация platform + config.
Build HookspreBuild.sh, postBuild.sh — скрипты на агенте.
VariablesUNITY_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Пример
*.metaLibrary/
Temp/UserSettings/

Unity Services Dashboard

СервисНазначение
AnalyticsСобытия: customEvent, transaction, userAttribute.
Remote SettingsДинамические параметры: float, string, bool.
AuthenticationAnonymous, Apple, Google, Custom.
Cloud CodeJavaScript-функции на сервере (аналог 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)

public class BuildProcessor : IPreprocessBuildWithReport, IPostprocessBuildWithReport
{
public int callbackOrder => 0;

public void OnPreprocessBuild(BuildReport report)
{
// Версия, иконки, splash screen
PlayerSettings.bundleVersion = DateTime.Now.ToString("yy.MM.dd.HH");
}

public void OnPostprocessBuild(BuildReport report)
{
// Подпись APK, копирование в deploy-папку
if (report.summary.platform == BuildTarget.Android)
SignAPK(report.summary.outputPath);
}
}
ИнтерфейсФаза
IPreprocessBuildWithReportДо сборки
IProcessSceneWithReportПосле обработки сцены (lightmapping, stripping)
IPostprocessBuildWithReportПосле сборки
IOrderedCallbackУправление порядком (callbackOrder)

⚠️ Практика:

  • Все editor-скрипты — в папке Editor/.
  • Undo.RecordObject(target, "Change") — для отмены действий.
  • EditorUtility.DisplayProgressBar() — прогресс длительных операций.

📌 Блок 6. Мобильные, Сети, Оптимизация, Интеграции, CI/CD

1. Мобильная разработка

Player Settings (Android)

КатегорияПараметрОписание
Other SettingsBundle Identifiercom.company.game — должен быть уникальным.
Version / Bundle Version Code1.0.0 / 100 — версия отображаемая / внутренний инкремент.
Minimum API LevelAndroid 5.0 (API level 21) — минимум для IL2CPP.
Target API LevelAutomatic / API level 34 (Android 14) — для Google Play (требуется 33 с 2024 г.).
Scripting BackendIL2CPP (обязательно для 64-bit).
Target ArchitecturesARM64 (обязательно), ARMv7 (опционально).
Publishing SettingsKeystoreCreate New / Use Existing — release signing. Debug: debug.keystore.
BuildInternal (монолитный APK), Gradle (рекомендуется), ADT (устарело).
Split Application BinaryEnablebase.apk + UnityData (для >100 МБ).

Player Settings (iOS)

ПараметрОписание
Target SDKDevice SDK (release), Simulator SDK (debug).
ArchitectureARM64 (обязательно), ARM64 + Simulator (для тестирования в Xcode).
Strip Engine CodeУдаляет неиспользуемые модули движка (экономия 20–50 МБ).
BitcodeDisabled (Apple не требует с 2023 г.).
Camera Usage DescriptionОбязательно, если используется камера (иначе rejection в App Store).
Supported URL SchemesДля deep linking: mygame://.

Permissions (Android)

PermissionГде объявитьRuntime?
INTERNETAndroidManifest.xml (автоматически при Networking)Нет
WRITE_EXTERNAL_STORAGEPlayer Settings > Publishing > Custom Main Gradle TemplateДа (Android 6.0+)
VIBRATEAndroidManifest.xmlНет
ACCESS_FINE_LOCATIONЧерез plugin или Plugins/Android/AndroidManifest.xmlДа

Пример runtime-запроса (Android):

if (!Permission.HasUserAuthorizedPermission(Permission.FineLocation))
Permission.RequestUserPermission(Permission.FineLocation);

Deep Linking

ПлатформаРеализация
AndroidAndroidManifest.xml:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data 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).
ProtocolsUNET (устарело), Ruffles (новый, с congestion control).
ChannelsReliableSequenced, 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.
Пример:
public class PlayerMovement : NetworkBehaviour
{
[ServerRpc]
void InputServerRpc(Vector2 input, ServerRpcParams rpcParams = default)
{
// Валидация скорости, позиции
velocity.Value = input * speed;
}

public override void OnNetworkSpawn()
{
if (IsLocalPlayer)
Camera.main.GetComponent<CameraFollow>().target = transform;
}
}

NAT Traversal

МетодОписание
Relay ServerUnity 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 flagGameObject должен быть 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.PackTexturesRuntime атласинг (избегать в runtime — аллокации).
Shader KeywordsUNITY_TEXTURE_ALPHASPLIT_DISABLE — для alpha-split текстур.

LOD (Level of Detail)

КомпонентСвойства
LOD GroupLOD 0..5: Screen Relative Transition Height, Renderers.
LOD BiasВ Quality Settings — смещение автоматического выбора LOD.
CullingAnimate Physics, Cross Fade — управление переходами.

Occlusion Culling

ШагДействие
1Пометить Occluder Static / Occludee Static.
2Window > 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 MessagingPush-уведомления.
Инициализация:
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 (com.discord.dota.unity)

APIОписание
DiscordManager.Initialize(clientId)Инициализация.
DiscordManager.UpdatePresence(...)Rich Presence: details, state, largeImageKey.
DiscordManager.OnReadyСобытие готовности.

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)

name: Build
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: game-ci/unity-builder@v3
with:
unityVersion: 2022.3.29f1
targetPlatform: Android
androidKeystoreName: ${{ secrets.KEYSTORE_NAME }}
androidKeystorePass: ${{ secrets.KEYSTORE_PASS }}
androidKeyaliasName: ${{ secrets.KEYALIAS_NAME }}
androidKeyaliasPass: ${{ secrets.KEYALIAS_PASS }}
- uses: actions/upload-artifact@v3
with:
name: build
path: build/

Jenkins Pipeline

pipeline {
agent any
stages {
stage('Build') {
steps {
script {
sh '''
/opt/Unity/Hub/Editor/2022.3.29f1/Editor/Unity \
-batchmode \
-projectPath "$PWD" \
-executeMethod BuildScript.BuildAndroid \
-logFile /dev/stdout
'''
}
}
}
}
}

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).
versioningNone, Automatic, Custom.
androidVersionCodeАвтоматическое увеличение: $(date +%s).

Постобработка

ДействиеИнструмент
APK Signingapksigner (Android), codesign (iOS).
ProGuard/R8Уменьшение размера (Android).
AssetBundle Uploadaws s3 cp, az storage blob upload.
Test Reportsnunit3PublishTestResults@2 (Azure).

⚠️ Практика:

  • Используйте --no-graphics в CI для ускорения.
  • Unity.exe -quit -batchmode -nographics -logFile - -executeMethod BuildScript.PerformBuild.
  • Кэшируйте Library/ между сборками (осторожно: может вызывать артефакты).