Unreal
Если вы создавали игры в Unreal, вам нужно знать несколько ключевых отличий, чтобы начать работу в All Out!
Это руководство предназначено для разработчиков Unreal Engine (Blueprints / C++), переходящих на All Out и CSL (собственный язык скриптинга All Out).
Большой сдвиг (ментальная модель)
В Unreal вы часто мыслите в терминах:
Акторы в мире (созданные, реплицируемые, принадлежащие)
Компоненты прикреплённые к акторам
Графы Blueprint / C++ управляющие геймплеем
RPC + репликация вы явно пишете
В All Out вы обычно мыслите в терминах:
Сущности в сцене (с компонентами)
Компоненты (предоставляемые движком + ваши собственные компоненты CSL)
Способности для действий игрока (мобильный UI в первую очередь + кулдаун + прицеливание)
Общий предсказуемый геймплей где синхронизация состояния автоматическая (для большей части геймплея не нужны собственные RPC-обвязки)
2D-преобразования директивы using
v2позиция и масштаб плюс один угол поворота
Быстрое сопоставление: Unreal → All Out / CSL
UWorld / Уровень
Сцена
Сущности существуют в сцене; вы также можете создавать и уничтожать их во время выполнения.
AActor
Сущность
У сущностей есть 2D-преобразования и компоненты.
Положение актора
Entity.local_position / world_position
Определите, как Unreal X/Y/Z сопоставляется с 2D-плоскостью X/Y в игре.
Поворот актора
Entity.local_rotation
All Out использует один угол поворота в градусах.
Масштаб актора
Entity.local_scale
All Out использует v2; в игровом процессе нет масштаба по Z.
UActorComponent
Component
Вы пишете геймплей, создавая компоненты CSL и прикрепляя их к сущностям.
BeginPlay
ao_start
Точка входа жизненного цикла компонента.
Tick(float DeltaTime)
ao_update(dt) / ao_late_update(dt)
Используйте позднее обновление для шаблонов UI/ввода, используемых движком (например, кнопок способностей).
Графы Blueprint
код CSL
Текстовый, компилируется как часть вашего проекта.
Pawn/Character
Player_Base подклассы
Логика вашего игрока обычно находится в Player компоненте/классе.
Сопоставления ввода
Способности + привязки клавиш
Ориентировано на мобильные устройства: предпочитайте кнопки способностей сырому вводу.
Репликация (Реплицируемые переменные)
Автоматическая синхронизация состояния
Пишите один предсказуемый путь геймплея вместо отдельных клиентской и серверной версий.
RPC (Сервер, Клиент, NetMulticast)
Обычно не требуется
Используйте возможности движка (например, уведомления) вместо разрастания собственных RPC.
Создание актора
Scene.create_entity() / Scene.instantiate(Prefab_Asset)
Префабы — это ассеты, и их можно инстанцировать.
UAsset ссылки
get_asset(...)
Ассеты находятся в /res и на них ссылаются по пути.
Ваш первый файл CSL (imports)
В CSL используется единый шаблон импорта от «корня»: импортируйте в main.csl, и не разбрасывайте импорты по каждому файлу.
Сущности и компоненты (в отличие от Actors и Components)
Создание сущности во время выполнения
Добавление и доступ к компонентам
Написание собственного компонента (жизненный цикл)
Глобальные процедуры жизненного цикла выполняются в каждой участвующей симуляции сцены; они не только серверные. Клиенты, подключившиеся позже, могут получить компонент, у которого жизненный цикл start уже отработал, поэтому при необходимости перестраивайте представление из синхронизированного состояния в ao_on_state_sync при необходимости. См. Жизненный цикл игры/кадра.
Итерация по сущностям/компонентам
Действия игрока: используйте Способности (вместо сырого ввода)
Проекты Unreal часто начинают с привязок ввода (Enhanced Input), а затем строят поверх них UI/UX. В All Out, Способности являются способом по умолчанию реализовывать действия игрока с:
Единообразным дружелюбным к мобильным устройствам интерфейсом кнопок
Кулдауны
Необязательное прицеливание (перетаскивание для прицеливания на мобильных устройствах, прицеливание мышью на ПК)
Рисуйте кнопки способностей с помощью Player.ao_late_update этого игрока is_local_or_server():
См.: Способности полный API и шаблоны.
Сеть: «репликация» — это не ваша задача (в большинстве случаев)
Что отличается от репликации Unreal
Обычный геймплей выполняется на предсказывающем клиенте и авторитетном сервере.
Обычно вы не пишете RPC для стандартных игровых потоков.
Вам всё равно нужно проектировать с учётом нескольких игроков — избегайте глобального состояния; храните состояние каждого игрока на экземпляре игрока.
Не защищайте обычный геймплей с помощью
Game.is_server()иначе вы отключите предсказание.
UI игрока vs локальные визуальные переопределения
Используйте эти шаблоны:
is_local_or_server()для ввода + игрового UIis_local()только для визуальных переопределений, специфичных для игрока
См. Основы сетевого взаимодействия.
Ассеты, префабы и пути
Метод /res папке
Ассеты находятся в /res. При ссылке на ассеты опускайте /res из пути.
Префабы
Префабы — это ассеты, и их можно инстанцировать через Сцена:
События столкновений и overlap (частая ошибка в Unreal)
Включённый коллайдер с is_trigger установленным может вызывать on_trigger_start, on_trigger_stay, а on_trigger_end. Каждый коллбэк получает trigger collider и other collider. А Movement_Agent не требуется.
CSL не предоставляет общего коллбэка для столкновения с твёрдым объектом, эквивалентного OnHit. Используйте trigger для игрового поведения пересечений. Для широкого обнаружения запрашивайте компоненты поблизости:
См.: Навмеш и столкновения.
Различия в UI (UMG vs CSL UI)
Игры All Out ориентированы на мобильные устройства, поэтому избегайте UX только для клавиатуры. Используйте UI-утилиты движка и кнопки способностей.
Для собственного UI начните с Основы UI или UIDoc Quick Start.
Поток матча, инвентарь, интерактивные объекты
Если вы ищете аналоги распространённых игровых систем Unreal:
Интерактивные объекты: Интерактивные объекты
Inventory: Inventory
Подбор игроков / хаб-игры: Подбор игроков / хаб-игры
Агенты перемещения / NPC: Агенты перемещения / NPC
Анимации Spine (если вы использовали Paper2D / flipbook-анимации): Spine
Подводные камни при переходе с Unreal на CSL
Не стройте собственный слой RPC/репликации: начните с общего предсказуемого пути геймплея и позвольте движку синхронизировать состояние.
Не защищайте геймплей с помощью
Game.is_server(): обычный геймплей должен также выполняться на предсказывающем клиенте.Избегайте глобальных синглтонов для состояния геймплея: к игре подключается несколько игроков; храните состояние на игроке или на соответствующем экземпляре компонента.
Импорты централизованы: импортируйте папки один раз из
main.csl, а не в каждом файле.Отдавайте предпочтение Способностям для действий: так они последовательно решают мобильный UX + кулдауны + прицеливание.
Переносите 3D-дизайн в 2D: используйте слои рендерера вместо Z-трансформации.
Следующие шаги
Прочтите Способности
Прочтите Навмеш и столкновения
Просмотрите Интерактивные объекты и Inventory
Последнее обновление