Скрипты для игрового актера

Я хотел бы добавить некоторые сценарии для моих моделей / актеров. Когда новая модель загружается или сценарий изменяется, актер реагирует.

На данный момент у меня есть базовый класс Lua, который имеет, например, функцию Update (), и каждая модель / субъект должна перегружать эту функцию. Но как это реализовать? Основная проблема заключается в том, что каждой модели нужно уникальное имя для класса, …

  1. Я думал о таблице, значениями ключей которой являются actorID (уникальный) и значением будет класс, унаследованный от базового класса, но это немного сложно, когда скрипт перезагружается.

    Objects[ActorID] = Model(paramater)

    Objects[ActorID].Update = function() print("Update: actor 1") end

  2. Возможно также возможно создать новое состояние Луа для каждого актера.

Я получил вдохновение для этого от двигателя Leadwerks: http://www.youtube.com/watch?v=z-EuS1EYk8o

Если кто-нибудь знает хорошую книгу по написанию скриптов в игровых движках, пожалуйста, скажите мне

Я думаю, я понял:

Вот некоторый псевдокод:

OnNewActorCreated:

//Add actor
Objects[param.ID] = createClass(baseclass)

//Check if this actor has a script to run.
if param.hasScript then

//Add the new ID to the script
Scripts[param.filename][param.ID]

Entity = Objects[param.ID]

doFile(param.filename)

Entity = nil

end

OnFileChanged:

foreach id in Scripts[changedfile] do

Entity = Objects[id]

dofile(changedfile)

Entity = nil

end

Пример скрипта:

//check if Entity is valid
if not Entity then
print("[Error] Entity is invalid")
else
function Entity:Update()
print(self.name)
end
end

Может работать;)

2

Решение

Механизм работы с видео на YouTube не зависит от перегруженной функции обновления. Причина, по которой у них есть базовые классы, заключается в том, чтобы обеспечить поведение по умолчанию и общий интерфейс для своих объектов, но не связано с фактическим обновлением чего-либо.

Они используют функциональность, представленную ОС, для прослушивания обновлений файлов (см. этот ТАК вопрос для получения дополнительной информации об этом), а затем просто выполните сценарий в игре lua_State. Поскольку сценарии изменяют только определения типов (таблицы и метатаблицы), при повторной загрузке сценария (с помощью простого luaL_dofile или эквивалентного, как я полагаю) нового определения перезаписываются старые, и lua с удовольствием обновляется, используя обновленное поведение. Если вы действительно прищуритесь и посмотрите на код, который видео показывает в редакторе, вы заметите, что они просто определяют функции, а не запускают методы Update.

В заключение: если вы создадите новые lua_States для каждого актера, вы потеряете возможность свободно передавать вещи между ними в Lua, и вам придется писать код C ++ для ручной передачи данных между двумя (или более) lua_States.

Изменить: Что касается наследования от общего базового объекта: изменение его метатаблицы изменит поведение всех объектов, поэтому мы должны защищаться от этого. Один из способов заключается в том, чтобы окружить скрипт сущности средствами защиты от изменения фактической общей метатаблицы. Перед загрузкой скрипта мы сохраняем ссылку на базу метатаблицы и заменяем ее копией, которая может использоваться скриптом.

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

Помимо вышесказанного, мы получаем дополнительное преимущество, заключающееся в том, что мы не сохраняем изменения через различные обновления. Каждый раз, когда мы хотим изменить сценарий во время выполнения, мы повторяем этот процесс и можем быть уверены, что если что-то было добавлено в предыдущем обновлении, оно не останется после того, как мы выполним обновление, удаляющее его. Если мы просто позволим сценарию перезаписывать метатаблицы, то мы не сможем удалить функции и элементы, не установив их явно nil,

2

Другие решения

Других решений пока нет …