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
Основные свойства:
| Свойство | Тип | Описание |
|---|---|---|
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(string, object, SendMessageOptions) | Отправка сообщения всем компонентам (медленно, избегать в runtime). |
3. Transform
Иерархия — костяк Unity. Все операции с позицией/вращением/масштабом — через Transform.
Свойства:
| Свойство | Тип | Описание |
|---|---|---|
position | Vector3 | Мировая позиция (Vector3.zero = начало мировой системы). |
localPosition | Vector3 | Позиция относительно родителя. |
rotation | Quaternion | Мировое вращение. |
localRotation | Quaternion | Вращение относительно родителя. |
eulerAngles | Vector3 | Углы Эйлера (в градусах, мировые). Чтение — конвертация из rotation; запись — конвертация в Quaternion. |
localEulerAngles | Vector3 | Углы Эйлера (локальные). |
lossyScale | Vector3 | Фактический мировой масштаб (с учётом вращения родителей — может быть искажён). |
localScale | Vector3 | Локальный масштаб (применяется до вращения). |
parent | Transform | Родитель. null — корень. |
root | Transform | Корень иерархии. |
childCount | int | Количество дочерних объектов. |
hasChanged | bool | true, если position/rotation/localScale изменились с последнего кадра (сбрасывается в Update). Не учитывает изменение parent. |
Методы:
| Метод | Описание |
|---|---|
SetParent(Transform, worldPositionStays) | Изменение родителя. worldPositionStays = true — сохраняет мировую позицию. |
Translate(Vector3, Space) | Смещение на вектор в Space.Self или Space.World. |
Rotate(Vector3, Space) | Поворот (углы в градусах) относительно осей (Space.Self, Space.World, или TransformDirection). |
RotateAround(Vector3 point, Vector3 axis, float angle) | Вращение вокруг точки в мировом пространстве. |
TransformPoint(Vector3) | Преобразует точку из локального → мирового пространства. |
InverseTransformPoint(Vector3) | Мировая → локальная точка. |
TransformDirection(Vector3) | Направление (без учёта масштаба и сдвига) из локального → мирового. |
InverseTransformDirection(Vector3) | Обратное преобразование направления. |
TransformVector(Vector3) | Вектор (с учётом масштаба) из локального → мирового. |
LookAt(Transform / Vector3) | Поворачивает объект, чтобы forward смотрел на цель. |
SetPositionAndRotation(Vector3, Quaternion) | Атомарная установка позиции и вращения (предпочтительнее двух отдельных присваиваний). |
⚠️ Важно:
- Изменение
position/rotation/localScaleнапрямую приводит к рекурсивному обновлениюTransformвсей ветки — избегать в циклах без необходимости.SetParent(null, true)≠DontDestroyOnLoad— последний перемещает объект в скрытую сценуDontDestroyOnLoad.
4. Базовые компоненты: общие параметры и свойства
Общие для всех Component:
| Свойство | Описание |
|---|---|
gameObject | Ссылка на GameObject, к которому прикреплён компонент. |
transform | Кэшированный gameObject.transform. |
enabled (Behaviour only) | Включенность компонента (только для MonoBehaviour, Collider, Renderer, Light, AudioSource). |
tag (Component → GameObject.tag) | Короткий доступ к тегу GameObject. |
Renderer (базовый класс для MeshRenderer, SkinnedMeshRenderer, SpriteRenderer и др.)
| Свойство | Тип | Описание |
|---|---|---|
enabled | bool | Видимость в рендере. |
isVisible | bool | Видим ли объект хотя бы одной камерой (только если enabled == true). |
bounds | Bounds | Ограничивающий объём в мировом пространстве (center, extents, size). |
localBounds | Bounds | Локальный bounding box (только SkinnedMeshRenderer). |
material / materials | Material / Material[] | Первый материал / все материалы. Присваивание создаёт инстанс (копию). |
sharedMaterial / sharedMaterials | Material / Material[] | Прямой доступ к материалам без копирования (опасно — изменяет все объекты, использующие материал). |
lightmapIndex / lightmapScaleOffset | int / Vector4 | Параметры baked lighting (Lightmap Index, UV scale/offset). |
receiveShadows | bool | Получает ли тени от других объектов. |
motionVectorGenerationMode | MotionVectorGenerationMode | Off / Camera / Object — для TAA и motion blur. |
allowOcclusionWhenDynamic | bool | Разрешает dynamic occlusion culling (требует OcclusionCulling в настройках). |
Collider (базовый класс)
| Свойство | Описание |
|---|---|
enabled | Участвует ли коллайдер в физике. |
isTrigger | true — триггер (вызывает OnTriggerEnter/Stay/Exit, не участвует в физике). |
sharedMaterial | PhysicMaterial (3D) / PhysicsMaterial2D (2D) — трение, отскок. |
bounds | Мировые границы (даже если enabled == false). |
5. Project Settings (Edit > Project Settings)
📁 Time
| Параметр | Значение по умолчанию | Описание |
|---|---|---|
Time.timeScale | 1.0 | Глобальный множитель времени (0 — пауза). |
Time.fixedDeltaTime | 0.02 (50 FPS) | Интервал FixedUpdate. Рекомендуется ≤ Application.targetFrameRate / 2. |
Maximum Allowed Timestep | 0.333... | Макс. длительность FixedUpdate, если игра «тормозит». |
Time.captureFramerate | 0 | Если ≠ 0 — фиксирует FPS = captureFramerate (для записи видео). |
🎮 Input
- Input Manager (устаревший, но поддерживается):
Axes— до 20 осей (Horizontal,Vertical,Jumpи др.), сSensitivity,Gravity,Dead,Snap,Invert,Type(Key/Axis/Mouse),Joy Num,Positive/Negative Button.
⚠️ Заменён на Input System Package (рекомендуется для новых проектов).
🖥️ Graphics
| Настройка | Описание |
|---|---|
Tier Settings | Уровни качества графики (Tier 1/2/3 — для Low/Med/High-end GPU). |
Always Included Shaders | Шейдеры, всегда включаемые в сборку (например, Unlit, Standard). |
Preloaded Shaders | Шейдерные варианты, загружаемые при старте. |
Shader Stripping | Удаление ненужных вариантов (lightmap modes, fog, instancing). |
Vertex Compression | Сжатие позиций/нормалей/UV в мешах (экономия VRAM). |
Use GPU Skinning | Аппаратная анимация скелета. |
Lightmaps → Mode | Disabled / Non-Directional / Directional / Directional Specular. |
📦 Player
| Настройка | Описание |
|---|---|
Scripting Backend | Mono (быстрая сборка) / IL2CPP (оптимизировано, AOT, поддержка 64-bit iOS/Android). |
Api Compatibility Level | .NET Standard 2.1 (реком.) / .NET Framework / .NET 6+ (experimental). |
Active Input Handling | Both / Input Manager (Old) / Input System (New). |
Optimization → Managed Stripping Level | Disabled / Low / Medium / High — удаление неиспользуемых API (осторожно с reflection). |
Resolution and Presentation | Fullscreen mode, Default resolution, VSync, Display resolution dialog. |
Icon | Иконка сборки (Windows, macOS, Linux, Android, iOS). |
Splash Image | Изображение загрузки (Unity Pro required для кастомизации). |
🧠 Physics (и Physics 2D)
| Параметр | Описание |
|---|---|
Gravity | Вектор гравитации (0, -9.81, 0 по умолчанию). |
Default Material | PhysicMaterial по умолчанию (Bounciness=0, Friction=0.5). |
Bounce Threshold | Мин. скорость для отскока (меньше — «прилипание»). |
Sleep Threshold | Энергия, ниже которой Rigidbody «засыпает». |
Default Solver Iterations / Velocity Iterations | Точность симуляции (выше — точнее, дороже). |
Queries Hit Triggers / Triggers Hit Triggers | Влияют на Physics.Raycast, OverlapSphere и др. |
Layer Collision Matrix | 32×32 битовая матрица — какие слои сталкиваются. |
🎨 Quality
| Уровень | Основные параметры (настраиваемые) |
|---|---|
VSync Count | Don’t Sync / Every V Blank / Every Second V Blank — борьба с tearing. |
Anti Aliasing | 2x–8x MSAA (только Forward), или Post-processing (FXAA, TAA). |
Anisotropic Textures | Disabled / Per Texture / Forced On. |
Soft Particles | Затемнение частиц при пересечении геометрии. |
Realtime Reflection Probes | Refresh mode (On Awake / Every Frame / Via Script). |
Shadow Distance / Cascades | Дальность и разбиение теней для Directional Light. |
📌 Блок 2. Физика, Рендеринг, Освещение, Аудио
1. Rigidbody (3D)
Основные свойства
| Свойство | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
mass | float | 1.0 | Масса в кг. Влияет на инерцию, импульс, силу гравитации (F = m·g). |
drag | float | 0.0 | Линейное сопротивление воздуха (коэффициент пропорциональности F_drag = -v·drag). |
angularDrag | float | 0.05 | Угловое сопротивление (аналогично drag, но для вращения). |
useGravity | bool | true | Учитывать ли глобальную гравитацию (Physics.gravity). |
isKinematic | bool | false | true — объект не участвует в физике, но может двигаться через Transform; триггеры работают. |
interpolation | RigidbodyInterpolation | None | Interpolate/Extrapolate — сглаживание движения при дискретных физ. шагах (для сетевых игр). |
collisionDetectionMode | CollisionDetectionMode | Discrete | Continuous/ContinuousDynamic/ContinuousSpeculative — анти-туннелирование для быстрых объектов. |
constraints | RigidbodyConstraints | None | Флаги: FreezePositionX/Y/Z, FreezeRotationX/Y/Z. |
centerOfMass | Vector3 | Vector3.zero | Центр масс в локальных координатах. Смещение влияет на вращение под действием сил. |
inertiaTensor | Vector3 | Автоматически | Тензор инерции (диагональная матрица, задаёт сопротивление вращению по осям). |
inertiaTensorRotation | Quaternion | Quaternion.identity | Поворот осей тензора инерции. |
detectCollisions | bool | true | Отключает обнаружение столкновений (но не триггеров), если false. |
Методы изменения состояния
| Метод | Сигнатура | Примечания |
|---|---|---|
AddForce | AddForce(Vector3 force, ForceMode mode = ForceMode.Force) | ForceMode: Force (F), Acceleration (a = F/m), Impulse (Δp), VelocityChange (Δv). |
AddRelativeForce | Аналогично, но сила прикладывается в локальной СК. | |
AddTorque | AddTorque(Vector3 torque, ForceMode mode) | Вращающий момент (аналогично AddForce). |
AddRelativeTorque | В локальной СК. | |
MovePosition | MovePosition(Vector3 position) | Атомарное перемещение (для isKinematic = true); сглаживается при interpolation. |
MoveRotation | MoveRotation(Quaternion rot) | Атомарный поворот (аналогично MovePosition). |
Sleep() / WakeUp() | — | Принудительный переход в спящее/активное состояние. |
IsSleeping() | bool | Проверка состояния. |
ResetCenterOfMass() / ResetInertiaTensor() | — | Возврат к автоматическому расчёту. |
⚠️ Важно:
- Все силы/импульсы, добавленные через
AddForceи т.п., действуют до следующегоFixedUpdate.velocityиangularVelocityможно читать/писать напрямую, но это обходит физ. движок (рекомендуется использоватьAddForce/AddTorqueдля корректной симуляции).maxAngularVelocity— глобальное ограничение (вProject Settings > Physics), по умолчанию 7.
2. Rigidbody2D
Свойства (отличия от 3D)
| Свойство | Значение по умолчанию | Описание |
|---|---|---|
gravityScale | 1.0 | Множитель 2D-гравитации (Physics2D.gravity). |
freezeRotation | false | Заменяет constraints для Z-вращения. |
simulated | true | Аналог enabled, но для физики 2D: отключает симуляцию, сохраняя компонент. |
interpolation | None | Аналогично 3D: Interpolate, Extrapolate. |
sleepMode | StartAwake | StartAsleep — изначально спящий. |
collisionDetection | Discrete | Continuous — анти-туннелирование (только для RigidbodyType.Dynamic). |
mass, drag, angularDrag | как в 3D | |
constraints | None | FreezePositionX/Y, FreezeRotation. |
Методы (2D-специфичные)
| Метод | Описание |
|---|---|
AddForce(Vector2, ForceMode2D) | ForceMode2D.Force / Impulse. |
AddTorque(float, ForceMode2D) | Вращение вокруг Z. |
MovePosition(Vector2) / MoveRotation(float) | Атомарные операции. |
GetContacts(ContactPoint2D[]) | Заполняет массив контактами за последний кадр. |
OverlapCollider(NonAlloc) | Проверка пересечения без аллокаций. |
⚠️ Особенность:
Rigidbody2DиCollider2Dработают только в 2D-физике — не взаимодействуют с 3D-объектами.Physics2D.autoSimulation = falseпозволяет делатьPhysics2D.Simulate(deltaTime)вручную (для фиксированной логики в сетевых играх).
3. Коллайдеры
Общие для всех Collider
| Свойство | Тип | Описание |
|---|---|---|
isTrigger | bool | Триггер: вызывает события OnTrigger*, не участвует в физике. |
sharedMaterial | PhysicMaterial / PhysicsMaterial2D | Трение (dynamicFriction, staticFriction) и отскок (bounciness). |
attachedRigidbody | Rigidbody / Rigidbody2D | Первый Rigidbody, найденный при подъёме по иерархии (включая родителей). |
enabled | bool | Участвует ли в физике/триггерах. |
bounds | Bounds (3D) / Bounds (2D → преобразуется в 3D) | Габариты в мировом пространстве (даже если enabled = false). |
3D-коллайдеры
| Тип | Свойства | Особенности |
|---|---|---|
BoxCollider | center, size | Оси выровнены с Transform. Не поддерживает скейл с отрицательными компонентами (mirror). |
SphereCollider | center, radius | Самый дешёвый по вычислениям. |
CapsuleCollider | center, radius, height, direction (0=X,1=Y,2=Z) | Высота включает сферические «шапки». |
MeshCollider | sharedMesh, convex, cookingOptions | convex = true — требуется для Rigidbody (ограничение: ≤ 255 треугольников). cookingOptions: CookForFasterSimulation, EnableMeshCleaning, WeldColocatedVertices. |
TerrainCollider | terrainData | Привязан к Terrain. Не может быть триггером. |
WheelCollider | center, radius, suspensionDistance, suspensionSpring, forwardFriction, sidewaysFriction, motorTorque, brakeTorque, steerAngle | Физическая модель подвески (не геометрия — невидим). Требует Rigidbody. |
2D-коллайдеры
| Тип | Свойства | Особенности |
|---|---|---|
BoxCollider2D | size, offset, autoTiling | autoTiling — коррекция размера под SpriteRenderer.size. |
CircleCollider2D | radius, offset | |
CapsuleCollider2D | size, direction (Vertical/Horizontal) | |
PolygonCollider2D | points (локальные), autoTiling | Автоматическая генерация из Sprite (если Sprite не None). |
EdgeCollider2D | points, edgeRadius | Открытая ломаная (не замкнутая). edgeRadius — скругление углов. |
CompositeCollider2D | geometryType (Outlines/Polygons), generationType (Manual/Synchronous/Asynchronous) | Объединяет несколько Collider2D с UsedByComposite = true. Требует Rigidbody2D с BodyType = Static или Kinematic. |
⚠️ Ограничения:
MeshColliderбезconvex = trueне взаимодействует с другимиMeshColliderиTerrainCollider.WheelColliderне поддерживаетisTrigger.CompositeCollider2Dне может быть триггером.
4. Camera
Проекция и параметры
| Свойство | Тип | Описание |
|---|---|---|
fieldOfView | float | Угол обзора (в градусах) для projection = Perspective. |
orthographicSize | float | Половина высоты видимой области (в мировых единицах) для orthographic = true. |
nearClipPlane | float | Ближняя плоскость отсечения (по умолчанию 0.3). Уменьшение → артефакты Z-fighting. |
farClipPlane | float | Дальняя плоскость (по умолчанию 1000). Увеличение → снижение precision Z-buffer. |
projectionMatrix | Matrix4x4 | Пользовательская матрица проекции (переопределяет FOV/orthographicSize). |
cullingMask | LayerMask | Какие слои рендерить. |
targetDisplay | int | Номер Display (0 — основной). Для multi-monitor. |
rect | Rect | Область экрана (в нормализованных координатах: 0–1). Для splitscreen/UI. |
depth | float | Порядок рендеринга (больше — позже). |
Режимы проекции
| Параметр | perspective = true | orthographic = true |
|---|---|---|
projection | CameraProjection.Perspective | CameraProjection.Orthographic |
size | fieldOfView | orthographicSize |
| Использование | 3D-сцены, погружение | 2D, изометрия, UI, CAD |
HDR и постобработка
| Свойство | Значение по умолчанию | Описание |
|---|---|---|
hdr | true (в URP/HDRP) | Рендеринг в HDR (32-bit float render texture). Требуется для bloom, tone mapping. |
allowHDR | — | Доступно только в Built-in RP (в URP/HDRP управление через asset). |
allowMSAA | true | Включение MSAA (работает только в Forward, не в Deferred). |
useOcclusionCulling | true | Использовать precomputed occlusion data. |
stereoTargetEye | StereoTargetEyeMask.Both | Настройка для VR. |
cameraType | CameraType.Game | SceneView, Reflection, Preview, VR — влияет на поведение в редакторе. |
Методы
| Метод | Описание |
|---|---|
ScreenPointToRay(Vector3) | Луч из точки экрана (в пикселях) в мировое пространство. |
WorldToScreenPoint(Vector3) | Мировая точка → точка на экране (Z — расстояние до near plane). |
WorldToViewportPoint(Vector3) | Мировая точка → нормализованные координаты (0–1 по X/Y, Z — 0..1 между near/far). |
ViewportToWorldPoint(Vector3) | Обратное преобразование. |
Render() | Принудительный рендеринг (вне основного цикла). |
CopyFrom(Camera) | Копирование всех параметров из другой камеры. |
TryGetCullingParameters(out ScriptableCullingParameters) | Получение параметров для custom culling (URP/HDRP). |
GetStereoProjectionMatrix(Camera.StereoscopicEye) | Для VR. |
Stacking (URP/HDRP)
| Понятие | Описание |
|---|---|
| Base Camera | Главная камера, определяет viewport, clear flags, culling mask. |
| Overlay Camera | Доп. камера, рендерит поверх Base (например, UI, миникарта, crosshair). Имеет cameraType = CameraType.Overlay. |
| Order in Layer | Порядок overlay-камер (в инспекторе). |
⚠️ Важно:
clearFlags:Skybox,SolidColor,DepthOnly,DontClear.DepthOnly— для UI-камер (сохраняет цвет, очищает depth buffer).- В URP/HDRP параметры
hdr,msaa,colorGradingзадаются вRenderer Asset, а не в компонентеCamera.
5. Light
Типы и параметры
| Свойство | Тип | Описание |
|---|---|---|
type | LightType | Directional, Point, Spot, Area (только для baking). |
color | Color | Цвет света (gamma-corrected). |
intensity | float | Яркость (люмены): Directional — illuminance (lux), Point/Spot — luminous power (lumens). |
range | float | Дальность действия (кроме Directional). |
spotAngle | float | Угол конуса (только Spot). |
innerSpotAngle | float | Внутренний угол (для soft falloff). |
shadows | LightShadows | None, Hard, Soft. |
shadowStrength | float | Прозрачность теней (0–1). |
shadowBias | float | Смещение для борьбы с acne (требует подбора под сцену). |
shadowNormalBias | float | Смещение по нормали (для тонких объектов). |
shadowNearPlane | float | Near plane теневого frustum (только Directional). |
cookie | Texture | Текстура проекции (только для Spot). |
renderMode | LightRenderMode | Auto, Important, Not Important — управление per-pixel lighting. |
Baking и realtime
| Настройка | Built-in RP | URP | HDRP |
|---|---|---|---|
Mode | Realtime, Mixed, Baked | Realtime, Baked | Realtime, Baked |
Mixed (Built-in) | Shadowmask, Subtractive, Baked Indirect | — | — |
| Light Layers | — | Поддержка (через asset) | Полная поддержка |
| Light Cookies | Поддержка (2D cookie) | Поддержка | Поддержка (3D cookie) |
Realtime GI (Built-in RP only)
| Параметр | Описание |
|---|---|
Bounce Intensity | Множитель отражённого света. |
Color Temperature | Цвет по шкале Кельвина (если Use Color Temperature = true). |
Indirect Multiplier | Яркость indirect lighting. |
⚠️ Ограничения:
Arealight работает только в baked режиме.- В URP/HDRP realtime GI заменён на Screen Space GI, SSR, или light probes.
shadowResolution:Low(512),Medium(1024),High(2048),Very High(4096). Глобально вProject Settings > Quality.
6. AudioSource / AudioListener
AudioSource
| Свойство | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
clip | AudioClip | null | Аудиоданные (OGG/Vorbis, PCM, ADPCM). |
outputAudioMixerGroup | AudioMixerGroup | null | Группа в AudioMixer (для эффектов, volume automation). |
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)).
📌 Блок 3. Анимация, Data-Oriented Design, Пакеты, Профилирование, Сборка
1. Animator и Animation
Animator — компонент
| Свойство | Тип | Описание |
|---|---|---|
runtimeAnimatorController | RuntimeAnimatorController | Ссылка на AnimatorController (.controller asset). Может быть null. |
applyRootMotion | bool | true — перемещение/вращение из корня анимации применяется к Transform. |
updateMode | AnimatorUpdateMode | Normal (в Update), AnimatePhysics (в FixedUpdate), UnscaledTime (игнорирует Time.timeScale). |
cullingMode | AnimatorCullingMode | AlwaysAnimate, CullUpdateTransforms, CullCompletely — управление обновлением при isVisible = false. |
avatar | Avatar | Описание скелета (только для humanoid). |
layersAffectMassCenter | bool (URP/HDRP) | Влияют ли IK-слои на центр масс (для физики). |
Параметры анимации
| Тип | Диапазон | Примечания |
|---|---|---|
float | ±3.4e38 | Основной тип для blend trees, thresholds. |
int | ±2^31 | Для дискретных состояний (e.g. weaponState = 0/1/2). |
bool | true/false | Простые переключения (e.g. isGrounded). |
Trigger | — | Автоматически сбрасывается после использования (Animator.ResetTrigger). |
⚠️ Производительность:
- Чтение/запись параметров — не бесплатна:
SetFloatвызывает копирование буфера параметров.- Кэшируйте
Animator.StringToHash("param")→ используйтеanimator.SetFloat(hash, value).- Избегайте
GetFloatв hot paths — лучше хранить состояние в скрипте.
Состояния и переходы
| Элемент | Свойства |
|---|---|
| State | Speed, Cycle Offset, Foot IK, Write Defaults, Transitions, Motion (AnimationClip или BlendTree). |
| Blend Tree | Type: 1D, 2D Simple Directional, 2D Freeform Directional, 2D Freeform Cartesian, Direct; Parameters, Thresholds, Child Motions. |
| Transition | Has Exit Time, Exit Time, Fixed Duration / Transition Duration (s), Transition Offset, Interruption Source, Ordered Interruption, Conditions. |
Особенности:
Write Defaults = true— при выходе из состояния все параметры сбрасываются в значения по умолчанию (указаны в контроллере). Может вызывать артефакты — отключайте при необходимости.Any State— виртуальное состояние, из которого можно перейти в любое другое. Осторожно: может нарушить логику.Solo/Mute— отладка слоёв:Soloпроигрывает только этот слой,Mute— исключает.
События анимации
| Тип | Где задаётся | Когда вызывается |
|---|---|---|
Animation Event | В AnimationClip (в редакторе анимации) | В указанный кадр анимации (независимо от speed). |
StateMachineBehaviour | В контроллере (на состоянии/переходе) | OnStateEnter, OnStateUpdate, OnStateExit, OnStateMove, OnStateIK. |
OnAnimatorMove() | В MonoBehaviour | После Animator обработал root motion (если applyRootMotion = true). |
OnAnimatorIK(int layerIndex) | В MonoBehaviour | После Animator вычислил IK, до применения к Transform. |
IK (Inverse Kinematics)
| Метод | Описание |
|---|---|
SetIKPosition(AvatarIKGoal, Vector3) | Установка целевой точки для кисти/ступни. |
SetIKRotation(AvatarIKGoal, Quaternion) | Установка целевого вращения. |
SetLookAtPosition(Vector3) | Глаза/голова смотрят на точку. |
SetLookAtWeight(float lookAtWeight, ...) | Плавное управление: bodyWeight, headWeight, eyesWeight, clampWeight, clampBody. |
SetIKPositionWeight(AvatarIKGoal, float) | Вес влияния IK (0 — выкл, 1 — полный). |
Требования:
- Только для
AvatarсHumanoidrig.- Вызывать только внутри
OnAnimatorIK.Animator.updateMode = AnimatePhysics, если IK связан с физикой.
Animation (устаревшая система)
| Свойство | Описание |
|---|---|
clip | Текущий AnimationClip. |
playAutomatically | Автопроигрывание при старте. |
wrapMode | Once, Loop, PingPong, ClampForever. |
animatePhysics | Обновление в FixedUpdate. |
| Метод | Описание |
|---|---|
Play(string) | Запуск клипа (по имени). |
CrossFade(string, float fadeLength) | Плавный переход. |
Blend(string, float targetWeight, float fadeLength) | Наложение нескольких клипов (additive). |
⚠️ Рекомендация: избегать в новых проектах —
Animatorпредпочтителен.
2. ScriptableObject
Назначение
- Хранение данных, независимых от сцены и экземпляров GameObject.
- Конфигурации, таблицы уровней, инвентарь, локализация, настройки баланса.
Создание и управление
| Действие | Способ |
|---|---|
| Создание asset | [CreateAssetMenu(fileName = "Data.asset", menuName = "Data/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() | В редакторе — при сбросе до значений по умолчанию. |
Паттерны использования
| Паттерн | Описание |
|---|---|
| Data-Driven Design | Все параметры геймплея — в ScriptableObject. |
| Polymorphic References | Базовый класс [Serializable], наследники — [CreateAssetMenu]. |
| Event Channels | ScriptableObject как 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). |
Режимы обработки
| Режим | Описание |
|---|---|
| Polling | action.ReadValue<T>() — опрос в Update. |
| Events | action.performed += ctx => { } — события при срабатывании. |
| Buffers | action.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() | Очистка кэша зависимостей. |
Типы ключей
| Ключ | Формат | Примечания |
|---|---|---|
| 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 vs 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. |
⚠️ Советы:
- В релизе:
Development 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. |
| WebGL | Compression Format: Brotli (best), Gzip, Disabled; Memory Size: 256–512 MB. |
IL2CPP
| Настройка | Описание |
|---|---|
Engine Code Stripping | Удаление неиспользуемых классов движка (осторожно с reflection). |
Managed Stripping Level | Low → High — удаление API (System.Reflection.Emit, CultureInfo и др.). |
Debug Symbols | Включение *.pdb / *.map для crash reporting. |
Incremental GC | Уменьшает паузы GC (URP/HDRP recommended). |
AOT (Ahead-of-Time Compilation)
| Платформа | Поддержка |
|---|---|
| iOS, WebGL, Consoles | Обязательно (JIT запрещён). |
| Android (IL2CPP) | Да. |
| Windows (IL2CPP) | Опционально. |
⚠️ Проблемы AOT:
- Generic virtual methods — могут не компилироваться (требуется
Preserveатрибут илиlink.xml).- Reflection — только на типах/методах, упомянутых в коде или
link.xml.
Symbolication (Crash Reporting)
| Формат | Где взять |
|---|---|
| Windows | Game_Data/Managed/Game.pdb |
| Android | Game_Data/Native/ + split_symbols (при включённых symbols) |
| iOS | dSYM папка (в Build при Debug Symbols = true) |
| WebGL | Game.wasm.map |
link.xml (для IL2CPP)
<linker>
<assembly fullname="Assembly-CSharp">
<type fullname="MyNamespace.MyClass" preserve="all"/>
<namespace fullname="MyNamespace.Utilities" preserve="methods"/>
</assembly>
<assembly fullname="System.Core">
<type fullname="System.Linq.Enumerable" preserve="methods"/>
</assembly>
</linker>
Расположение:
Assets/link.xml(автоматически обрабатывается при сборке).
📌 Блок 4. Высокопроизводительные системы, графы, динамическая загрузка, безопасность
1. Job System и Burst Compiler
Архитектура Job System
| Компонент | Описание |
|---|---|
| Job | Единица работы: реализует IJob, IJobParallelFor, IJobChunk и др. |
| NativeContainer | NativeArray<T>, NativeList<T>, NativeHashMap<K,V> — память вне managed heap. |
| Dependency Graph | JobHandle — управление порядком выполнения (CombineDependencies, Schedule, Complete). |
| Safety System | Проверка aliasing: один NativeArray не может быть записан в нескольких job’ах одновременно. |
Типы Job’ов
| Интерфейс | Сигнатура | Применение |
|---|---|---|
IJob | void Execute() | Однопоточная задача. |
IJobParallelFor | void Execute(int index) | Параллельный цикл (0..length-1). |
IJobParallelForTransform | void Execute(int index, TransformAccess transform) | Параллельная работа с Transform (через TransformAccessArray). |
IJobChunk | void Execute(ArchetypeChunk chunk, int chunkIndex, int firstEntityIndex) | Работа с чанками (только в ECS). |
IJobEntity | [BurstCompile] void Execute(ref T0 c0, ...) | ECS-only, высокоуровневый Entities.ForEach. |
NativeArray<T> — ключевые параметры
| Параметр | Значения | Описание |
|---|---|---|
Allocator | Temp (1 frame), TempJob (4 frames), Persistent | Управление временем жизни. |
NativeArrayOptions | UninitializedMemory, ClearMemory | Инициализация содержимого. |
ReadOnly / ReadWrite | Атрибуты: [ReadOnly], [WriteOnly] | Указание намерения — разрешает параллелизм. |
Пример: IJobParallelFor
[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. |
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 Data с encryption at rest. |
Анти-отладка
| Приём | Реализация |
|---|---|
| Проверка отладчика | #if !UNITY_EDITOR && UNITY_STANDALONE_WIN → CheckRemoteDebuggerPresent. |
| Integrity Check | Хеш сборки (Application.version, crc) → сравнение с сервером. |
| Tamper Detection | Проверка Assembly.GetExecutingAssembly().Location на изменение. |
⚠️ Реалистично:
- Полная защита невозможна — цель: повысить стоимость взлома.
- Критичные данные (ключи, баланс) — только на сервере.
- Используйте
DOTNET_DEFAULT_DICTIONARY_CAPACITY=0вboot.configдля уменьшения метаданных.
📌 Блок 5. UI, Локализация, Тестирование, Облако, Экстеншены редактора
1. UI Toolkit
Архитектура
| Компонент | Описание |
|---|---|
| UXML | Декларативное описание UI (аналог HTML). Расширение .uxml. |
| USS | Стилизация (аналог CSS). Расширение .uss. Поддержка классов, псевдоклассов, :hover, :focus. |
VisualElement | Базовый класс всех UI-элементов. Аналог GameObject в UI иерархии. |
PanelSettings | Настройки рендерера: scaleMode, referenceResolution, renderMode (WorldSpace, ScreenSpaceOverlay, ScreenSpaceCamera). |
UIDocument | Компонент для привязки UXML/USS к GameObject (в сцене). |
UXML — синтаксис
<UXML xmlns:ui="UnityEngine.UIElements" xmlns:engine="UnityEditor.UIElements">
<ui:Label text="Score:" class="header" />
<ui:Box name="score-container">
<ui:Label name="score-value" text="0" />
</ui:Box>
<ui:Button text="Restart" name="restart-btn" />
</UXML>
| Атрибут | Назначение |
|---|---|
class | CSS-класс (множественные: "btn primary"). |
name | Уникальный идентификатор (для поиска через root.Q<Label>("score-value")). |
picking-mode | Position, Ignore — влияет на клики. |
style | Inline-стили (избегать — нарушает разделение слоёв). |
USS — ключевые правила
.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-width | Outline текста. |
unity-background-image | Текстура фона (только VisualElement, не Label). |
--property-name | CSS-переменные (через style.SetProperty("--prop", "value") в коде). |
Runtime API
| Класс/Метод | Описание |
|---|---|
VisualTreeAsset.CloneTree() | Создание экземпляра из .uxml. |
root.Q<T>(name, className) | Поиск элемента по name и/или class. |
element.Add(child) / element.Remove(child) | Изменение иерархии. |
element.ToggleInClassList("active") | Переключение CSS-класса. |
element.RegisterCallback<ClickEvent>(evt => { }) | Обработка событий. |
element.Bind(new SerializedObject(target)) | Привязка к ScriptableObject/MonoBehaviour. |
Binding (UI Toolkit + SerializedObject)
// В UXML: <ui:Label binding-path="health" text="${health}"/>
var so = new SerializedObject(playerStats);
document.rootVisualElement.Bind(so);
so.Update(); // перед изменением
playerStats.health = 75;
so.ApplyModifiedProperties(); // обновляет UI
| Binding Type | Синтаксис |
|---|---|
| Simple | ${propertyName} |
| With Format | ${propertyName:0.00} (требует SmartFormat integration) |
| Nested | ${inventory.items.Array.data[0].name} |
⚠️ Важно:
UIDocument.panelSettingsдолжен быть назначен.- В runtime:
UIDocument.component.gameObject.SetActive(false)не останавливает рендеринг — используйтеdocument.rootVisualElement.style.display = DisplayStyle.None.IMGUIContainer— для встраивания legacy UI (избегать в новых проектах).
2. Localization (com.unity.localization)
Архитектура
| Элемент | Описание |
|---|---|
Locale | Язык + регион (en, ru-RU, zh-Hans). Добавляется в Localization Settings. |
String Table (String Table Collection) | Коллекция строк: Table Name, Entry Id, Key, Value. |
Term | Плейсхолдер: {PlayerName}, {ItemCount} — для динамических строк. |
Localized String | Компонент для GameObject: Table Reference, Table Entry Reference, Format Arguments. |
Smart | Расширение форматирования: pluralization, gender, conditional. |
SmartFormat — синтентаксис
"Вы собрали {ItemCount:plural:zero=ничего|one=1 предмет|few={ItemCount} предмета|many={ItemCount} предметов|other={ItemCount} предметов}."
Runtime API
// Получение строки
var table = LocalizationSettings.StringDatabase.GetTable("GameText");
string text = table.GetEntry("WELCOME_MESSAGE").Format("Player1");
// Смена локали
await LocalizationSettings.Instance.SetLocaleAsync(locale);
// События
LocalizationSettings.SelectedLocaleChanged += OnLocaleChanged;
| Настройка | Расположение |
|---|---|
Localization Settings | Project Settings > Localization |
Asset References | String Table → Asset Table (для спрайтов, аудио) |
Google Sheets Sync | Требует com.unity.localization.google-sheets |
⚠️ Производительность:
- Кэшируйте
LocalizedString.GetLocalizedString()— повторные вызовы с теми же аргументами не аллоцируют.- Избегайте
LocalizedString.GetLocalizedString()вUpdate— используйтеOnLocaleChanged.
3. Test Framework (com.unity.test-framework)
Типы тестов
| Тип | Атрибут | Выполняется | Особенности |
|---|---|---|---|
| EditMode | [Test] | Вне игрового цикла | Быстро, доступ к private/protected, Editor assemblies. |
| PlayMode | [UnityTest] | Внутри PlayMode | Доступ к GameObject, MonoBehaviour, Time. |
| Performance | [PerformanceTest] | В PlayMode | Метрики: GC, FPS, duration. |
Жизненный цикл
| Атрибут | Вызывается |
|---|---|
[OneTimeSetUp] | Один раз перед всеми тестами в классе |
[SetUp] | Перед каждым тестом |
[TearDown] | После каждого теста |
[OneTimeTearDown] | Один раз после всех тестов |
Assertion API
| Метод | Пример |
|---|---|
Assert.AreEqual(expected, actual) | Assert.AreEqual(42, result) |
Assert.IsTrue(condition) | Assert.IsTrue(obj.activeSelf) |
Assert.Throws<T>(code) | Assert.Throws<ArgumentNullException>(() => method(null)) |
LogAssert.Expect(LogType.Warning, "message") | Проверка логов |
yield return new WaitForSeconds(1f) | В [UnityTest] |
Performance Testing
[PerformanceTest]
public IEnumerator Movement_Speed()
{
var obj = new GameObject().AddComponent<Rigidbody>();
yield return Measure.Frames()
.WarmupCount(10)
.MeasurementCount(50)
.Run(() =>
{
obj.AddForce(Vector3.forward);
});
}
| Метрика | Единица |
|---|---|
GC.Alloc | байты |
Duration | секунды |
FrameCount | кадры |
FPS | frames per second |
⚠️ Практика:
EditModeтесты — для pure-логики, алгоритмов, serialization.PlayMode— для интеграции с движком.- В CI:
Unity.exe -runTests -testPlatform EditMode -logFile -→ вывод в stdout.
4. Cloud Services
Unity Cloud Build (UCB)
| Настройка | Описание |
|---|---|
| Targets | Android_Development, iOS_Release — комбинация platform + config. |
| Build Hooks | preBuild.sh, postBuild.sh — скрипты на агенте. |
| Variables | UNITY_USERNAME, UNITY_PASSWORD — для license activation. |
| Artifacts | .apk, .ipa, .zip — доступны по URL или через API. |
Plastic SCM (Unity Version Control)
| Команда CLI | Описание |
|---|---|
cm checkout /main@rep:project | Переключение на ветку. |
cm add . | Добавление новых файлов. |
cm checkin -c "message" | Коммит. |
cm merge /main@rep:project | Слияние. |
cm cloud sync | Синхронизация с облаком. |
.plasticignore | Пример |
|---|---|
*.meta | Library/ |
Temp/ | UserSettings/ |
Unity Services Dashboard
| Сервис | Назначение |
|---|---|
| Analytics | События: customEvent, transaction, userAttribute. |
| Remote Settings | Динамические параметры: float, string, bool. |
| Authentication | Anonymous, Apple, Google, Custom. |
| Cloud Code | JavaScript-функции на сервере (аналог Cloud Script). |
| Economy | Валюты, предметы, баланс. |
⚠️ Миграция:
Unity Analytics→Unity Gaming Services (UGS).Unity IAP— теперь частьUnity Monetization.Unity AdsиUnity LevelPlay— объединены вUnity Ads Monetization.
5. Editor Scripting
EditorWindow
public class MyWindow : EditorWindow
{
[MenuItem("Tools/My Window")]
public static void ShowWindow() => GetWindow<MyWindow>("My Tool");
private void OnGUI()
{
if (GUILayout.Button("Process"))
Process();
}
private void OnInspectorUpdate() => Repaint(); // автообновление
}
| Метод | Вызов |
|---|---|
OnGUI() | При перерисовке окна. |
OnEnable() | При открытии/фокусе. |
OnDisable() | При закрытии/потере фокуса. |
OnInspectorUpdate() | Каждые 0.1s (по умолчанию). |
CustomEditor
[CustomEditor(typeof(PlayerStats))]
public class PlayerStatsEditor : Editor
{
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(serializedObject.FindProperty("health"));
serializedObject.ApplyModifiedProperties();
}
}
| Метод | Применение |
|---|---|
OnSceneGUI() | Рисование в сцене (handles, gizmos). |
OnPreviewGUI() | Превью в инспекторе (для ScriptableObject). |
RequiresConstantRepaint() | return true — постоянный Repaint(). |
PropertyDrawer
[CustomPropertyDrawer(typeof(RangeFloat))]
public class RangeFloatDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
var minProp = property.FindPropertyRelative("min");
var maxProp = property.FindPropertyRelative("max");
EditorGUI.MinMaxSlider(position, label, minProp, maxProp, 0f, 100f);
}
}
Build Pipeline (Callbacks)
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 Settings | Bundle Identifier | com.company.game — должен быть уникальным. |
Version / Bundle Version Code | 1.0.0 / 100 — версия отображаемая / внутренний инкремент. | |
Minimum API Level | Android 5.0 (API level 21) — минимум для IL2CPP. | |
Target API Level | Automatic / API level 34 (Android 14) — для Google Play (требуется ≥ 33 с 2024 г.). | |
Scripting Backend | IL2CPP (обязательно для 64-bit). | |
Target Architectures | ARM64 (обязательно), ARMv7 (опционально). | |
| Publishing Settings | Keystore | Create New / Use Existing — release signing. Debug: debug.keystore. |
Build | Internal (монолитный APK), Gradle (рекомендуется), ADT (устарело). | |
Split Application Binary | Enable → base.apk + UnityData (для >100 МБ). |
Player Settings (iOS)
| Параметр | Описание |
|---|---|
Target SDK | Device SDK (release), Simulator SDK (debug). |
Architecture | ARM64 (обязательно), ARM64 + Simulator (для тестирования в Xcode). |
Strip Engine Code | Удаляет неиспользуемые модули движка (экономия 20–50 МБ). |
Bitcode | Disabled (Apple не требует с 2023 г.). |
Camera Usage Description | Обязательно, если используется камера (иначе rejection в App Store). |
Supported URL Schemes | Для deep linking: mygame://. |
Permissions (Android)
| Permission | Где объявить | Runtime? |
|---|---|---|
INTERNET | AndroidManifest.xml (автоматически при Networking) | Нет |
WRITE_EXTERNAL_STORAGE | Player Settings > Publishing > Custom Main Gradle Template | Да (Android 6.0+) |
VIBRATE | AndroidManifest.xml | Нет |
ACCESS_FINE_LOCATION | Через plugin или Plugins/Android/AndroidManifest.xml | Да |
Пример runtime-запроса (Android):
if (!Permission.HasUserAuthorizedPermission(Permission.FineLocation))
Permission.RequestUserPermission(Permission.FineLocation);
Deep Linking
| Платформа | Реализация |
|---|---|
| Android | AndroidManifest.xml: |
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="mygame" android:host="open" />
</intent-filter>
Обработка: Application.absoluteURL → OnApplicationFocus(true). |
| iOS | Info.plist:
<key>CFBundleURLTypes</key>
<array>
<dict><key>CFBundleURLSchemes</key><array><string>mygame</string></array></dict>
</array>
Обработка: AppDelegate → UnityAppController → Application.absoluteURL. |
⚠️ Важно:
- На iOS:
LSApplicationQueriesSchemes— если открываете другие приложения (whatsapp://,tg://).Application.absoluteURLвозвращаетnull, если игра запущена не из ссылки.
2. Сетевые решения
Unity Transport (com.unity.transport)
| Компонент | Описание |
|---|---|
UnityTransport | Транспортный уровень: UDP (на основе Netcode.Transports). |
| Protocols | UNET (устарело), Ruffles (новый, с congestion control). |
| Channels | ReliableSequenced, Unreliable, UnreliableSequenced. |
| Connection Approval | Серверная валидация подключения (токены, bans). |
Netcode for GameObjects (com.unity.netcode.gameobjects)
| Понятие | Описание |
|---|---|
NetworkObject | Компонент на GameObject: Spawn With Scene, Destroy With Scene. |
NetworkVariable<T> | Синхронизируемая переменная: ReadPermission, WritePermission, OnValueChanged. |
Rpc | [ServerRpc], [ClientRpc] — remote procedure calls. Поддержка Delivery (Reliable/Unreliable). |
NetworkBehaviour | Базовый класс: IsServer, IsClient, IsLocalPlayer, OwnerClientId. |
Пример:
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 Server | Unity Relay (UGS) — сервер-посредник (STUN/TURN). |
| UPnP | Автоматическое пробрасывание портов (ненадёжно). |
| Manual Port Forwarding | Указание порта в настройках роутера. |
| Connection Approval Token | Защита от подделки: JWT, подписанный сервером. |
⚠️ Ограничения:
NetworkVariable<T>поддерживает толькоINetworkSerializableтипы:int,float,FixedString,NetworkList<T>.ClientRpcбезTargetрассылается всем клиентам — избегайте в hot paths.NetworkSceneManager— для загрузки сцен:LoadScene,UnloadScene,ClientSynchronizationMode.
3. Оптимизации
Static Batching
| Условие | Требования |
|---|---|
Static flag | GameObject должен быть Static (в инспекторе). |
| Одинаковый материал | Все объекты — один Material. |
| Не анимированы | Нет скелетной анимации, morph targets. |
Результат: объединение в один mesh при сборке. В редакторе:
Window > Analysis > Frame Debugger→StaticBatcher.Combine.
GPU Instancing
| Условие | Требования |
|---|---|
| Одинаковый mesh/material | Все инстансы — один Mesh + Material. |
Enable GPU Instancing | В инспекторе материала (URP/HDRP: GPU Instancing). |
| Поддержка шейдера | #pragma multi_compile_instancing, UNITY_INSTANCING_BUFFER_START. |
| Метод | Описание |
|---|---|
Graphics.DrawMeshInstanced(mesh, submeshIndex, material, ...) | Ручной вызов (до 1023 инстансов). |
Graphics.DrawMeshInstancedIndirect(...) | Через compute buffer (миллионы). |
Texture Atlasing
| Инструмент | Описание |
|---|---|
| Sprite Atlas (2D) | Create > Sprite Atlas → Drag sprites → Pack Preview. |
| Texture2D.PackTextures | Runtime атласинг (избегать в runtime — аллокации). |
| Shader Keywords | UNITY_TEXTURE_ALPHASPLIT_DISABLE — для alpha-split текстур. |
LOD (Level of Detail)
| Компонент | Свойства |
|---|---|
LOD Group | LOD 0..5: Screen Relative Transition Height, Renderers. |
LOD Bias | В Quality Settings — смещение автоматического выбора LOD. |
Culling | Animate Physics, Cross Fade — управление переходами. |
Occlusion Culling
| Шаг | Действие |
|---|---|
| 1 | Пометить Occluder Static / Occludee Static. |
| 2 | Window > Rendering > Occlusion Culling → Bake. |
| 3 | Настройка: Smallest Occluder, Smallest Hole, Backface Threshold. |
| Результат | Просмотр в Scene View > Occlusion Culling → Visualization. |
⚠️ Советы:
- Избегайте
Mesh.CombineMeshesв runtime — используйте static batching заранее.Shader.Find("Standard")→ кэшируйте ссылки.MaterialPropertyBlock— для изменения параметров без инстансинга материала.
4. Сторонние интеграции
Firebase (com.google.firebase)
| Пакет | Назначение |
|---|---|
Firebase Analytics | События, пользовательские параметры. |
Firebase Crashlytics | Отчёты об ошибках (включая native crashes). |
Firebase Remote Config | Динамические параметры (GetLong("speed")). |
Firebase Cloud Messaging | Push-уведомления. |
Инициализация:
FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task => {
if (task.Result == DependencyStatus.Available)
FirebaseAnalytics.LogEvent("game_start");
});
Sentry (io.sentry.unity)
| Функция | Описание |
|---|---|
SentrySdk.CaptureMessage("Info") | Логирование. |
SentrySdk.CaptureException(ex) | Исключения. |
ConfigureScope | Добавление тегов: scope.SetTag("level", "5"). |
BeforeSend | Фильтрация событий. |
Discord (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). |
versioning | None, Automatic, Custom. |
androidVersionCode | Автоматическое увеличение: $(date +%s). |
Постобработка
| Действие | Инструмент |
|---|---|
| APK Signing | apksigner (Android), codesign (iOS). |
| ProGuard/R8 | Уменьшение размера (Android). |
| AssetBundle Upload | aws s3 cp, az storage blob upload. |
| Test Reports | nunit3 → PublishTestResults@2 (Azure). |
⚠️ Практика:
- Используйте
--no-graphicsв CI для ускорения.Unity.exe -quit -batchmode -nographics -logFile - -executeMethod BuildScript.PerformBuild.- Кэшируйте
Library/между сборками (осторожно: может вызывать артефакты).