【Unity学习笔记】Unet
自己总结的知识点:
1.有两种类型的远程过程调用:
命令(Commands)— 由客户端发起,运行在服务器上。需要给这个函数添加[Command]属性,并且为函数名添加“Cmd”前缀
客户端远程过程调用(ClientRpc)—服务器发起,运行在客户端上。需要给函数添加[ClientRpc]属性,并且为函数名添加“Rpc”前缀。
当你编写与Unet相关的脚本时,别忘了加上using unityengine.networking。使用这两种类型的远程过程调用或者使用syncvar(同步变量)时,别忘了脚本继承自networkbehavior类(当你新建一个脚本,默认继承自monobehavior类)
需要注意,在客户端需要有权限的NetworkIdentity组件才能调用Command命令。
2.这篇博客详细介绍了 networkmanager这个组件,配合官方文档看挺好的:
3.NetworkManager这个组件里有一个静态属性(Static Properties)singleton,我一开始其实还不太了解这个的用途,官方解释如下:
。但其实这个特别方便。因为一个游戏里面只有网络管理器,所以你便可以直接获取到这个网络管理器以便使用NetworkManager里的各种方法和属性。比如你想在另外一个脚本里获取整个网络的在线人数(numPlayers)。如果是传统的方法你可能需要先Gameobject.Getcomponent<>()来获取到networkmanager这个组件进而使用其中的属性和方法。但是现在你只需要在另一个脚本里使用NetworkManager.singleton.numPlayers即可。
4.NetworkBehavior类下面有一个方法OnStartLocalplayer。可以override这个方法来实现本地角色和其他角色的不同颜色
5.当你在unity编辑器中做了一些修改并保存,然后想打开多个游戏来测试你的联网功能,别忘了按ctrl+B,来保存你的修改。否则你直接打开项目文件夹下的exe文件,可能这个exe游戏文件并不是最新的
6.当你在Client端destroy掉你的player时,Server端也会自动删除掉player。官方文档如下:
7.在计算机中,argument和parameter是一个意思,都是参数的意思
8.关于syncvar同步变量 ,官方解释如下:
大意是: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.
对于有一个有子物体的物体,NetworkIdentity必须放在根物体,继承了NetworkBehaviour的脚本也是
12.
当你的某个脚本继承自NetworkBehaviour,需要一个NetworkIdentity组件来让这个脚本起作用。
13.可以通过调用NetworkManager.ServerChangeScene()在游戏处于活动状态时更改场景。这使所有当前连接的客户端更改场景,并更新networkSceneName,以便新客户端也加载新场景。
14.![【Unity学习笔记】Unet 【Unity学习笔记】Unet](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzM4LzYzNGU3ZWEwZjViZGRlMGFlMzRkNTQ2ZDE4YzkwMmU2LkpQRUc=)
15.使用NetworkTransform来同步Player的transform时,当你改变player子物体的transform,NetworkTransform不会自动帮你同步子物体的transform。但Unet提供一个组件NetworkTransformChild来帮助你同步子物体的Transform
相关写的好的博客:
Unity5网络模块UNet介绍 (这篇文章讲得比较深)