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
и результат его работы (обратите внимание, что вызов метода isPrime для ScriptedClass2 имеет инвертированный результат)
Короткий список изменений:
Переделан ScriptClass, для возможности наследования сущностей
Добавлен пустой класс ScriptClass_NULL для обозначения отсутствия наследования
Добавлен флаг Singleton (RootObject | NoInstantiate) для RelictClass шаблона
Добавлена спецфункция SetNull, вызываемая для void методов.
Следующим большим этапом, которым я буду заниматься после небольшого перерыва - это оконная подсистема (SDL2 или SDL3), рендер (OpenGL 4.5), математика на базе библиотеки glm и фреймворк сцен.






Лига Разработчиков Видеоигр
8.9K поста23.2K подписчик
Правила сообщества
ОБЩИЕ ПРАВИЛА:
- Уважайте чужой труд и используйте конструктивную критику
- Не занимайтесь саморекламой, пишите качественные и интересные посты
- Никакой политики
СТОИТ ПУБЛИКОВАТЬ:
- Посты о Вашей игре с историей её разработки и описанием полученного опыта
- Обучающие материалы, туториалы
- Интервью с опытными разработчиками
- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе
НЕ СТОИТ ПУБЛИКОВАТЬ:
- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры
- Посты, единственная цель которых - набор команды для разработки игры
- Посты, не относящиеся к тематике сообщества
Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.
ЗАПРЕЩЕНО:
- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции
- Выдавать чужой труд за свой
Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.
О РАЗМЕЩЕНИИ ССЫЛОК:
Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:
- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества
- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз
- Cсылка размещается в формате: "Страница игры в Steam: URL"