您的位置:首页 > 其它

【Unet】Unet Network相关组件

2017-04-13 17:19 197 查看
Unet 主要通过 Hight API 构建网络 主要通过 NetWorkManager  NetworkIdentity 等







通过以上基本组件就可以构建 网络进行初步联机。

服务器(Server)和伺服器(Host)

在Unity的网络系统中,每个游戏有一个服务器和多个客户端。在没有专用服务器的情况下,其中一个客户端会同时担任服务器的角色,这台客户端被叫做伺服器(Host)。

伺服器上客户端和服务器运行在同一个进程里面。伺服器使用了一个特殊类型的客户端,叫做本地客户端(LocalClient),而其他的客户端叫做远程客户端(RemoteClient)。本地客户端与服务器的通讯是通过直接的函数调用和消息队列,因为他们在同一个进程中。实际上,他和服务器共享同一个场景。远程客户端使用常规的网络连接与服务器进行通讯。

网络系统的一个设计目标是,本地客户端和远程客户端使用同一份代码,这样开发者大多数时候只需要考虑一种类型的客户端的实现。

实例化(Instantiate)和派生(Spawn)

在Unity中,GameObject.Instantiate函数可以创建新的游戏物体。但是在网络环境下,游戏物体还必须在网络上被派生出来。这需要在服务器上创建后,同时通知所有连接的客户端也创建该物体。一旦物体被派生出来,派生系统会负责这些分布的物体的生命周期管理和状态同步。

更多信息可参考“游戏物体的派生” 一节

玩家(Player),本地玩家(Local Player)和授权(Authority)

在网络系统中,玩家物体是特殊的,每个玩家物体和一个玩游戏的真实玩家相关联,来自这个玩家的所有命令都发送给这个玩家物体。一个玩家不能操作其他玩家的玩家物体,只能操作他自己的。所以这里有一个“我的”玩家物体的概念。但一个玩家加入游戏并和一个连接相关联之后,这个玩家物体会在那个玩家的客户端上成为一个本地玩家物体。有一个属性isLocalPlayer会被设置为True,同时这个物体上的一个回调函数OnStartLocalPlayer会被调用到。下图显示了两个客户端和他们各自的本地玩家对象。

只有玩家自己的物体才会被标记上isLocalPlayer标记。这可以被用来过滤用户输入,控制绑定的相机,或者其他应该只对本地玩家进行的处理。

除了isLocalPlayer,一个玩家物体还可以拥有本地的授权。意思是拥有这个物体的那个客户端负责控制这个物体-拥有授权。这通常被用来控制物体的运动,但是也可以用作其他的用途。NetworkTransform组件会使用他,如果在客户端上被设置,他将从客户端想服务器发送移动数据。NetworkIdentity组件有一个选择框可以设置localPlayerAuthority属性。

对于非玩家物体,比如怪物,他们没有关联的客户端,所以授权是在服务器上。

在NetworkBehaviour组件中,有一个isAuthority属性,他用来控制一个物体是否有授权,所有的非玩家物体在服务器上有授权,有localPlayerAuthority的玩家物体在他们自己的客户端上有授权。

非玩家物体在客户端上的授权

从Unity 5.2开始,可以在客户端上对一个非玩家物体授权。有两种方法可以实现。

使用NetworkServer.SpawnWithLocalAuthority派生出物体,并传入进行授权的客户端的网络连接;

使用NetworkIdentity.AssignClientAuthority函数修改拥有者,传入目标客户端的网络连接。

指定授权给客户端会导致这个物体中的NetworkBehaviours类中的OnStartAuthority()函数被调用,同时属性hasAuthority将被设置为true。在其他的客户端上,hasAuthority属性将保持为false。拥有客户端授权的非玩家物体可以发送命令,像玩家对象一样。这些命令将被执行在服务器上,而不是在关联的玩家客户端上。

用客户端授权的非玩家对象,必须将NetworkIdentity中的LocalPlayerAuthority选项选中。

下面的例子派生出一个物体,并且将授权指定给派生他的客户端:

[Command]
voidCmdSpawn()
{
var Go =(GameObject)Instantiate(otherPrefab, transform.position + new Vector3(0,1,0),Quaternion.identity);
NetworkServer.SpawnWithClientAuthority(go,connectionToClient);
}

网络上下文

在NetworkBehaviour类中有一些属性,允许脚本在任何时候获得关于物体的网络上下文信息:

isServer – true 如果物体是在服务器(或伺服器)上而且已经被派生出来;

isClient – true 如果物体是在客户端上,而且已经在服务器上被创建;

isLocalPlayer – ture 如果物体是当前客户端的玩家对象

isAuthority – true 如果物体的拥有者是本地进程

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: