Если вы создавали игры в Unreal, есть несколько ключевых отличий, которые вам нужно знать, чтобы начать работу в All Out!
Это руководство предназначено для разработчиков Unreal Engine (Blueprints / C++), переходящих на All Out и CSL (Пользовательский язык сценариев All Out).
Большое изменение (модель мышления)
В Unreal вы часто мыслите в терминах:
Акторы в мире (созданные, реплицируемые, принадлежащие)
Компоненты прикреплённые к акторам
графы Blueprints / C++ управляющие геймплеем
RPC + репликация вы описываете явно
В All Out вы обычно мыслите в терминах:
Сущности в сцене (с компонентами)
Компоненты (предоставленные движком + ваши собственные компоненты CSL)
Способности для действий игрока (мобильный UI в приоритете + перезарядка + прицеливание)
Геймплей с сервером в роли авторитета где синхронизация состояния выполняется автоматически (для большинства элементов геймплея не нужен свой слой RPC)
Быстрое сопоставление: Unreal → All Out / CSL
Unreal
All Out / CSL
Примечания
UWorld / Level
Сцена
Сущности существуют в сцене; их также можно создавать/удалять во время выполнения.
AActor
Сущность
У сущностей есть трансформации и компоненты.
UActorComponent
Компонент
Вы описываете геймплей, создавая компоненты CSL и прикрепляя их к сущностям.
BeginPlay
ao_start
Точка входа жизненного цикла компонента.
Tick(float DeltaTime)
ao_update(dt) / ao_late_update(dt)
Используйте позднее обновление для шаблонов UI/ввода, используемых движком (например, кнопки способностей).
Графы Blueprint
Код CSL
Текстовый, компилируется как часть вашего проекта.
Pawn/Character
Player_Base подклассы
Логика вашего игрока обычно находится в Player компоненте/классе.
Схемы ввода
Способности + привязки клавиш
Мобильный приоритет: предпочитайте кнопки способностей вместо сырого ввода.
Репликация (Реплицируемые переменные)
Автоматическая синхронизация состояния
Избегайте создания собственных схем репликации/RPC, если они действительно не нужны.
RPC (Сервер, Клиент, NetMulticast)
Обычно не требуется
Используйте средства движка (например, уведомления) вместо разрастания собственных RPC.
Создание актора
Scene.create_entity() / instantiate(Prefab_Asset)
Пресеты — это ассеты, и их можно инстанцировать.
UAsset ссылки
get_asset(...)
Ассеты находятся в /res и на них ссылаются по пути.
Ваш первый файл CSL (импорты)
В CSL используется единая схема импорта “root”: импортируйте в main.cslи не разбрасывайте импорты по каждому файлу.
Сущности и компоненты (в сравнении с акторами и компонентами)
Создание сущности во время выполнения
Добавление и доступ к компонентам
Написание собственного компонента (жизненный цикл)
Итерация по сущностям/компонентам
Действия игрока: используйте Способности (вместо сырого ввода)
Проекты Unreal часто начинают с привязок ввода (Enhanced Input), а затем строят поверх них UI/UX. В All Out, Способности — это стандартный способ реализовывать действия игрока с:
Единообразным удобным для мобильных устройств кнопочным UI
Перезарядками
Опциональным прицеливанием (перетаскивание для прицеливания на мобильных устройствах, прицеливание мышью на ПК)
Рисуйте кнопки способностей из Player.ao_late_update внутри is_local_or_server():
Сеть: «репликация» — не ваша забота (в большинстве случаев)
Что отличается от репликации в Unreal
Игровое состояние автоматически синхронизируется с сервера → клиентам.
Обычно вы не пишете RPC для стандартных игровых сценариев.
Но вам всё равно нужно проектировать с учётом нескольких игроков : избегайте глобального состояния; храните состояние каждого игрока в экземпляре игрока.
Клиентская логика vs серверная/общая логика
Используйте такие паттерны:
is_local_or_server() для ввода + игрового UI (работает на сервере + локальном клиенте)
is_local() для чисто декоративного UI/эффектов (работает только на локальном клиенте)
Ассеты, пресеты и пути
Метод /res папка
Ассеты находятся в /res. При ссылке на ассеты опускайте /res из пути.
Префабы
Пресеты — это ассеты (папки, оканчивающиеся на .prefab) и их можно инстанцировать:
События столкновений и пересечений (частая ловушка Unreal)
Если вы привыкли к callback'ам пересечения/удара в Unreal (OnComponentBeginOverlap, OnHit), имейте в виду, что в геймплее CSL часто используются запросы вместо callback'ов событий.
Распространённый паттерн: запрашивать близлежащие компоненты и проверять расстояние:
Игры All Out — с приоритетом на мобильные устройства, поэтому не стройте UX только для клавиатуры. Используйте UI-утилиты движка и кнопки способностей.
Если вам нужен собственный UI, обратитесь к документации по UI и следуйте стандартным шаблонам (не придумывайте дерево виджетов, как в UMG, если в документации не сказано иное).
Поток матча, инвентарь, интерактивные объекты
Если вы ищете аналоги распространённых игровых систем Unreal:
Анимации Spine (если вы использовали Paper2D / flipbooks): Spine
Подводные камни при переходе с Unreal на CSL
Не стройте собственный слой RPC/репликации: начните с серверно-авторитетной логики и дайте движку синхронизировать состояние.
Избегайте глобальных синглтонов для игрового состояния: подключается несколько игроков; храните состояние в игроке или в соответствующем экземпляре компонента.
Импорты централизованы: импортируйте папки один раз из main.csl, а не в каждом файле.
Предпочитайте Способности для действий: это последовательно решает мобильный UX + перезарядки + прицеливание.
Косметика vs геймплей: держите только косметические эффекты локальными; держите игровое состояние под серверным авторитетом.
Player :: class : Player_Base {
ao_late_update :: method(dt: float) {
if this->is_local_or_server() {
draw_ability_button(this, Shoot_Ability, 0);
draw_ability_button(this, Dodge_Roll, 1);
}
}
}
Player :: class : Player_Base {
ao_late_update :: method(dt: float) {
if is_local_or_server() {
// ввод + игровой UI
}
if is_local() {
// только декоративный UI/эффекты
}
}
}