如果只是想要制作一个简单的模组,只需要将所有的操作都放在主机即可,主机会自动向客机发从数据。
这篇文章主要用于添加物品文字显示,也就是鼠标悬浮于物品上现实的文字,而不涉及复杂的网络编程。
一、为何会涉及到网络数据传输
通过将需要显示的文字衔接在物品原有名称之后的方法,为物品添加文字介绍,这一操作,只能在客机的代码部分进行,若在主机代码部分进行,则无法添加成功。
而在客机执行时,由于主机部分代码还未初始化,客机部分不会获得任何有效的有关于该预制体的数据,所以也无法添加我们想要的信息显示。(因为每次对预制体初始化时,都是按从上到下,从客机到主机部分的有序执行)
此时就需要获取主机中原本就保存的数据,来作为我们显示的信息。
当然,如果这个物品时第一次来到这个世界,他的所有数据都还没有被保存到网络中,主机中当然也不会有这个物品的信息,为了保证我们获取的信息不为nil(若没有设置好,为nil可能会导致服务器崩溃),就需要进行相关的初始化处理,具体操作见下文。
二、在网络中传递数据
2.1 创建网络同步变量
代码示例如下:
inst.net_num = net_ushortint(inst.GUID, "net_num")
这里括号中的值,
第一个位置为该预制体在世界中唯一的ID,用以区分该预制体;
第二个位置为传递该参数时使用的名称。
2.2 设置网络同步变量的值
代码示例如下:
inst.net_num : set(inst.num)
由于网络数据需要与本地数据同步,所以每次更新inst.num的值时都需要运行上面的代码,保证数据的同步。
2.3 获取网络同步变量的值
代码示例如下:
inst.num = inst.net_num:value()
2.4 本地更新变量
代码示例如下:
inst.net_num:set_local(inst.num)
可以在主机或客机上执行,这条语句和set不同,不会触发数据同步和dirtyevent ;
下一次主机执行set(x)时,无论变量值是否改变,都会触发数据同步和dirtyevent。
此时,数据在网络中的传递已经完成。
三、显示文字
代码示例如下:
local old_GetDisplayName = inst.GetDisplayName
inst.GetDisplayName = function(self,...)
local str = ""
str = "\r\n数量:"..inst.net_num:value()
return old_GetDisplayName(self,...)
..str
end
此时我们就已经将文字插入到了原本显示的文字之后,若想改变顺序,可调整return。
四、扩展
上面的例子只用到了一种换地网络变量的类型:短整型ushortint,此外还有其他的类型可供我们在传递不同类型、不同长短的参数时使用,具体如下:
部分资料来源于longfei: 网络编程指南 - 知乎 (zhihu.com)