包通信
关于不同包之间通信所需了解的一切
在 nanos world 中,主要有两种与其他**包(Packages)**进行交互的方式。 在本页面中,我们将详细解释如何进行操作。
自定义事件
在同一端(Side)与包进行通信
自定义事件是向其他包发送或接收通用数据或信息的更简单方式:
package-one/Server/Index.lua
local my_parameter1 = 123
local my_parameter2 = "hello there"
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) -- 收到 123
Console.Log("Received " .. parameter2) -- 收到 hello there
Console.Log("Received " .. parameter3) -- 收到 table
end)
通过网络发送数据
通过网络发送信息与在同一端发送没有区别:
Server/Index.lua
local my_parameter1 = "cool data from network"
-- 向所有玩家广播此事件
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("Received " .. parameter1) -- 收到 cool data from network
end)
提示
有关使用自定义事件的更多信息和示例,请参阅 Events。
全局导出变量
另一种通信方式是使用 Package.Export() 方法,它允许全局暴露变量(表、函数等),以便所有其他包都可以直接访问它们。
信息
与事件不同,导出的函数可以向调用者返回信息。 但导出的函数仅在同一端(服务端或客户端)可用。
导出函数
借此,你可以像这样导出函数,例如:
package-one/Server/Index.lua
-- 定义一个你想要导出的函数
function SpawnCoolWeapon(location, rotation)
local cool_weapon = Weapon(location or Vector(), rotation or Rotator(), ...)
return cool_weapon
end
-- 导出函数以供其他包调用
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)
从另一个包中调用导出的函数
现在你可以直接从其他包中访问它:
package-two/Server/Index.lua
-- 调用导出的函数
local cool_weapon = SpawnCoolWeapon(Vector(), Rotator())
package-two/Server/Index.lua
-- 调用导出的表
local awesome_result = MyAwesomeLibrary.CoolMethod(123, 456)