Если вы создавали игры на Unreal, есть несколько ключевых отличий, которые вам нужно знать, чтобы начать работу в All Out!
Это руководство для разработчиков Unreal Engine (Blueprints / C++), переходящих на All Out и CSL (пользовательский язык сценариев All Out).
Большой сдвиг (ментальная модель)
В Unreal вы часто думаете в терминах:
Акторы в Мире (создаются, реплицируются, принадлежат)
Компоненты присоединены к акторам
графы Blueprint / C++ управляют игровым процессом
RPC + репликация вы создаёте явно
В All Out вы обычно будете думать в терминах:
Сущности в Сцене (с Компонентами)
Компоненты (предоставляемые движком + ваши собственные компоненты CSL)
Способности для действий игрока (ориентировано на мобильные устройства UI + время восстановления + прицеливание)
Сервер-авторитетный игровой процесс где синхронизация состояния автоматическая (без кастомной прокладки RPC для большинства игрового процесса)
Быстрая сопоставление: Unreal → All Out / CSL
Unreal
All Out / CSL
Примечания
UWorld / Level
Сцена
Сущности существуют в сцене; вы также можете создавать/удалять их во время выполнения.
AActor
Сущность
Сущности имеют трансформации и компоненты.
UActorComponent
Component
Вы создаёте игровой процесс, написав компоненты CSL и прикрепив их к сущностям.
BeginPlay
ao_start
Точка входа жизненного цикла компонента.
Tick(float DeltaTime)
ao_update(dt) / ao_late_update(dt)
Используйте позднее обновление для шаблонов UI/ввода, используемых движком (например, кнопки способностей).
Графы Blueprint
Код CSL
Текстовый, компилируется как часть вашего проекта.
Pawn/Character
Player_Base подклассы
Ваша логика игрока обычно живёт в Player компоненте/классе.
Сопоставления ввода
Способности + привязки клавиш
Ориентировано на мобильные: предпочитайте кнопки способностей вместо сырого ввода.
Репликация (Replicated переменные)
Автоматическая синхронизация состояния
Избегайте построения собственных шаблонов репликации/RPC, если это действительно не необходимо.
RPCs (Сервер, Клиент, NetMulticast)
Обычно не нужны
Используйте возможности движка (например, уведомления) вместо разрастания кастомных RPC.
Создание акторов
Scene.create_entity() / instantiate(Prefab_Asset)
Префабы являются ассетами и могут быть инстанцированы.
UAsset ссылки
get_asset(...)
Ассеты находятся в /res и ссылаются по пути.
Ваш первый файл CSL (импорты)
CSL использует единую «корневую» схему импорта: импортируйте в main.csl, и не разбрасывайте импорты по каждому файлу.
Сущности и компоненты (в отличие от Actors & Components)
Создание сущности во время выполнения
Добавление и доступ к компонентам
Написание кастомного компонента (жизненный цикл)
Итерация по сущностям/компонентам
Действия игрока: используйте Способности (вместо сырого ввода)
Проекты Unreal часто начинаются с привязок ввода (Enhanced Input), а затем строят UI/UX поверх них. В All Out, Способности являются стандартным способом реализации действий игрока с:
Последовательным удобным для мобильных интерфейсом кнопок
Временами восстановления
Опциональное прицеливание (перетаскивание для прицеливания на мобильных, прицеливание мышью на ПК)
Рисуйте кнопки способностей из Player.ao_late_update внутри is_local_or_server():
Сеть: «репликация» не ваша задача (в большинстве случаев)
Что отличается от репликации в Unreal
Игровое состояние автоматически синхронизируется с сервера → клиентам.
Как правило, вы не пишете RPC для стандартных игровых сценариев.
Вам всё ещё нужно проектировать с учётом нескольких игроков в уме: избегайте глобального состояния; храните состояние для каждого игрока на экземпляре игрока.
Логика только для клиента vs сервер/общая логика
Используйте эти шаблоны:
is_local_or_server() для вводов + игрового UI (работает на сервере + локальном клиенте)
is_local() для чисто косметического UI/эффектов (работает только на локальном клиенте)
Ассеты, префабы и пути
Папка /res Assets находятся в
. При обращении к ассетам, /resопустите из пути. /res button := get_asset(Texture_Asset, "ui/button.png");
Префабы
.prefab ) и могут быть инстанцированы:prefab := get_asset(Prefab_Asset, "Enemies/Slime.prefab");
Если вы привыкли к колбэкам пересечений/попаданий Unreal (
OnComponentBeginOverlapOnHit, ), учтите, что игровой процесс в CSL часто используетзапросы вместо обработчиков событий. Распространённый шаблон: запрашивать близлежащие компоненты и проверять расстояние:
мобильные устройства , поэтому избегайте создания UX, рассчитанного только на клавиатуру. Используйте утилиты UI движка и кнопки способностей.Если вам нужен кастомный UI, обратитесь к документации по UI и следуйте стандартным шаблонам (не придумывайте дерево виджетов, похожее на UMG, если документация этого не рекомендует).
Поток матчей, инвентарь, интерактивные объекты
Если вы ищете эквиваленты общих игровых систем Unreal:
my := entity->add_component(My_Component);
sprite := entity->get_component(Sprite_Renderer);
// Уничтожить сущность (и её компоненты)
entity->destroy();
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/эффекты
}
}
}
font := get_asset(Font_Asset, "$AO/fonts/Barlow-Black.ttf"); // ассеты движка
click := get_asset(SFX_Asset, "sfx/click.wav");
Префабы — это ассеты (папки, заканчивающиеся на
enemy_entity := instantiate(prefab);
События коллизий и пересечений (распространённая ошибка при переходе из Unreal)
nearby: [..]Pickup;
Навмеш и коллизии
for p: nearby {
// ...
}