11

Relict Engine: Скриптовая подсистема + DevLog 20250405

финальный пост по скриптовой подсистеме

Вот, наконец и довел скриптовую подсистему до состояния, когда уже можно сказать, что она готова. Имплементированы все необходимые фичи, за исключением загрузки скриптовых сущностей из асетов (потому что асеты это отдельная большая задача), и с этим уже можно работать.

Итак, что-же мы умеем на данный момент

Первое, и основное: Проброс С++ объектов в скриптовый стек с возможностью наследования.

пример оглашения игровых классов и их скриптовых сущностей

пример оглашения игровых классов и их скриптовых сущностей

Наследование является опциональной (!) возможностью для скриптовой сущности. Наследуемая сущность указывается вторым аргументом, и не обязательно должна быть верхней в дереве наследования (можно пропустить часть классов, если нам не нужны их методы в текущей сущности). Если наследование не нужно, то требуется указать NULL (не 0, не nullptr, а именно NULL).

В юните так-же нужно не забыть зарегистрировать скриптовую сущность с помощью макроса REGISTER_SCRIPTCLASS, чтобы подсистема отправила его в виртуальную машину Lua.

Каждая скриптовая сущность может иметь, или не иметь поля. Каждое поле является методом, который может получать из виртуальной машины аргументы и возвращать в нее результат. Поддерживаются следующие типы аргумента: bool, int64_t, double, std::string, Object* и его производные (при условии наличия у них скриптовой сущности)

Функция вызывается привычным способом. Никакой дополнительной семантики не требуется

пример функции, доступной из скрипта

пример функции, доступной из скрипта

пример унаследованной функции (инвертируем результат)

пример унаследованной функции (инвертируем результат)

Наследования со стороны Lua пока-что не предусмотрено (но будет добавлено в дальнейшем) [под наследованием в данном ключе имеется ввиду наследование от Object классов, чтобы движок знал об этих сущностях. Обычное табличное наследование Lua работает]

Каждая зарегистрированная сущность сохраняется в глобальной таблице Lua и доступна в любое время для создания нового объекта, или поиска созданного ранее (как со стороны скрипта, так и со стороны C++). Для создания нового объекта используется метод NewObject, в качестве аргументов следует указать запись из глобальной таблицы Lua, которая связана с нашим С++ классом, и если необходимо, владельца нового объекта (иначе при первом же тике Сборщик мусора этот объект удалит). Для поиска объекта следует использовать метод FindObject. В качестве первого аргумента следует указать запись из глобальной таблицы Lua, а вторым, имя искомого объекта. В случае, если такой объект действительно существует, то в скрипт вернется его экземпляр. В противном случае, вернется nil

пример скрипта с вызовом Object сущности

пример скрипта с вызовом Object сущности

и результат его работы (обратите внимание, что вызов метода isPrime для ScriptedClass2 имеет инвертированный результат)

и результат его работы (обратите внимание, что вызов метода isPrime для ScriptedClass2 имеет инвертированный результат)

Короткий список изменений:

  • Переделан ScriptClass, для возможности наследования сущностей

  • Добавлен пустой класс ScriptClass_NULL для обозначения отсутствия наследования

  • Добавлен флаг Singleton (RootObject | NoInstantiate) для RelictClass шаблона

  • Добавлена спецфункция SetNull, вызываемая для void методов.

Следующим большим этапом, которым я буду заниматься после небольшого перерыва - это оконная подсистема (SDL2 или SDL3), рендер (OpenGL 4.5), математика на базе библиотеки glm и фреймворк сцен.

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"