自己总结的知识点:


1.有两种类型的 远程过程调用


命令(Commands)— 由客户端发起,运行在服务器上。需要给这个函数添加[Command]属性,并且为函数名添加“Cmd”前缀


客户端远程过程调用(ClientRpc)—服务器发起,运行在客户端上。需要给函数添加[ClientRpc]属性,并且为函数名添加“Rpc”前缀。


当你编写与Unet相关的脚本时,别忘了加上using unityengine.networking。使用这两种类型的远程过程调用或者使用syncvar( 同步变量)时,别忘了脚本继承自networkbehavior类(当你新建一个脚本,默认继承自monobehavior类)


需要注意,在客户端需要有权限的NetworkIdentity组件才能调用Command命令。



3.NetworkManager这个组件里有一个静态属性(Static Properties) singleton,我一开始其实还不太了解这个的用途,官方解释如下:


unity远程加载模型 远程工作 unity_客户端

。但其实这个特别方便。因为一个游戏里面只有网络管理器,所以你便可以直接获取到这个网络管理器以便使用NetworkManager里的各种方法和属性。比如你想在另外一个脚本里获取整个网络的在线人数(numPlayers)。如果是传统的方法你可能需要先Gameobject.Getcomponent<>()来获取到networkmanager这个组件进而使用其中的属性和方法。但是现在你只需要在另一个脚本里使用NetworkManager.singleton.numPlayers即可。


4.NetworkBehavior类下面有一个方法OnStartLocalplayer。可以override这个方法来实现本地角色和其他角色的不同颜色


5.当你在unity编辑器中做了一些修改并保存,然后想打开多个游戏来测试你的联网功能,别忘了按ctrl+B,来保存你的修改。否则你直接打开项目文件夹下的exe文件,可能这个exe游戏文件并不是最新的


6.当你在Client端destroy掉你的player时,Server端也会自动删除掉player。官方文档如下:



unity远程加载模型 远程工作 unity_客户端_02

大意就是,当你在客户端删除Player时,这个函数会在服务端调用,且这个函数的默认实现就是删除掉对应的Player物体


7.在计算机中,argument和parameter是一个意思,都是 参数的意思


8.关于 syncvar同步变量 ,官方解释如下:



unity远程加载模型 远程工作 unity_unity远程加载模型_03


大意是:syncvar会在准备阶段 (比如当一个client连接进来) 和每一帧的末尾从服务端同步到客户端。

同时,还有一个hook属性,当syncvar的值发生改变,会在所有客户端调用hook后面的函数。


一般的套路是,当条件发生,在server端改变syncvar的值(如果你在client端改变syncvar的值,并不会发生同步),这样Unity会帮你同步到其他客户端上。并且在所有客户端上调用钩子函数


我自己在实际项目中 ,关于Syncvar。


如果你不带hook钩子函数 ,那么如果Syncvar在server端发生变化。会在每帧自动帮你同步到所有客户端上。

如果你带hook钩子函数 ,那么你的钩子函数必须带有参数,参数就是你的Syncvar变量。且Syncvar在server端发生变化,不会帮你自动同步到客户端上,而是需要你 自己在钩子函数中进行赋值以实现同步


9.如果要使用NetworkBehavior这个类里的 isLocalPlayer属性,物体身上必须带NetworkIdentity组件。在Unity中,一个物体中( 包括子物体)只能含有一个NetworkIdentity组件


10.在 Host端,isServer为True, isClient同样为True


11.

unity远程加载模型 远程工作 unity_客户端_04

对于有一个有子物体的物体,NetworkIdentity必须放在根物体,继承了NetworkBehaviour的脚本也是


12.

unity远程加载模型 远程工作 unity_客户端_05

当你的某个脚本 继承自NetworkBehaviour,需要一个 NetworkIdentity组件来让这个脚本起作用。


可以通过调用NetworkManager.ServerChangeScene()在游戏处于活动状态时更改场景。这使所有当前连接的客户端更改场景,并更新networkSceneName,以便新客户端也加载新场景。


14.

unity远程加载模型 远程工作 unity_远程过程调用_06


15.使用NetworkTransform来同步Player的transform时,当你改变player子物体的transform,NetworkTransform不会自动帮你同步子物体的transform。但Unet提供一个组件NetworkTransformChild来帮助你同步子物体的Transform