扩展类
如何扩展 nanos world 类,nanos world 提供了内置的方法来扩展和自定义类
Extending Native Classes
此功能目前仍处于实验性阶段,你可以在其正式发布前进行体验并提供反馈!
扩展类非常有用,可以加速开发进程。尽管代码可能会变得非常复杂,且对于新手来说难以理解。因为它将开始使用未记录在文档中的方法和访问器。
添加新方法
为类添加新方法是最直接的方式,假设我们要为 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)
-- ... Do something
self:Super(new_location + Vector(1, 2, 3))
end
self:Super(...) calls the original method with the same name, and can only be used inside the overriding method. This is different from Inherited Classes, where you call the parent methods with self.Super:MethodName(...).
重写 __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