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

包通信

关于不同包之间通信你需要了解的一切

在 nanos world 中,主要有两种与其他包进行交互的方式。在本页面中,我们将详细解释如何进行操作。

自定义事件​

在同一端与包进行通信​

自定义事件是向其他包发送或接收通用数据或信息的更简单方式:

package-one/Server/Index.lua
local my_parameter1 = 123
local my_parameter2 = "你好呀"
local my_parameter3 = { important_stuff = "omg!" }

Events.Call("MyAwesomeEvent", my_parameter1, my_parameter2, my_parameter3)
package-two/Server/Index.lua
Events.Subscribe("MyAwesomeEvent", function(parameter1, parameter2, parameter3)
Console.Log("Received " .. parameter1) -- Received 123
Console.Log("Received " .. parameter2) -- Received hello there
Console.Log("Received " .. parameter3.important_stuff) -- Received omg!
end)

通过网络发送数据​

通过网络发送信息与在同一端发送没有区别:

Server/Index.lua
local my_parameter1 = "来自网络的数据"

-- 向所有玩家广播此事件
Events.BroadcastRemote("GetThisFromServer", Reliability.Reliable, my_parameter1)

local player_02 = GetPlayerSomehow()

-- 或者将此事件发送给特定玩家
Events.CallRemote("GetThisFromServer", player_02, Reliability.Reliable, my_parameter1)
Client/Index.lua
Events.SubscribeRemote("GetThisFromServer", function(parameter1, parameter2, parameter3)
Console.Log("收到 " .. parameter1) -- 收到 来自网络的数据
end)
提示

有关使用自定义事件的更多信息和示例,请参阅事件。

全局导出变量​

另一种通信方式是使用 Package.Export() 方法,它允许全局暴露变量(表、函数等),以便所有其他包都可以直接访问它们。

信息

与事件不同,导出的函数可以向调用者返回信息。但导出的函数仅在同一端(服务器或客户端)可用。

导出函数​

借此,你可以像这样导出函数,例如:

package-one/Server/Index.lua
-- Defines a function which you want to export
function SpawnCoolWeapon(location, rotation)
local cool_weapon = Weapon(location or Vector(), rotation or Rotator(), "nanos-world::SK_AK47")
return cool_weapon
end

-- Exports the function to be called by other Packages
Package.Export("SpawnCoolWeapon", SpawnCoolWeapon)

你甚至可以导出包含函数的整个表,例如用作库:

package-one/Server/Index.lua
-- 定义一个包含你想导出的函数的表
MyAwesomeLibrary = {
CoolMethod = function(a, b)
return a + b
end,
AnotherAwesomeImportantMethod = function(c, d)
return c * d
end
}

-- 导出该表以供其他包访问
Package.Export("MyAwesomeLibrary", MyAwesomeLibrary)

从另一个包中调用导出的函数​

现在你可以直接从其他包中访问它:

注意

An exported variable only exists after the Package which exports it has loaded. If your Package depends on it, add the exporting Package to the packages_requirements of your Package.toml, so it's always loaded before yours. See Package Loading & Lua Environment.

package-two/Server/Index.lua
-- 调用导出的函数
local cool_weapon = SpawnCoolWeapon(Vector(), Rotator())
package-two/Server/Index.lua
-- 调用导出的表
local awesome_result = MyAwesomeLibrary.CoolMethod(123, 456)