Все игры All Out построены вокруг сущностей (объекты в мире) и компонентов (поведение/данные, прикрепленные к сущностям).
Если вы раньше использовали Unity: думайте «GameObject + Components». Если вы пользовались Roblox: думайте «Instance + Scripts/Components». Основная идея та же: вы составляете игровой процесс, добавляя компоненты к сущностям.
Сущности
Сущности существуют в двух распространенных формах:
Размещенные в редакторе: они уже находятся в сцене при запуске.
Создаваемые во время выполнения: вы порождаете их из скрипта.
Создание и уничтожение сущностей
entity:=Scene.create_entity();entity->set_local_position({10,20});entity->set_local_scale({2.5,2.5});entity->set_local_rotation(0);// Когда закончите:entity->destroy();
Уничтожение сущности уничтожает и её компоненты. Не сохраняйте ссылки на компоненты после того, как уничтожите их сущность.
Перебор сущностей
Компоненты
Компоненты — это единицы поведения. Компонент «живет» на сущности и может читать/изменять эту сущность.
Получение и добавление компонентов
Перебор компонентов
Встроенные компоненты, которые вы будете часто использовать
Sprite_Renderer
Префабы (Prefab_Asset)
Префабы должны создаваться в редакторе. В скриптах вы инстанцируете их.
Spine (Spine_Animator)
Если вы используете 2D анимированных персонажей, вы часто будете работать с Spine_Animator. Смотрите Spine.
Написание собственного компонента
Создавайте новые компоненты в отдельных файлах (например, orbiter.csl) и прикрепляйте их к сущностям либо:
Вручную в редакторе, или
Во время выполнения с помощью entity->add_component(...)
Компоненты могут реализовывать обратные вызовы жизненного цикла:
ao_start()
ao_update(dt)
ao_late_update(dt) (после всех обновлений)
ao_end() (при уничтожении)
Пример:
Методы жизненного цикла для глобальных скриптов (ao_start, ao_update, ...) рассматриваются в Жизненный цикл игры/кадра.
Сериализуемые поля (@ao_serialize)
Используйте @ao_serialize чтобы сделать поле доступным в редакторе (и часто для включения сохранения/постоянства, где это применимо).
Поиск близлежащих компонентов (запросы по близости)
В CSL нет обратных вызовов коллизий. Распространенный шаблон — «запросить близлежащие компоненты и проверить расстояние».
Полезные вспомогательные функции:
Пример:
Лучшие практики
Состояние для каждого игрока должно находиться на Player. Избегайте глобальных переменных, которые ломаются при наличии нескольких игроков.
Предпочитайте компоненты для игровых поведений. В результате у вас появятся переиспользуемые части, которые можно прикреплять к разным сущностям.
Держите косметическую работу локальной. UI/частицы обычно должны выполняться за is_local() проверки.