Откажитесь от того, что должно быть частью себя

Что я должен указать в качестве полей и методов 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.* пространство имен, содержащее предоставленные движком функции для управления игровыми объектами.

По сути, у вас есть три способа объявления переменных в скриптах игровых объектов:

  1. name = 'Фелипе' (глобальная переменная)
  2. локальное имя = 'Фелипе' (локальная переменная: v)
  3. 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
Другие вопросы по тегам