NetworkManager详解

NetworkManager详解直接继承自 MonoBehaviour, 还有就是被设计成了单例 singletonNetworkManager网络管理器是一个方便的HLAPI类,用于管理网络系统。       对于简单的网络应用NetworkManager网络管理器可以使用HLAPI控制。它提供了简单的方法来 启动和停止 客户端和服务器,以及管理场景,而且具有虚拟函数,用户代码可以使

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

直接继承自  MonoBehaviour,  还有就是被设计成了单例  singleton

NetworkManager 网络管理器是一个方便的HLAPI 类,用于管理网络系统 。

        对于简单的网络应用NetworkManager 网络管理器可以使用HLAPI控制 。它提供了简单的方法来  启动和停止  客户端和服务器,以及 管理场景,而且具有虚拟函数,用户代码可以使用 实现 网络事件的处理程序。NetworkManager 网络管理器一次处理一个客户端。下面的示例演示一个最小的网络设置。

using UnityEngine.Networking;public class Manager : NetworkManager {	public override void OnServerConnect(NetworkConnection conn)	{		Debug.Log ("OnPlayerConnected");	}}


NetworkManager 网络管理器是 管理网络状态的多人游戏的一个组成部分。它实际上被实现完全使用 HLAPI,所以它做的一切都是可被其他forms的开发人员使用的。然而网络管理器包装了很多有用的功能,使得创建、 运行和调试尽可能简单的多人游戏。

网络管理器可以使用完全不用脚本。它有在编辑器中有 inspector 控件,允许配置其所有功能,和 NetworkManagerHUD 提供简单、默认的用户界面,可以在运行时允许被用户控制的网络游戏。为高级的使用,开发人员可以从网络管理器派生出类 并通过重写虚函数,为它提供的任何自定义其行为。

网络管理器的功能包括:
• Game State Management
• Spawning Management
• Scene Management
• Debugging Information
• Matchmaking 匹配系统
• Customization 可定制

入门 NetworkManager

网络管理器可以作为控制组件的多人游戏的核心。若要开始,在你开始的场景,创建一个空的游戏对象或挑选一个方便管理器对象。从Network/NetworkManager菜单项,然后添加NetworkManager组件。新添加的NetworkManager应如所示:

NetworkManager详解

在编辑器中的NetworkManager的的inspector 面板上 允许您配置和控制与网络相关的很多东西。

NetworkManagerHUD 是与NetworkManager相关的的另一个组件。游戏运行控制网络状态时,它给你一个简单的用户界面。这是很好的入门知识网络项目,但不能用作游戏最终的 ui 设计。NetworkManagerHUD 看起来像:

NetworkManager详解 

真正的游戏会有正确的UI ,用于控制游戏状态 和 允许玩家选择什么样的游戏 。但是,若要开始,我们可以暂时以此来控制游戏。

Game State Management

作为客户端,作为一个专用的服务器,或作为 “Host” 是客户端和服务器在同一时间具备 ,UNet 多人游戏可以在三种模式下-运行。UNet 旨在使相同的游戏 代码和资产 在所有这些情况下工作。发展为  单人游戏版本游戏和  多人游戏版本游戏  应该是同一件事。

网络管理器  具有用于输入每一种模式的方法。NetworkManager.StartClient()、 NetworkManager.StartServer() 和 NetworkManager.StartHost()  是所有可用的脚本代码,所以它们可以被调用,从键盘输入的处理程序或自定义UI 事件 。可以选择要显示的默认运行时控件也调用这些相同的功能。也有按钮在 NetworkManagerHUD 的 inspector上,在Play 模式时调用同一函数:

NetworkManager详解

无论哪种方法用来 改变游戏状态、 networkAddress网络地址和 networkPort网络端口 属性被 使用。当启动时后的服务器 或主机 时,networkPort 成为  侦听端口。当客户端启动时,networkAddress是要连接到的地址、networkPort 是要连接到的端口。

Spawning Management

网络管理器可以用于管理网络对象从预置的实例化 。大多数游戏都有 prefab 用作player 的对象,因此网络管理器有一个 槽(字段),拖动player prefab进行赋值。当一个player prefab 设置时,player 对象会自动产生从该prefab, 为每个用户在游戏中创建。这适用于在本地player托管hosted服务器上,和远程客户端上的远程players 参与者。请注意player prefab 必须有 NetworkIdentity 组件。

除了player prefab,其他对象的预置将动态地被生成了但是必须是ClientScene登 记的。这可以通过使用 ClientScene.RegisterPrefab() 函数,或者它可以由网络管理器自动完成。添加 预置生成列表 会使他们自动注册。NetworkManager的 inspector 的字段 配置看起来像:

NetworkManager详解

一旦设置了一个player prefab ,你应该能够作为主机开始游戏,看到 player 对象产生。停止这场比赛应该使player 对象被销毁。当要运行另一个副本的游戏和 连接到本地主机的客户端应使另一个player 对象出现,并停止该客户端应该使该客户端player 对象被销毁。

 player object 被被生成是由  NetworkManager.OnServerAddPlayer 默认实现。 如果你想自定义 player object 的创建的方式,你可以重写的虚函数。默认实现是类似:

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

请注意,新创建player object.时NetworkServer.AddPlayerForConnection() 必须被调用函数,所以它是被生成和与客户端的连接相关联。这将产生的对象,所以 NetworkServer.Spawn 不需要为 player object.

Start Positions

若要控制players 被创建,在这里,你可以使用 NetworkStartPosition 组件。网络管理器查找场景中的 NetworkStartPosition 对象,如果它找到了,然后它将产生Player的位置和方向 。自定义代码可以通过NetworkManager.startPositions列表 ,访问可用的 NetworkStartPositions,也是一个 helper 函数 GetStartPosition() 对网络管理器,可以在执行 OnServerAddPlayer 用于查找起始位置。

Scene Management

大多数游戏都有多个场景。在至少有通常是标题屏幕 或 开始菜单场景 还有玩这个游戏的场景。网络管理器是设置来自动管理场景状态 和 场景切换 适合多人游戏的方式。网络管理器的属性面板 有两个插槽: offlineScene 和 onlineScene。将 场景对象拖放到这些插槽 激活网络场景管理。

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

当网络停止时,通过停止的服务器或主机,或断开连接,客户端将加载offline脱机的场景。断开多人游戏时游戏允许自动返回到菜单场景 。

通过调用 NetworkManager.ServerChangeScene(),游戏处于活动状态时,还可以更改场景。这将使所有当前连接的客户端更改场景,并将更新 networkSceneName,新客户还将加载新的场景。

虽然网络的场景管理处于活动状态,调用任何游戏状态管理功能 NetworkManager.StartHost() 或 NetworkManager.StopClient() 可导致场景变化。这适用于运行时控制 UI。所以通过设置场景 并调用这些函数很容易控制流的多人游戏。

注意,场景变化导致的所有对象在场景将被销毁。这可能包括网络管理器!  如果你想要网络管理器在转换是不被销毁,那就确保 “Dont Destroy On Load” 属性被设置为 true。在简单的情况下,这是最佳配置。但是,它是可能有网络管理器在每个使用不同的设置,以控制增量的预制加载或不同的场景切换的场景。

Debugging Information

NetworkManagerHUD 属性面板在运行时显示有关网络状态的其他信息。这包括:

• 网络连接
• 激活 NetworkIdentity 服务器对象
• 激活 NetworkIdentity 客户端对象
• client peers

另外,预览 窗口中显示所注册的客户端消息处理程序。

NetworkManager详解

Matchmaking匹配系统

网络管理器在运行时 用户界面和网络管理 inspector  UI 允许与匹配服务的交互。NetworkManager.StartMatchmaker() 函数作为匹配接口,并填充具有一个 NetworkMatch 对象的 NetworkManager.matchmaker 属性。一旦这是激活的默认 Ui 使用它和 回调函数对网络管理器让您执行简单配对。

有虚拟派生类的网络管理器的函数 可以使用自定义的 respoding 给matchmaker回调的行为。

NetworkManager详解

Customization自定义

网络管理器的派生类上的虚拟函数可以使用自定义行为。当执行这些职能时,一定要照顾的默认实现提供的功能。 例如,在 OnServerAddPlayer(),NetworkServer.AddPlayer 函数必须调用到激活的Player对象连接。

在Server/Host上调用的函数:

// called when a client connects public virtual void OnServerConnect(NetworkConnection conn);// called when a client disconnectspublic virtual void OnServerDisconnect(NetworkConnection conn){    NetworkServer.DestroyPlayersForConnection(conn);}// called when a client is readypublic virtual void OnServerReady(NetworkConnection conn){    NetworkServer.SetClientReady(conn);}// called when a new player is added for a clientpublic virtual void OnServerAddPlayer(NetworkConnection conn, short playerControllerId){    var player = (GameObject)GameObject.Instantiate(playerPrefab, playerSpawnPos, Quaternion.identity);    NetworkServer.AddPlayer(conn, player, playerControllerId);}// called when a player is removed for a clientpublic virtual void OnServerRemovePlayer(NetworkConnection conn, short playerControllerId){    UPlayer player;    if (conn.GetPlayer(playerControllerId, out player))    {        if (player.NetworkIdentity != null && player.NetworkIdentity.gameObject != null)            NetworkServer.Destroy(player.NetworkIdentity.gameObject);    }}// called when a network error occurspublic virtual void OnServerError(NetworkConnection conn, int errorCode);


在客户端调用的函数 :

// called when connected to a serverpublic virtual void OnClientConnect(NetworkConnection conn){    ClientScene.Ready(conn);    ClientScene.AddPlayer(0);}// called when disconnected from a serverpublic virtual void OnClientDisconnect(NetworkConnection conn){    StopClient();}// called when a network error occurspublic virtual void OnClientError(NetworkConnection conn, int errorCode);// called when told to be not-ready by a serverpublic virtual void OnClientNotReady(NetworkConnection conn);


匹配时调用的函数:

// called when a match is created
public virtual void OnMatchCreate(CreateMatchResponse matchInfo)

// called when a list of matches is received
public virtual void OnMatchList(ListMatchResponse matchList)

// called when a match is joined
public void OnMatchJoined(JoinMatchResponse matchInfo)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/185802.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android之按钮单击事件及监听器的实现方式

    第一种,匿名内部类作为事件监听类. Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { System.out.println(

    2022年3月9日
    78
  • activiti 事件监听_js监听事件和处理事件

    activiti 事件监听_js监听事件和处理事件本文个人博客地址:Activiti7事件监听(leafage.top)好久没有记录笔记了,最近做了一些关于工作流的事情,记录一下使用activiti7的一些经验。需求:在流程发起和流程操作的过程中,给相关人员发送流程审批的通知提醒;不要在配置流程时手动添加,不能侵入到流程操作的过程,影响流程执行;这个怎么入手呢?没搞过activiti,activiti7的官方文档写的跟屎一样烂,感觉好难呀????…文档参考性不高,那就试试看官方的示例,找到activiti的repositor

    2022年10月7日
    3
  • 简书markdown编辑器_最好的视频编辑器

    简书markdown编辑器_最好的视频编辑器Markdown是一种简单的、轻量级的标记语法。用户可以使用诸如*#等简单的标记符号以最小的输入代价生成极富表现力的文档。  Markdown具有很多优点:写作中添加简单符号即完成排版,所见即所得。让你专注于文字而不是排版。格式转换方便,Markdown的文本你可以轻松转换为html、pdf等。可以保存称纯文本  支持Markdown的编辑器太多,功能也不完全一

    2022年4月19日
    44
  • 高斯滤波原理及应用_数字图像处理高斯滤波器

    高斯滤波原理及应用_数字图像处理高斯滤波器1一维高斯分布 1.1一维高斯分布的定义 若连续型随机变量X的概率密度为:其中,为常数,则称X服从参数为,的正态分布或高斯分布,记为 1.2一维高斯分布的曲线 横轴表示可能的取值x,竖轴表示概率分布密度F(x),那么不难理解这样一个曲线与x轴围…

    2025年8月19日
    5
  • mse均方误差例题_误差函数计算器

    mse均方误差例题_误差函数计算器文章目录背景函数代码调用方法调用测试函数背景本人最近需要写多个仿真,需要大量用到MSE(均方误差)计算,于是干脆将MSE运算封装为函数,后续使用直接进行调用即可。函数代码%Project:均方误差函数%Author:Jace%Data:2021/11/01%====================函数体====================function[MSE]=MSE(Dim,Step,N,xkf,x)%====================分配空间=======

    2022年9月30日
    1
  • Linux中修改文件权限方法「建议收藏」

    Linux中修改文件权限方法「建议收藏」​一、文件类型在Linux操作系统中,一切皆文件,Linux不以扩展名来区分文件类型,而是在文件属性中有一列专门记录文件类型。普通文件:.c.cpp.h.txt.pdf用’-‘表示目录文件(文件夹):用’d‘表示管道文件(用于进程间通信的一种文件):用’p’表示链接文件(相当于Windows上的快捷方式):用’l’表示设备文件:字符设备文件(c)块设备文件(b)套接字(s)用ls-l查看文件属性信息

    2025年8月30日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号