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

扩展类

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