放下本该属于自我的一部分

Defold what should be part of self

提问人:Trying_to_work 提问时间:5/13/2020 更新时间:11/16/2023 访问量:116

问:

我应该在游戏对象中放置什么作为自我的字段和方法? 我应该把位置和速度作为场吗?我应该用什么方法自己? ob 的字段应该是什么? 我应该把速度和位置作为

self.velocity = vmath.vector3()

或类似的东西

go.velocity = vmath.vector3()

方法 Lua 放电

评论


答:

1赞 britzl 5/17/2020 #1

该对象是脚本实例值的 Lua 用户数据存储。你放在那里完全取决于你。将值存储在其中的好处是,对象被传递给脚本的所有生命周期函数(init、final、update、on_input、on_message、on_reload)。这意味着您可以快速访问所有函数中的变量。selfselfself

将速度存储在 self 中是一个很好的示例,您可能希望在脚本的不同位置访问和修改某些内容。例如,在按下按钮时将速度设置为某个值(以 on_input 为单位),然后在更新中使用相同的速度值来移动对象。

go.velocity = vmath.vector3()

这不好。您正在做的是将变量分配给全局可访问的命名空间,其中包含引擎提供的用于操作游戏对象的函数。velocitygo.*

0赞 Felipe Suarez 11/16/2023 #2

基本上,有三种方法可以在游戏对象脚本中声明变量:

  1. name = 'Felipe' (全局变量)
  2. local name = 'Felipe' (局部变量 :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