NetworkManager

NetworkManager

NetworkManager是一个组件,用来管理网络多人游戏的状态。

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

  • 游戏状态管理
  • 派生管理
  • 场景管理
  • Debugging信息
  • 比赛选择(Matchmaker)
  • 用户自定义

使用NetworkManager

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

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

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

游戏状态管理

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

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

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

 

派生(网络实例化)管理

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 不需要在玩家物体上调用。

场景管理

大多数游戏有多个场景。通常在屏幕至少有一个标题或开始菜单场景添加到实际的游戏场景中。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)

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

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

  1. // 当有客户端连接时调用
  2. public virtual void OnServerConnect(NetworkConnection conn);
  3. // 当有客户端断开时调用
  4. public virtual void OnServerDisconnect(NetworkConnection conn)
  5. {
  6. NetworkServer.DestroyPlayersForConnection(conn);
  7. }
  8. // 当有客户端准备(Ready)时调用
  9. public virtual void OnServerReady(NetworkConnection conn)
  10. {
  11. NetworkServer.SetClientReady(conn);
  12. }
  13. // 当生成对象到客户端时调用
  14. public virtual void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
  15. {
  16. var player = (GameObject)GameObject.Instantiate(playerPrefab, playerSpawnPos, Quaternion.identity);
  17. NetworkServer.AddPlayerForConnection(conn, player, playerControllerId);
  18. }
  19. // 当玩家从客户端销毁时调用
  20. public virtual void OnServerRemovePlayer(NetworkConnection conn, short playerControllerId)
  21. {
  22. PlayerController player;
  23. if (conn.GetPlayer(playerControllerId, out player))
  24. {
  25. if (player.NetworkIdentity != null && player.NetworkIdentity.gameObject != null)
  26. NetworkServer.Destroy(player.NetworkIdentity.gameObject);
  27. }
  28. }
  29. // 当服务器发生错误时调用
  30. public virtual void OnServerError(NetworkConnection conn, int errorCode);

在客户端调用的方法:

  1. // 当连接到服务器时调用
  2. public virtual void OnClientConnect(NetworkConnection conn)
  3. {
  4. ClientScene.Ready(conn);
  5. ClientScene.AddPlayer(0);
  6. }
  7. // 当断开服务器时调用
  8. public virtual void OnClientDisconnect(NetworkConnection conn)
  9. {
  10. StopClient();
  11. }
  12. // 当网络问题时调用
  13. public virtual void OnClientError(NetworkConnection conn, int errorCode);
  14. // 告诉服务器没准备好时调用
  15. public virtual void OnClientNotReady(NetworkConnection conn);

Matchmaker会调用的方法:

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

===================================================================

 

转载于:https://www.cnblogs.com/dragonz001/p/9885611.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#知识点总结系列:3、C#中Delegate和Event

一、Delegate委托可以理解为一个方法签名。 可以将方法作为另外一个方法的参数带入其中进行运算。在C#中我们有三种方式去创建委托,分别如下: public delegate void Print(string str);static void delegatemethod(string str){Console.WriteLine(str);}…

js获得7天后的日期时间

思路:当前日期天数7 直接上代码: function getSpecialTime() {var currentDate;var arry currentDate.split("-");var year parseInt(arry[0],10);var month parseInt(arry[1],10);var day parseInt(arry[2],10); //月份的方法&#xff…

python的2种字符串格式化输出

字符串格式化代码(typecode) 法一: %格式使用下面的格式 %[(name)] [flags] [width][.precision] typecode (name)输出字典的value使用,这里的name是字典的key(实际指定时,必须有外面的圆括号) …

JS弹出DIV并使整个页面背景变暗功能的实现代码

1.首先写一个遮罩层div&#xff0c;然后再写一个弹窗的div <!-- 遮罩层 --> <div id"cover" style"background: #000; position: absolute; left: 0px; top: 0px; width: 100%; filter: alpha(opacity30); opacity: 0.3; display: none; z-index: 2 &…

dos命令测试网络连通情况

telnet测试端口命令&#xff1a; telnet IP地址 端口号 或者 telnet 域名 端口号traceroute指令让你追踪网络数据包的路由途径&#xff0c;命令&#xff1a; traceroute ip地址

Python中字典合并的四种方法

字典是Python语言中唯一的映射类型。映射类型对象里哈希值&#xff08;键&#xff0c;key&#xff09;和指向的对象&#xff08;值&#xff0c;value&#xff09;是一对多的的关系&#xff0c;通常被认为是可变的哈希表。字典对象是可变的&#xff0c;它是一个容器类型&#xf…

jar包打开闪退

第一种方法&#xff1a; 步骤一&#xff1a;新建一个文本文档&#xff0c;输入内容"javaw -jar %1 "&#xff0c;并保存为批处理文件&#xff0c;例如"run.bat "。 步骤二&#xff1a;右键点击.jar格式的文件 &#xff0c;选择其打开方式 为上面建的run.ba…

从零开始的全栈工程师——js篇2.12(面向对象)

面向对象 Js一开始就是写网页特效&#xff0c;面向过程的&#xff0c;作者发现这样写不好&#xff0c;代码重复利用率太高&#xff0c;计算机内存消耗太大&#xff0c;网页性能很差。 所以作者就收到java和c的影响&#xff0c;往面向对象靠齐。Js天生有一个Object&#xff0c;但…

java,js获取数组最大/小值

js最小值&#xff1a; var minValue Math.min.apply(null,args[]);js最大值 var maxValue Math.max.apply(null,args[]);JDK8特性&#xff1a;java最大值&#xff08;整数数组&#xff09;&#xff1a; int[] A {6,7,8,2,1,3,4,5}; int maxVal Arrays.stream(A).max().g…

20172332 2017-2018-2 《程序设计与数据结构》第七周学习总结

20172332 2017-2018-2 《程序设计与数据结构》第七周学习总结 教材学习内容总结 第十一章 二叉查找树 1.二叉查找树&#xff1a;一种带有附加属性的二叉树。即每个结点其左孩子都要小于其父结点&#xff0c;而父结点又小于或等于其右孩子。&#xff08;左孩子<父结点<右孩…

JAVA读取本地图片并展示

代码如下&#xff1a; //读取本地图片输入流 FileInputStream inStream new FileInputStream("D:/image/123.jpg");//byte数组用于存放图片字节数据 byte[] buff new byte[inSteam.available()];inStream.read(buff); inStream.close();//设置发送到客户端的响应内…

Java中map关于putAll()和“=”的区别

putAll()方法&#xff1a; 相同的key&#xff0c;map1.putAll(map2); map1中的key-value会被覆盖。 不同的key&#xff0c;map2中的key-value会被追加到map1中。“”的使用&#xff1a; map1 map2; map1中所有的key-value都会被map2中的key-value覆盖。

Neo4j简介

1、什么是Neo4j   Neo4j是由java实现的开源NOSQL图数据库   数据库分为关系型和非关系型两种类型。   其中非关系型又分为Graph(图形),Document(文档),Cloumn Family(列式)&#xff0c;以及Key-Value Store(KV),   这四种类型数据库分别使用不同的数据结构进行存储。因…

js比较日期大小

//获取当前时间 var currentTime new Date();//自定义时间 var customTime"2019-03-01 00:00:00"; customTime customTime.replace("-","/");//替换字符&#xff0c;变成标准格式 customTime new Date(Date.parse(customTime));if(currentT…

Docker-容器数据卷

docker容器数据卷相当于外置的移动硬盘 docker容器数据卷主要功能是&#xff1a;容器的持久化、容器间继承共享数据 特点&#xff1a; &#xff08;1&#xff09;数据卷可以容器之间共享或重用数据 &#xff08;2&#xff09;卷中更改可以直接生效 &#xff08;3&#xff09;数…

weblogic的输出打印日志设置

设置路径&#xff1a; 1、服务器——》控制&#xff0c;进入服务器设置 2、服务器启动——>设置参数 3、参数配置&#xff1a; -Xms2048m -Xmx4096m -XX:PermSize256m -XX:MaxPermSize512m -XX:UseConcMarkSweepGC -XX:CMSClassUnloadingEnabled -XX:DisableExplicitGC -…

支持向量机——Large Margin Classifier

支持向量机的目标是 \[\underbrace {\min }_\theta \left\{ {C\left[ {\sum\limits_{i 1}^m {{y^{\left( i \right)}}{\mathop{\rm Cos}\nolimits} {t_1}\left( {{\theta ^T}{x^{\left( i \right)}}} \right) \left( {1 - {y^{\left( i \right)}}} \right){\mathop{\rm Cos}\…

WebLogic清理缓存

清除缓存路径&#xff1a; D:\Oracle\Middleware\user_projects\domains\my_domain\servers\AdminServer\cache D:\Oracle\Middleware\user_projects\domains\my_domain\servers\AdminServer\tmp D:\Oracle\Middleware\user_projects\domains\my_domain\servers\AdminServer\…

洛咕11月月赛

当时只打了十几分钟&#xff0c;以为T1是结论题看了几分钟去看T2&#xff0c;写完贪心就不想做咕掉了。 T1 暴力就能A。如果用数组开大点&#xff0c;打表发现开到\(M*7\)即可。记得取模。当然可以滚掉数组。懒得给CODE。 T2 显然是贪心。只需从最低的跳到最高的&#xff0c;再…

怎么查询表中BLOB字段的大小

返回的是字节&#xff08;B&#xff09; select DBMS_LOB.GETLENGTH(name) from table;