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实现玩家对象的连接。
服务器/主机上调用的方法有:
- // 当有客户端连接时调用
- 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(0);
- }
- // 当断开服务器时调用
- 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)
===================================================================
转载于:https://www.cnblogs.com/dragonz001/p/9885611.html
NetworkManager相关推荐
- network-manager
1 sudo /etc/init.d/network-manager stop //停止network-manager服务 2 3 sudo /etc/init.d/networking start ...
- LINUX下面NetworkManager和network冲突的问题
2019独角兽企业重金招聘Python工程师标准>>> LINUX下面NetworkManager和network冲突的问题 2017年07月01日 23:40:10 ID_EAGL ...
- stopping NetworkManager daemon failed
1 初次安装NetworkManager时发现,无法将这个服务关闭 2 上网找了一圈,也没找到原因 3 重启服务器后就能正常关闭了 4 将该服务删除重装也能正常关闭 5 下回重装系统时再观察一下 转载 ...
- NetworkManager 冲突
今天看centos7的视频的时候发现视频里总是配置ip失败,明明什么都对的,没有错误 至少在逻辑上是没有的 情况发生 1.centos7会自动启动这个服务,NetworkManager服务,重启后ip ...
- linux centos7 NetworkManager 命令行网络配置工具 nmcli 简介
目录 nmcli命令与配置文件对应关系 修改配置文件的主机名 查看网卡信息 显示具体的网络接口信息 显示所有设配状态 修改配置文件执行生效 显示所有活动连接 删除一个网卡连接 添加一个网卡连接 网络接 ...
- centos7 开启 关闭 NetworkManager
开启 NetworkManager cat <<EOF >/etc/NetworkManager/nm-system-settings.conf [main] plugins=ifu ...
- centos7 network-manager 与 interfaces 冲突
网络配置有两种方式:图形界面方式(network-manager)和修改/etc/network/interfaces 但是如果两种方式的网络设置不同,就会产生冲突,即:network-manager ...
- Ubuntu中启用关闭Network-manager网络设置问题!
Ubuntu中启用关闭Network-manager网络设置问题! [Server版本] 在UbuntuServer版本中,因为只存有命令行模式,所以要想进行网络参数设置,只能通过修改/etc/net ...
- CentOS重新加载网卡报错 Active connection path: /org/freedesktop/NetworkManager/ActiveConnection/23
重新加载网卡时出现的错误如下: 1 [root@vdb1 dev]# service network restart 2 Shutting down interface eth0: Device st ...
- Linux networkmanager
我们开发的网络,出于保密,只能叫XXX网络,或者我更倾向于称之为WTF-network 由于经常处于封闭的环境,刚一接触新一点的世界,总是有那么一点猝不及防.最近发现配置的静态路由经常消失,经发现是n ...
最新文章
- gcc 与 glibc 的关系 glibc版本查看
- Hadoop—常见面试题
- MySQL入门 (六) : 字元集与资料库
- 如何将多个Excel合并到一个Excel中?
- 函数的参数,参数为数组
- [android]实现拖动效果
- 重磅!容器存储解决方案蓝皮书发布
- 统计案例 | 统计数据会说谎?
- 磁流体和两相磁流体的无条件能量稳定解耦算法
- 南京大学中国史考研考情与难度、参考书及上岸前辈备考经验指导
- Hadoop实战-MR倒排索引(三)
- 用java实现五子棋
- 【1错笔记】psd面试——最长回文子序列 动态规划(2000字超详细解题)
- push代码到git上报错failed to push some refs to ‘远程仓库地址‘问题
- ITE平台开发 chapter5之jperf测试网络吞吐量
- 视频去水印软件哪个好用?
- 马尔可夫决策过程的一些个人理解
- 以前的的华为手机可不可以用鸿蒙系统_华为启用鸿蒙系统之后,之前的华为手机可以更换成鸿蒙系统吗?...
- 视频播放,DirectShow 以及 DsPack
- 记一次线上OOM问题分析与解决
热门文章
- linux内核死锁检测机制 | oenhan,Linux内核CPU负载均衡机制 | OenHan
- desktop docker 无法卸载_关于Docker:Docker – 无法移除死容器
- jwt token 太长_理解 JWT 鉴权的应用场景及使用建议
- vue生成静态html文件_vue单文件组件,如何生成.html文件
- 通信与计算机技术的联系,通信技术与计算机技术融合发展论文
- 阿尔伯塔大学2019计算机科学 cs,[阿尔伯塔大学]计算机/计算机工程专业
- 计算机命令秒退,Win10专业版下ping命令闪退自动关闭的解决办法
- mysql 严格模式_MySQL 开启/关闭 严格模式(Strict Mode)
- python递归查找_[Python]递归查找文件(最简洁)
- 计算机二维动画的核心技术是什么意思,数字化技术在二维动画设计中的应用研究...