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)
Сцена
Сцена (мир)
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 игроков?»
Жёстко заданный ввод для настольного ПК: избегайте обязательного использования клавиатуры/мыши, если это не задумано специально.
Куда двигаться дальше
Последнее обновление