Unity3D新网络组件NetworkBehaviour之HLAPI学习手记

先给出官方教程的链接(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 的研究仍在继续.......

你可能感兴趣的:(Unity3D)