For the complete documentation index, see llms.txt. This page is also available as Markdown.

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 префаба (создаётся в редакторе)

Окно иерархии

Окно инспектора

Instantiate(prefab)

Scene.instantiate(prefab_asset)

Start() / Update()

ao_start / ao_update(dt) жизненный цикл

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

  • Скрипты: ваш игровой код находится в .csl файлах. Новые проекты начинаются с main.csl которая импортирует движок и определяет точки входа жизненного цикла. См. Начало работы с CSL.

  • Ассеты: игровые ассеты находятся в каталоге /res и на них ссылаются по пути без этот /res префикса (пример: "ui/button.png" ). См. Ассеты и ресурсы.

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

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

  • Импортируйте "core:ao" в main.csl

  • Если вы добавите папку (например, ui/), импортируйте папку один раз в main.csl

  • Избегайте добавления импортов в других файлах

Пример:

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

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

  • Start() / Awake()

  • Update() / LateUpdate()

  • OnDestroy()

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

  • Глобальные процедуры в main.csl (для настройки уровня игры)

  • Методы жизненного цикла компонентов на ваших компонентах

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

Глобальные процедуры жизненного цикла выполняются в каждой участвующей симуляции сцены; они не только для сервера. Клиенты, подключившиеся позже, могут получить компонент, у которого уже отработал стартовый жизненный цикл, поэтому перестраивайте представление из синхронизированного состояния в ao_on_state_sync при необходимости. См. Жизненный цикл игры/кадра.

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

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

  • Создание: см. Префабы

  • Создание во время выполнения:

Связанные экземпляры сохраняют свойства корня, но изменения полей компонентов внутри экземпляра не являются независимыми переопределениями. См. Префабы.

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

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

Затем добавьте свой компонент к сущности в Инспектор и настройте значения для каждой сущности.

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

Паттерны Unity:

  • new GameObject() / Instantiate()

  • FindObjectOfType<T>(), GetComponentsInChildren<T>()

Паттерны All Out:

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

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

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

См. Навмеш и коллизии.

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

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

  • Игровой ввод/UI: рисуйте его от игрока в ao_late_update внутри is_local_or_server().

  • Визуальные переопределения для конкретного игрока: используйте is_local().

См. Основы сетевого взаимодействия.

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

  • Менеджеры-одиночки: предпочитайте состояние на уровне игрока или сущности вместо глобального GameManager одиночек в стиле

  • Привычки импорта: импортируйте движок и папки из main.csl (не разбрасывайте импорты по многим файлам).

  • Проверки сервера: не оборачивайте обычный геймплей в Game.is_server().

  • 3D-преобразования: решите, как дизайн отображается в 2D-сцене, и используйте слои рендерера для порядка отрисовки.

  • Предположение об одиночной игре: всегда думайте «что произойдёт, если подключатся 10 игроков?»

  • Жёстко заданный ввод для настольного ПК: избегайте обязательного использования клавиатуры/мыши, если это не задумано специально.

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

Последнее обновление