扩展类
如何扩展 nanos world 类,nanos world 提供了内置的方法来扩展和自定义类
注意
此功能目前仍处于实验性阶段,你可以在其正式发布前进行体验并提供反馈!
注意
扩展类非常有用,可以加速开发进程。 尽管代码可能会变得非常复杂,且对于新手来说难以理解。 因为它将开始使用未记录在文档中的方法和访问器。
添加新方法
为类添加新方法是最直接的方式,假设我们要为 Player 添加一个新方法,只需这样做:
function Player:AddScore(score)
self:SetValue("score", self:GetValue("score", 0) + score)
end
提示
在你编写的方法内部,你可以使用 self 来访问被调用的实体实例。
然后你就可以像往常一样调用它:
local my_player = GetPlayerSomehow()
my_player:AddScore(10)
提示
扩展类仅对你当前所在的 Package 和端(客户端/服务器端)生效! 你可以在 Shared 文件夹中定义所有新方法,使其同时应用于客户端和服务器!
重写现有方法
除了创建新方法之外,还可以重写现有的方法,只需重新定义它们即可:
function Character:SetLocation(new_location)
-- ... 做些什么
end
并且你还可以调用一个名为 :Super() 的特殊方法来同时调用原始方法:
function Character:SetLocation(new_location)
-- ... 做些什么
self:Super(new_location + Vector(1, 2, 3))
end
重写 __newindex
也可以在类上添加自定义的 __newindex 元方法。
提示
__newindex 元方法是一个当你尝试在实体中设置一个值时触发的函数。 例如:my_prop.something = 123。
为此,我们只需添加一个名为 newindex 的自定义方法:
function Player:newindex(key, value)
Console.Log("设置一个 %s 值:%s = %s", tostring(self), key, tostring(value))
end
使用 __newindex 的一种有用方法是将其重写为自动调用 SetValue:
function Player:newindex(key, value)
self:SetValue(key, value)
end
local my_player = GetPlayerSomehow()
my_player.amazing_value = 123
重写 __index
提示
__index 元方法是一个当你尝试从实体中获取一个值时触发的函数。 例如:local value = my_prop.something。
为此,我们只需添加一个名为 index 的自定义方法:
function Player:index(key)
Console.Log("Getting %s value: %s", tostring(self), key)
-- ... 做些什么
return some_value
end
使用 __index 的一种有用方法是将其重写为自动调用 GetValue:
function Player:index(key)
return self:GetValue(key)
end
local my_player = GetPlayerSomehow()
local amazing_value = my_player.amazing_value