Откажитесь от того, что должно быть частью себя
Что я должен указать в качестве полей и методов self в игровых объектах? Должен ли я указать положение и скорость как поля? Какие методы я должен использовать? Какими должны быть поля ob? Должен ли я поставить скорость и положение как
self.velocity = vmath.vector3()
или что-то вроде
go.velocity = vmath.vector3()
2 ответа
В self
объект - это хранилище пользовательских данных Lua для значений экземпляра скрипта. Что вы туда положите, полностью зависит от вас. Хорошая вещь о хранении значений вself
это то self
объект передается всем функциям жизненного цикла сценария (init, final, update, on_input, on_message, on_reload). Это означает, что у вас есть быстрый доступ к переменным во всех функциях.
Сохранение скорости в себе - хороший пример того, что вы можете захотеть получить доступ и изменить в разных местах вашего скрипта. Например, установка скорости на некоторое значение в on_input при нажатии кнопки, а затем использование того же значения скорости в обновлении для перемещения объекта.
go.velocity = vmath.vector3()
Это не хорошо. Что вы делаете там, так это присвоение переменнойvelocity
к глобально доступным go.*
пространство имен, содержащее предоставленные движком функции для управления игровыми объектами.
По сути, у вас есть три способа объявления переменных в скриптах игровых объектов:
- name = 'Фелипе' (глобальная переменная)
- локальное имя = 'Фелипе' (локальная переменная: v)
- self.name = 'Felipe' (Это должно быть внутри метода (init, update, on_message...))
Они все одинаковые? Ответ: НЕТ.
Глобальные переменные : если вы объявите глобальную переменную в скрипте, вы сможете читать и изменять эту переменную в любом другом скрипте.
*hero.script* --- (component of hero.go)
power = 100
*enemy.script* --- (component of enemy.go)
print(power) -- 100
power = power + 50
print(power) -- 150
Локальные переменные : если вы объявляете локальную переменную в скрипте, а затем назначаете этот скрипт двум разным игровым объектам, они будут использовать эту переменную совместно.
*hero.script*
local power = 100
function on_message(self, message_id, message, sender)
if message_id == hash('drink_poison') then
power = power / 2
end
end
Теперь мы добавляем компонент ./hero.script в Hero.go и Knight.go.
*enemy.script* --- (component of enemy.go)
print(power) -- undefined
*controller.script* --- (component of controller.go)
msg.post('hero', 'drink_poison')
-- (hero.go): power -> 50
-- but because knight and hero share the same script and power was declared locally then:
-- (knight.go): power -> 50
Self.variables: переменные self создают уникальные копии для каждого игрового объекта, которому назначен скрипт.
*hero.script*
function init(self)
self.power = 100
end
function on_message(self, message_id, message, sender)
if message_id == hash('drink_poison') then
self.power = self.power / 2
end
end
Теперь мы добавляем компонент ./hero.script в Hero.go и Knight.go.
*enemy.script* --- (component of enemy.go)
print(power) -- undefined
print(self.power) -- undefined
*controller.script* --- (component of controller.go)
msg.post('hero', 'drink_poison')
-- (hero.go): power -> 50
-- (knight.go): power -> 100