先给出官方教程的链接(2016.12.31测试有效,版本Unity3D5.5)
https://unity3d.com/cn/learn/tutorials/topics/multiplayer-networking
然后是官方对于Network系统的一些概念
https://docs.unity3d.com/Manual/UNetConcepts.html
本文不是教程的形式,仅针对自己学习过程中的关键点进行记录,需要教程的得自己看看官方的相关链接。
(使用的语言为C#)
1、NetworkBehaviour
网络的基础类,继承自 MonoBehaviour。如果需要支持网络特性,那么你需要继承的是 NetworkBehaviour
而不是 MonoBehaviour。
2、NetworkManager、NetworkIdentity
关键的两个组件。
NetworkManager,网络管理类,常用的就2套+1:
NetworkManager.Singleton —— 那个1,管理类的单例
StartServer() StopServer() —— 开启 / 关闭本地的服务器
StartClient() StopClient() —— 开启 / 关闭本地的客户端
NetworkIdentity,所有网络相关的 GameObject / Prefab 都需要添加的组件(“所有”含 NetworkManager,以支持网络特性)
3、上手必用:NetworkManagerHUD、NetworkTransform
NetworkManagerHUD : 附在 NetworkManager 的 GameObject 上的 HUD,以完成基础的交互功能。
经过本人测试,也就是调用 NetworkManager 单例的那两套方法(开关服务器和客户端)
NetworkTransform : 实现对象的 transform 的同步。仅能实现简单的同步,一般来说用于环境物体还是很方便的。
4、那些看起来很炫的标记
[SyncVar] 、 [SyncEvent] 同步变量和同步事件
标记了服务器和客户端上需要同步的变量和事件,在对标识的变量或时间进行操作时,会同时将信息发送至服务器与客户端。
最简单的例子,在未标记 [SyncVar] 的情况下,生成的对象其对应变量为默认值,而标记 [SyncVar] 的情况下,得到的是同步的值。
[ClientRpc] 、[Command]
这两个是交叉工作的。ClientRpc 由服务器发起调用,在客户端执行, Command 由客户端发起调用,在服务器执行。
书写代码时注意函数的前缀分别为 Rpc 和 Cmd。
被标记的函数,不会在另一端上执行,也不会给出任何提示。
[ServerCallback] 、[ClientCallback]
服务器回调函数和客户端回调函数。
服务器回调函数仅会在服务器执行。
客户端毁掉函数仅会在客户端执行。
需要注意的是:与上一组相同,这种调用的屏蔽作用是一定的,而且不会有任何提示,所以需要自己在关键点进行LOG。
[Server] 、[Client]
与前面两组不同,这一组仅仅作为标识的作用。
Unity 引擎不会主动屏蔽被 [Server] 、[Client] 和标识的函数的调用,只会在 Unity Console 中进行警告。
经过测试还发现:这一组的标识可以和前两组的标识并存,至于有什么好处,本人暂时还没开发出来。
各个标记之间,简单的关系如下图:
5、配置
在对组件以及方法进行标记时,可以添加配置信息
[NetworkSettings ( channel = 0, sendInterval = 0.333f ) ] —— 对组件进行配置
[ClientRpc ( channel = 1 )] —— 对方法进行配置,这里仅以 ClientRpc 为例
channel 即通信通道, sendInterval 为发送间隔时间
6、在世界中生成对象
NetworkServer.Spawn( GameObject prefab, Vector3 pos, Quaternion rot)
如果仅仅进行实例化 Instantiate , 那么仅仅会在调用的端生成对象,且不会进行同步。
如果使用 NetworkServer.Spawn() 进行生成的话,可以实现所有端均进行生成,
同时在客户端连接时,可以自动完成同步(同步时会同步 [SyncVar] 所标记的变量)。
对于 NetworkBehaviour 的研究仍在继续.......