> For the complete documentation index, see [llms.txt](https://docs.allout.game/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.allout.game/all-out-docs/ru/perekhod-s-drugikh-instrumentov/unity.md).

# Unity

Если вы создавали игры в Unity, вам нужно знать несколько ключевых отличий, чтобы начать работу в All Out!

***

Если вы пришли из Unity, вам будет привычно **сущности + компоненты**, а **иерархия**, а **инспектор**, и повторно используемые **префабы**. Самое большое изменение мышления в том, что игры All Out — это **в первую очередь многопользовательские**: обычный игровой процесс выполняется на предсказывающем клиенте и авторитетном сервере, а движок синхронизирует поддерживаемое состояние за вас.

## TL;DR: Что отличается от Unity

* **Мультиплеер включён по умолчанию**: обычно вы **не** пишете RPC, SyncVars или логику спавна Netcode.
* **Пишите один игровой путь**: не оборачивайте обычный геймплей в `Game.is_server()` или вы отключите предсказание.
* **Осознанно подходите к UI игрока**:
  * Рисуйте игровой UI игрока из состояния этого игрока `ao_late_update` внутри `is_local_or_server()`.
  * Используйте `is_local()` только для визуальных переопределений, специфичных для игрока.
* **Избегайте глобального состояния синглтонов**: несколько игроков подключаются к одной сессии. Предпочтительно хранить состояние у игрока или в компонентах мира.
* **Геймплей All Out — 2D**: позиция и масштаб используют `v2`, а поворот — это один угол в градусах.
* **В первую очередь для мобильных**: избегайте предположений, что есть только клавиатура, если только ваша игра явно не ориентирована на ПК.

## Сопоставление концепций (Unity → All Out)

| Unity                     | All Out                                                           |
| ------------------------- | ----------------------------------------------------------------- |
| Сцена                     | Сцена (мир)                                                       |
| GameObject                | Сущность                                                          |
| Transform                 | 2D-преобразование сущности (позиция/поворот/масштаб)              |
| Компонент / MonoBehaviour | Компонент (класс CSL, наследующий от `Component`)                 |
| Prefab                    | Asset префаба (создаётся в редакторе)                             |
| Окно иерархии             | [Иерархия](/all-out-docs/ru/ispolzovanie-redaktora/hierarchy.md)  |
| Окно инспектора           | [Инспектор](/all-out-docs/ru/ispolzovanie-redaktora/inspector.md) |
| `Instantiate(prefab)`     | `Scene.instantiate(prefab_asset)`                                 |
| `Start()` / `Update()`    | `ao_start` / `ao_update(dt)` жизненный цикл                       |

## Структура проекта: где находятся «скрипты» и «ассеты»

* **Скрипты**: ваш игровой код находится в `.csl` файлах. Новые проекты начинаются с `main.csl` которая импортирует движок и определяет точки входа жизненного цикла. См. [Начало работы с CSL](/all-out-docs/ru/skripting/syntax.md).
* **Ассеты**: игровые ассеты находятся в каталоге `/res` и на них ссылаются по пути **без** этот `/res` префикса (пример: `"ui/button.png"` ). См. [Ассеты и ресурсы](/all-out-docs/ru/osnovnye-koncepcii-dvizhka/assets-and-resources.md).

### Импорты (важное отличие)

В Unity каждый C#-скрипт компилируется и может использовать собственные `директивы using` . В All Out держите импорты централизованно:

* Импортируйте `"core:ao"` в `main.csl`
* Если вы добавите папку (например, `ui/`), импортируйте папку **один раз** в `main.csl`
* Избегайте добавления импортов в других файлах

Пример:

```go
// main.csl
import "core:ao"
import "ui" // необязательно: подключает все файлы из /scripts/ui в область видимости
```

## Жизненный цикл: MonoBehaviour → CSL

В Unity вы обычно прикрепляете `MonoBehaviour` к GameObject и реализуете:

* `Start()` / `Awake()`
* `Update()` / `LateUpdate()`
* `OnDestroy()`

В CSL вы обычно используете:

* Глобальные процедуры в `main.csl` (для настройки уровня игры)
* Методы жизненного цикла компонентов на ваших компонентах

Пример компонента:

```go
// orbiter.csl
Orbiter :: class : Component {
    center: v2;
    radius: float;
    speed: float;
    angle: float;

    ao_start :: method() {
        center = entity.local_position;
        radius = 2.0;
        speed = 1.0;
        angle = 0.0;
    }

    ao_update :: method(dt: float) {
        angle += speed * dt;
        offset := v2{cos(angle) * radius, sin(angle) * radius};
        entity.set_local_position(center + offset);
    }
}
```

Глобальные процедуры жизненного цикла выполняются в каждой участвующей симуляции сцены; они не только для сервера. Клиенты, подключившиеся позже, могут получить компонент, у которого уже отработал стартовый жизненный цикл, поэтому перестраивайте представление из синхронизированного состояния в `ao_on_state_sync` при необходимости. См. [Жизненный цикл игры/кадра](/all-out-docs/ru/skripting/game-frame-lifecycle.md).

## Префабы: Unity Prefabs → префабы All Out

Префабы All Out создаются в редакторе и могут повторно использоваться или создаваться во время выполнения.

* **Создание**: см. [Префабы](/all-out-docs/ru/ispolzovanie-redaktora/prefabs.md)
* **Создание во время выполнения**:

```go
spawn_enemy :: proc() {
    prefab := get_asset(Prefab_Asset, "Enemies/BasicEnemy.prefab");
    e := Scene.instantiate(prefab, {10, 5});
}
```

{% hint style="info" %}
Связанные экземпляры сохраняют свойства корня, но изменения полей компонентов внутри экземпляра не являются независимыми переопределениями. См. [Префабы](/all-out-docs/ru/ispolzovanie-redaktora/prefabs.md).
{% endhint %}

## «Сериализованные поля» (переменные, доступные в инспекторе)

В Unity используются `[SerializeField]` и публичные поля для отображения значений в Инспекторе. В CSL используйте `@ao_serialize` чтобы сделать поле доступным в редакторе.

```go
Damage_On_Touch :: class : Component {
    @ao_serialize damage: int = 10;
}
```

Затем добавьте свой компонент к сущности в [Инспектор](/all-out-docs/ru/ispolzovanie-redaktora/inspector.md) и настройте значения для каждой сущности.

## Создание и поиск: Instantiate/Find → API сцены

Паттерны Unity:

* `new GameObject()` / `Instantiate()`
* `FindObjectOfType<T>()`, `GetComponentsInChildren<T>()`

Паттерны All Out:

```go
// Создание и удаление сущностей
e := Scene.create_entity();
e.set_local_position({0, 0});
e.destroy();

// Перебор сущностей (когда вам действительно нужно «всё»)
for e2: entity_iterator() {
}

// Перебор компонентов определённого типа
for player: component_iterator(Player) {
}
```

## Коллизии и триггеры

Включённый коллайдер с `is_trigger` установленным может вызывать `on_trigger_start`, `on_trigger_stay`и `on_trigger_end`. Каждый callback получает триггерный коллайдер и другой коллайдер. А `Movement_Agent` не требуется.

CSL не предоставляет общего callback для твёрдого контакта, эквивалентного `OnCollisionEnter`. Используйте триггер для поведения входа/выхода. Для широкого обнаружения запрашивайте близлежащие компоненты:

```go
nearby: [..]Pickup;
Scene.get_all_components_in_range(entity.local_position, 2.0, ref nearby);

for p: nearby {
    // проверить расстояние / применить эффект / и т. д.
}
```

См. [Навмеш и коллизии](/all-out-docs/ru/osnovnye-koncepcii-dvizhka/navmesh-and-collision.md).

## Мышление для мультиплеера: ввод, UI и «где выполняется код»

В Unity вы часто можете предполагать, что «мой клиент владеет моим персонажем». В All Out пишите геймплей один раз для общей предсказанной ветки:

* **Игровой ввод/UI**: рисуйте его от игрока в `ao_late_update` внутри `is_local_or_server()`.
* **Визуальные переопределения для конкретного игрока**: используйте `is_local()`.

См. [Основы сетевого взаимодействия](/all-out-docs/ru/skripting/networking-fundamentals.md).

## Типичные подводные камни при переходе с Unity на All Out

* **Менеджеры-одиночки**: предпочитайте состояние на уровне игрока или сущности вместо глобального `GameManager` одиночек в стиле
* **Привычки импорта**: импортируйте движок и папки из `main.csl` (не разбрасывайте импорты по многим файлам).
* **Проверки сервера**: не оборачивайте обычный геймплей в `Game.is_server()`.
* **3D-преобразования**: решите, как дизайн отображается в 2D-сцене, и используйте слои рендерера для порядка отрисовки.
* **Предположение об одиночной игре**: всегда думайте «что произойдёт, если подключатся 10 игроков?»
* **Жёстко заданный ввод для настольного ПК**: избегайте обязательного использования клавиатуры/мыши, если это не задумано специально.

## Куда двигаться дальше

* [Начало работы с CSL](/all-out-docs/ru/skripting/syntax.md)
* [Иерархия](/all-out-docs/ru/ispolzovanie-redaktora/hierarchy.md)
* [Инспектор](/all-out-docs/ru/ispolzovanie-redaktora/inspector.md)
* [Префабы](/all-out-docs/ru/ispolzovanie-redaktora/prefabs.md)
