跳至正文
版本:最新版 - a1.169.2 ⚖️

扩展类

如何扩展 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
备注

self:Super(...) 会调用同名的原始方法,且只能在重写的方法内部使用。这与继承类不同,在继承类中你需要使用 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