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

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

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() для ввода + игрового UI

  • is_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:

Подводные камни при переходе с Unreal на CSL

  • Не стройте собственный слой RPC/репликации: начните с общего предсказуемого пути геймплея и позвольте движку синхронизировать состояние.

  • Не защищайте геймплей с помощью Game.is_server(): обычный геймплей должен также выполняться на предсказывающем клиенте.

  • Избегайте глобальных синглтонов для состояния геймплея: к игре подключается несколько игроков; храните состояние на игроке или на соответствующем экземпляре компонента.

  • Импорты централизованы: импортируйте папки один раз из main.csl, а не в каждом файле.

  • Отдавайте предпочтение Способностям для действий: так они последовательно решают мобильный UX + кулдауны + прицеливание.

  • Переносите 3D-дизайн в 2D: используйте слои рендерера вместо Z-трансформации.

Следующие шаги

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