NetworkManager是一个组件,用来管理网络多人游戏的状态。它实际上是完全使用HLAPI实现,所以它所做的一切程序员可以使用其他方式实现。然而,NetworkManager封装好了很多有用的功能到一个地方,使创建、运行和调试多人游戏尽可能简单。

NetworkManager可以使用使其完全没有脚本。在编辑器的检视面板,允许配置它的所有特性。NetworkManagerHUD供应一个简单的、默认的用户界面,允许网络游戏在运行时由用户控制。更先进的用法,开发人员可以从派生一个类继承自NetworkManager,并且自定义其行为通过重写任何它所提供的虚拟函数。

NetworkManager所具备的属性包括如下:

  • 游戏状态管理

  • 派生管理

  • 场景管理

  • Debugging信息

  • 比赛选择(Matchmaker)

  • 用户自定义

开始使用NetworkManager

NetworkManager可以作为核心控制组件在多人在线游戏中。开始,创建一个空的游戏对象在你的场景开始,或选择一个方便管理的对象。然后加入NetworkManager组件。

在编辑器的检视面板允许您配置和控制很多事情与网络有关。

NetworkManagerHUD是另一个组件,它需要跟NetworkManager一起工作。它给你提供了一个简单的用户界面,显示游戏运行控制网络状态。这是好的开始使用一个网络项目,但不是作为一个游戏的最终的UI。

游戏状态管理

网络多人游戏可以运行在三种模式——作为一个客户,作为一个专用的服务器,或者作为“主机”(同时是客户端和服务器)。连网是为了实现同样的游戏代码和资产在所有这些情况下工作。发展为单人的游戏版本和多人的游戏版本应该是一样的。

NetworkManager提供了方法进入每一个模式。

  • NetworkManager.StartClient()

  • NetworkManager.StartServer()

  • NetworkManager.StartHost()

都可用于脚本代码,所以他们可以从键盘输入调用处理程序或自定义的用户界面。默认运行时控件还可以显示调用这些函数。也有按钮可用NetworkManagerHUD检查员在播放模式,调用相同的功能。

Whatever method is used to change the game state, the properties networkAddress and networkPort are used. When a server or host is started, networkPort becomes the listen port. When a client is started, networkAddress is the address to connect to, and networkPort is the port to connect to.

无论使用何种方法来改变游戏状态,使用networkAddress和networkPort属性。当服务器或主机启动时,networkPort变得监听端口。当客户端启动,networkAddress地址连接,networkPort端口连接。

派生(网络实例化)管理

In addition to the player prefab, the prefabs of other objects that will be dynamically spawned must be registered with the ClientScene. This can be done with the ClientScene.RegisterPrefab() functions, or it can be done by the NetworkManager automatically. Adding prefabs to the spawn list will make them be auto-registered. The spawn configuration section of the NetworkManager inspector looks like:

NetworkManager可以用于管理从预制实例化网络对象。大多数游戏都有一个预设体作为主角对象,所以NetworkManager有一个位置使其拖动玩家预设体。当一个设置了一个玩家预设体,玩家对象将自动网络实例化物体在每个用户在游戏中。这适用于主机上的本地玩家,以及在远程客户端的远程玩家。注意,玩家预设体必须添加NetworkIdentity组件。

除了玩家预设体之外,其他的预设体对象想动态地产生必须在ClientScene中注册。这可以用ClientScene.RegisterPrefab()函数,也可以是由NetworkManager自动完成的。将预制体添加到列表中会让他们被自动注册。

一旦玩家预设体设置之后,应该能够在开始游戏主机中看到玩家对象了。停止游戏应该看到玩家对象被销毁。运行游戏的另一个副本和作为一个客户端连接到localhost应该让另一个玩家对象出现,和停止,客户应客户的player对象被销毁。

玩家对象产生是调用了NetworkManager的默认方法:OnServerAddPlayer。如果你想定制玩家创建对象的方式,您可以重写虚函数。默认实现是这样的:

public virtual void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
{
var player = (GameObject)GameObject.Instantiate(playerPrefab, playerSpawnPos, Quaternion.identity);
NetworkServer.AddPlayerForConnection(conn, player, playerControllerId);
}

注意NetworkServer.AddPlayerForConnection()函数必须用于创建新的玩家对象,这样就建立了与客户端的联系。这将生成对象,所以NetworkServer.Spawn 不需要在玩家物体上调用。

开始位置

控制玩家在哪里产生,你可以使用NetworkStartPosition组件。NetworkManager寻找场景中NetworkStartPosition对象,如果它发现任何一个,那么它将在该位置产生玩家并且应用其中一个。自定义代码可以访问的可用NetworkStartPositions使列表通过NetworkManager.startPositions,还有一个帮助函数GetStartPosition()在NetworkManager中可用于实现OnServerAddPlayer找到一个起始位置。

场景管理

大多数游戏有多个场景。通常在屏幕至少有一个标题或开始菜单场景添加到实际的游戏场景中。NetworkManager设置了自动管理场景状态和场景切换方式功能适用于一个多人游戏。NetworkManager有两个槽,offlineScene和onlineScene。将场景拖到槽中可以激活网络场景管理功能。

当服务器或主机启动时,onlineScene场景将被加载。这将成为当前网络场景。任何连接到服务器的客户端也会加载这个场景。这个场景的名称存储在networkSceneName属性中。

当网络停止时(服务器或主机停止了),或由客户端断开,离线场景将被加载。这使得游戏断开时自动回到菜单场景。

我们还可以在游戏中更改场景,通过调用方法NetworkManager.ServerChangeScene()。这将使所有当前连接的客户端的变化场景,并将更新networkSceneName这样新客户也会加载到新场景。

当网络场景管理激活时,任何调用游戏状态管理功能会导致场景的变化,例如:NetworkManager.StartHost()或NetworkManager.StopClient(),这适用于运行时控制UI。通过设置场景和调用这些函数很容易控制多人在线游戏的场景同步。

注意,场景变化导致所有场景中的对象被销毁。这可能包括NetworkManager!如果你想使其在场景切换过程中不销毁,确保勾选“Dont Destroy On Load”设置为true。在简单的情况下,这是最好的配置。但是,可以使其在每一个场景都有不同的NetworkManager来控制增量加载预制,或不同的场景转换。

调试信息

NetworkManagerHUD属性面板显示网络在运行时的状态额外的信息。这包括:

  • 网络连接
  • 服务器端:NetworkIdentity激活的对象
  • 客户端:NetworkIdentity激活的对象
  • 同时在线客户端

比赛安排(Matchmaking)

NetworkManager运行时UI和NetworkManager检视面板UI允许与matchmaker server交互。函数NetworkManager.StartMatchmaker()使连接,并保存在NetworkManager.matchmaker属性中。一旦被激活时,会改变默认的UI并执行回调函数使其简单的完成matchmaking。

可以继承NetworkManger重写虚方法,实现自定义回调。

用户自定义(Customization)

There are virtual functions on NetworkManager that derived classes can use to customize behaviour. When implementing these functions, be sure to take care of the functionality that the default implementations provide. For example, in OnServerAddPlayer(), the function NetworkServer.AddPlayer must be called to active the player object for the connection.

Functions invoked on the Server/Host:

继承NetworkManager之后用户可以根据需要重写很多虚方法。重写这些方法时,一定要注意方法原本实现的内容。例如,OnServerAddPlayer()函数, 必须调用方法NetworkServer。AddPlayer实现玩家对象的连接。

服务器/主机上调用的方法有:

// 当有客户端连接时调用
public virtual void OnServerConnect(NetworkConnection conn); // 当有客户端断开时调用
public virtual void OnServerDisconnect(NetworkConnection conn)
{
NetworkServer.DestroyPlayersForConnection(conn);
} // 当有客户端准备(Ready)时调用
public virtual void OnServerReady(NetworkConnection conn)
{
NetworkServer.SetClientReady(conn);
} // 当生成对象到客户端时调用
public virtual void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
{
var player = (GameObject)GameObject.Instantiate(playerPrefab, playerSpawnPos, Quaternion.identity);
NetworkServer.AddPlayerForConnection(conn, player, playerControllerId);
} // 当玩家从客户端销毁时调用
public virtual void OnServerRemovePlayer(NetworkConnection conn, short playerControllerId)
{
PlayerController player;
if (conn.GetPlayer(playerControllerId, out player))
{
if (player.NetworkIdentity != null && player.NetworkIdentity.gameObject != null)
NetworkServer.Destroy(player.NetworkIdentity.gameObject);
}
} // 当服务器发生错误时调用
public virtual void OnServerError(NetworkConnection conn, int errorCode);

在客户端调用的方法:

// 当连接到服务器时调用
public virtual void OnClientConnect(NetworkConnection conn)
{
ClientScene.Ready(conn);
ClientScene.AddPlayer();
} // 当断开服务器时调用
public virtual void OnClientDisconnect(NetworkConnection conn)
{
StopClient();
} // 当网络问题时调用
public virtual void OnClientError(NetworkConnection conn, int errorCode); // 告诉服务器没准备好时调用
public virtual void OnClientNotReady(NetworkConnection conn);

Matchmaker会调用的方法:

//当有一个比赛创建
public virtual void OnMatchCreate(CreateMatchResponse matchInfo) //当接收到比赛列表时调用
public virtual void OnMatchList(ListMatchResponse matchList) //当假如比赛时调用
public void OnMatchJoined(JoinMatchResponse matchInfo)

Unity新版网络-NetworkManager的更多相关文章

  1. Unity NGUI 网络斗地主 -发牌 脚本交互

    Unity NGUI 网络斗地主 -发牌 脚本交互 @By 灰太龙 Unity4.2.1f4 NGUI 3.0.4 本篇说的问题是脚本与控件的交互! 现在对界面进行了改进,先看副图! 1.制作发牌效果 ...

  2. Unity NGUI 网络斗地主 -制作图集 Atlas

    Unity NGUI 网络斗地主 -制作图集 Atlas by @杨海龙 开发环境   Win7+Unity4.2.1f4+NGUI 3.0.4版本 这一节告诉大家如何制作(图集)Atlas! 1.首 ...

  3. Unity NGUI 网络斗地主 -界面制作

    Unity NGUI 网络斗地主 -界面制作 源文件在群(63438968群共享!) @灰太龙 这一节说一下NGUI的界面摆放,并且教会大家使用NGUI的自适应功能! 在这里感谢@Gamer,是他给我 ...

  4. 关于Unity的网络框架

    注:Unity 5.1里引入了新的网络框架,未来目标应该是WOW那样的,现在还只是个P2P的架子. 网络的框架,无非是如何管理网络数据的收发,通信双方如何约定协议.之前做的框架与GameObject无 ...

  5. Unity多玩家网络游戏开发教程1章Unity带有网络功能

    Unity网络多玩家游戏开发教程第1章Unity自带网络功能 Unity拥有大量的第三方插件.专门提供了对网络功能的支持. 可是.大部分开发人员第一次接触到的还是Unity自带的网络功能.也就是大家常 ...

  6. Unity判断网络是否连接以及判断是否连接WiFi

    由于项目中的核心模块需要用到网络连接,所以需要首先检测用户是否有网络百度了下,有人说通过连接自己的服务器进行测试的,也有人说通过延迟来判断的最后发现原来Unity是提供了网络判断的方法的.Networ ...

  7. Unity 异步网络方案 IOCP Socket + ThreadSafe Queue

    Unity IOCP Socket + ThreadSafe Queue 1.Socket.BeginReceive系列接口在unityweb下是不正常的,页面刷新会导致问题 2.自己维护线程,会带来 ...

  8. Unity判断网络连接类型

    使用NetworkReachability判断手机游戏当前的网络连接类型,是wifi还是234G using UnityEngine; using System.Collections; public ...

  9. Unity带有网络功能——创建服务,并连接到一个特定的服务

    游戏本身需要在网络上创建服务,然后其他的游戏能够连接到这个服务,此外真实场景现在玩同样的游戏效果一起. 该方法是创建一个服务呼叫Network.InitializeServer( ): 是Networ ...

随机推荐

  1. OpenStack云桌面系列【1】—開始

    关于"云桌面"和"桌面云" 首先,wiki里面是没有关于"桌面云"和"云桌面"的定义和其他信息.     百度百科   ...

  2. 基于express+redis高速实现实时在线用户数统计

    作者:zhanhailiang 日期:2014-11-09 本文将介绍怎样基于express+redis高速实现实时在线用户数统计. 1. 在github.com上创建项目uv-tj.将其同步到本地: ...

  3. 线程池系列一:线程池作用及Executors方法讲解

    线程池的作用: 线程池作用就是限制系统中执行线程的数量.     根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数量 ...

  4. springmvc使用jQuery.datatable时遇到的错误

    springmvc使用jQuery.datatable时遇到的错误 1正确时返回 josn结果: {,,,,,,,,,,,,,,,,"} 页面显示处理中(processing),列表空白,其 ...

  5. 玲珑杯 Round #18 A -- 计算几何你瞎暴力

    因为坐标都在1-10之间,因此可暴力求解 #include <iostream> #include <cstdio> #include <cstring> #inc ...

  6. SQL传数组到存储过程中

    方法一 CREATE PROC D_t_Base_Employee @str varchar(100) as declare @sql varchar(1000) set @sql='DELETE E ...

  7. window下搭建Vue.Js开发环境

    一.安装node.js.https://nodejs.org/en/download/ 最新包会自动安装npm 二.安装完node之后,npm包含的很多依赖包是部署在国外的,在天朝,大家都知道下载速度 ...

  8. OpenStack_Swift源代码分析——Object-auditor源代码分析(2)

    1 Object-aduitor审计详细分析 上一篇文章中,解说了Object-aduitor的启动,当中审计的详细运行是AuditorWorker实现的.在run_audit中实例化了Auditor ...

  9. IOS开发人员经常使用的10个Xcode插件

    IOS开发人员经常使用的10个Xcode插件 申请达人,去除赞助商链接 一个合适的插件意味着它能够适应不同的开发环境,Sublime Text 和TextMate就是非常好的样例.你知道Xcode也支 ...

  10. OpenCASCADE Face Normals

    OpenCASCADE Face Normals eryar@163.com Abstract. 要显示一个逼真的三维模型,其顶点坐标.顶点法向.纹理坐标这三个信息必不可少.本文主要介绍如何在Open ...