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

实体值

如何将数据存储在可从任何位置访问的实体中

任何 Base Entity 都可以存储自定义值,可从任何包中读取,并可选择与客户端同步。使用相同的方法,全局值也可以存储在 Server 和 Client 静态类上。

SetValue​

:SetValue() 在实体上存储一个值。在服务器上,将 sync_on_clients 传递为 true,以将其与所有客户端同步,包括稍后加入的玩家:

Server/Index.lua
-- 设置同步的 'score' 值
my_player:SetValue("score", 100, true)

设置时值会被序列化:除 function 外,接受 any 类型,Lua 引用不会保留,表会被复制到内部内存中。设置后更改表不会影响存储的值,请再次调用 SetValue() 以进行更新。

提示

同步值的每次更改都会发送给所有客户端。对于变化非常频繁的值(例如每个 Tick),建议使用带有 Reliability.Unreliable 的远程事件。

GetValue​

:GetValue() 返回一个值,如果键不存在,则返回 fallback。同步的值也可以在客户端上读取:

-- 获取 'score' 值,如果未设置则返回 0
local score = my_player:GetValue("score", 0)
提示

请注意,存储实体本身并不会因为实体被销毁而使值置空,因此,在检索实体后,最好使用 :IsValid() 来校验。

要列出实体中设置的所有键,请使用 :GetAllValuesKeys()。

全局值​

Server 和 Client 也拥有 SetValue() 和 GetValue(),用于全局存储值,而不是在实体上存储。 Server.SetValue() 同样接受 sync_on_clients,可通过 Client.GetValue() 读取,而 Client.SetValue() 的值仅存在于该客户端:

Server/Index.lua
-- 设置全局同步值,可通过 Client.GetValue 读取
Server.SetValue("round_number", 1, true)

监听值的变化​

每当值发生变化时,都会触发 ValueChange 事件,对于同步的值,也会在客户端触发。 Server 和 Client 拥有自己用于全局值的 ValueChange 事件。

Client/Index.lua
Player.Subscribe("ValueChange", function(player, key, value)
if (key == "score") then
Console.Log("%s 现在拥有 %d 分!", player:GetName(), value)
end
end)