KF1 mod 开发教程
网络同步属性
互联网的概念中会有 服务器端、客户端 两种对象。 游戏中有 单人游戏、局域网游戏、专用服务器 等情况, 下面列出各种情况中 谁扮演客户端、谁扮演服务器端
不管是 单人、多人 游戏都会出现服务器端,所谓“服务端”是专门用来处理游戏主要元素; 而“客户端”接收服务端信息来同步、或向服务器发出一些请求; 游戏可以没有客户端,比如:纯粹开着一个专用服务器 没人进去。

客户端可自行处理一些内容,例如:HUD、特效 等局部效果没必要同步处理, 可以在客户端单独执行。
插件所有权
游戏中的任何物体都是对象,插件在地图中也是一个对象。 由于插件的所有权在服务器端,默认情况下 插件的代码只能在服务器端执行, 执行结果再“远程同步”到客户端上。

插件中关于所有权的属性有两个
Role:角色,默认设置为 ROLE_Authority

RemoteRole:远程角色,默认设置为 ROLE_None
默认情况下,插件的 RemoteRole=ROLE_None 表示客户端不执行。
如果想要插件在客户端可执行,请这样设置:
defaultattributes
{
	Role=ROLE_Authority
	RemoteRole=ROLE_SimulatedProxy
}
属性 Role 保持默认值即可,只需要修改 RemoteRole 远程角色为“可模拟代理”; 所谓“可模拟”就表示客户端可以进行执行,而非单纯的接收同步结果信息。

比如怪物的移动过程 是在服务器端执行,如果客户端不模拟而只接受同步结果 怪物行走将变得卡顿。 因为网络同步会有延迟,在延迟的空隙时间中 可在客户端模拟轨迹,从而提高流畅体验。

除了通过 RemoteRole 来配置远程所有权,还有一个相关性问题。
保持相关性
个人电脑的 CPU、宽带 都是有限的资源,游戏中的内容可能非常庞大; 如果地图中全部内容 都同时参与执行、网络同步,很容易导致 卡顿、掉帧等问题。

为了优化游戏体验,人们想出了一个相关性的概念,即:玩家看不到的内容 也就没必要参与执行。 不参与执行的内容 当然也不会进行客户端的网络同步。

实际上在客户端中 永远看不到插件对象,导致插件被排除在了“可执行范围内”。 所以需要一个属性 强制插件对象 不被客户端所忽视。

bAlwaysRelevant = true

目前介绍了三个网络属性 其中 Role 用默认值,就变成了只用改两个属性;
以下写法将确保 插件在客户端的基本执行

RemoteRole = ROLE_SimulatedProxy
bAlwaysRelevant = true
bAddToServerPackages = true

这里多出了一个 bAddToServerPackages 翻译为“添加到服务器包中”; 实际表示 客户端在进入房间时 会下载当前插件类。

解释:插件类被打包进了 MOD包中,这里的服务器包一般指 房间的缓存文件。


目前只是介绍几个网络属性的概念,真正执行的代码是在函数中; 下一节将开始讨论 如何写网络同步相关的函数。