Unity Mirror NetworkManager初识

文章目录

      • Network Manager网络管理器
        • 什么是网络管理器?
        • 通过Transports进行定制化网络连接管理
        • 自定义连接地址和端口号
        • Game State Management游戏状态管理
        • Network Manager HUD
        • 玩家预制体及其生成控制
        • Spawn Prefabs其他预制体注册
        • Scene Management场景管理

Network Manager网络管理器

什么是网络管理器?

网络管理器是一个封装了各种各样网络相关管理代码的脚本文件,它包括但不限于启动或关闭服务、生成角色、玩家状态身份管理等功能,是一个十分强大的脚本文件。

Network Manager是一个单例类型脚本组件,因此在同一个场景中只允许出现一次。

通过Transports进行定制化网络连接管理

transport为官方预留出来的自定义网络连接接口组件,他可以设置为任何继承于Transport类的类型,以便于我们自己来设置连接方式。

Mirror自带网络连接为基于UDPKCP连接,除此之外我们还可以自己通过导入API等方式实现其他链接方式,例如通过Steam连接等等。

如果是直接添加Network Manager脚本到管理器Game Object之上,可以在属性栏中的Network Info->Transport进行设置,如果是继承该脚本进行自定义逻辑修改可以直接通过更改transport的值进行修改:

image-20241017173548616

transport = 对应Transport脚本组件;
自定义连接地址和端口号

在同样一栏中的Network Address中可以设置需要进行连接的服务器IP地址,默认为localhost即本机IP,同样也可以在脚本中修改networkAddress的值直接进行修改,他在官方脚本中定义如下:

/// <summary>向客户端开放的服务器地址。</summary>
[FormerlySerializedAs("m_NetworkAddress")]
[Tooltip("客户端应连接到服务器的网络地址。服务器端不会将其用于任何用途。")]
public string networkAddress = "localhost";
Game State Management游戏状态管理

该部分被定义在Network Manager脚本中,需要手动调用不同的方法来实现不同的启动状态。在脚本中,提供了三个方法表示以客户端启动、以专用服务器启动和同时作为服务器和客户端启动,分别为StartClientStartServer StartHost,并且官方在书写这些函数时已经将初始化函数作为一部分写入函数中,直接调用就可以创建对应服务。

例如我们可以通过自定义方法来设置通过传入参数来选择启动方式:

public void StartSomething(int state)
{if (state == 0)StartHost();else if (state == 1)StartServer();else if (state == 2)StartClient();
}
Network Manager HUD

这个组件作为测试中快速通过游戏内UI启动服务器的辅助组件,它的本质也是修改Network Manager中的networkAddress、调用对应的启动函数来实现,额外增加了绘制UI的代码。

Network Manager HUD中用于获取Network Manager的部分代码:

image-20241021112542164

Network Manager HUD中用于设置networkAddress的代码片段:

image-20241021112635476

Network Manager HUD中用于启动服务的代码片段:

image-20241021112733626

玩家预制体及其生成控制

因为几乎绝大多数可联机游戏都会有一个可供操作的玩家角色,所以官方直接设置了玩家预制体属性用于生成游戏内玩家对象,并且该预制体不能为空,否则将会发生报错。

image-20241021120610830

除了玩家预制体的设置外,还可以对其生成位置、是否自动生成进行设置,在Inspector窗口中如下图所示:

image-20241021114346809

在源码中则分别对应:

/// <summary>在服务器上创建玩家对象时使用的默认预制体。</summary>
// 玩家对象在服务器上的 AddPlayer() 默认处理程序中创建。
// 实现 OnServerAddPlayer 方法可以覆盖此行为。
[Header("Player Object")]
[FormerlySerializedAs("m_PlayerPrefab")]
[Tooltip("玩家对象的预制体。预制体必须包含 Network Identity 组件。可以是一个空的游戏对象或一个完整的角色。")]
public GameObject playerPrefab;/// <summary>启用后,在连接和场景变化时自动创建玩家对象。</summary>
[FormerlySerializedAs("m_AutoCreatePlayer")]
[Tooltip("场景变化后,Mirror 是否应自动生成玩家?")]
public bool autoCreatePlayer = true;/// <summary>玩家生成的位置。</summary>
[FormerlySerializedAs("m_PlayerSpawnMethod")]
[Tooltip("按轮询顺序或随机顺序选择起始位置")]
public PlayerSpawnMethod playerSpawnMethod;

在代码中也可以对他们进行直接的控制,例如通过修改对应具体值等等。

除了使用默认方式自动进行生成外,我们可以手动去生成对应的预制体,在源码中可以找到客户端连接时生成玩家预制体的代码,代码中直接生成了玩家预制体并设置了基础信息,然后便添加到连接管理中,具体添加逻辑则在分部类Network Server之中(其中涉及到的Network Start Position将在后面同名组件讲解)。我们可以对其进行更改,如更改为连接不显示玩家或不加载玩家预制体,在其他地方进行加载:

/// <summary>当客户端请求添加玩家时在服务器上调用。默认添加 playerPrefab。可以被重写。</summary>
// 该函数的默认实现是从 playerPrefab 创建一个新的玩家对象。
public virtual void OnServerAddPlayer(NetworkConnectionToClient conn)
{Transform startPos = GetStartPosition();GameObject player = startPos != null? Instantiate(playerPrefab, startPos.position, startPos.rotation): Instantiate(playerPrefab);// 实例化一个 "Player" 预制体后,默认名称为 "Player(clone)"// => 在名称后面附加连接ID对于调试非常有用!player.name = $"{playerPrefab.name} [connId={conn.connectionId}]";NetworkServer.AddPlayerForConnection(conn, player);
}

而在客户端中,生成玩家预制体总的来讲就是调用AddPlayer函数来注册并验证是否注册成功,但是需要进行条件是否合适判定。

/// <summary>当客户端连接到服务器时调用。默认情况下,它将客户端设置为就绪状态并添加一个玩家。</summary>
public virtual void OnClientConnect()
{// OnClientConnect 默认调用 AddPlayer,但在有在线/离线场景的情况下不应这样做。// 因此我们需要 clientLoadedScene 标志来防止这种情况。if (!clientLoadedScene){// 通常,Ready/AddPlayer 是由场景加载完成触发的。// 如果没有加载场景,则在这里调用 Ready/AddPlayer。if (!NetworkClient.ready)NetworkClient.Ready();if (autoCreatePlayer)NetworkClient.AddPlayer();}
}
Spawn Prefabs其他预制体注册

在多人游戏中,所有需要在游戏中生成的预制体都需要进行注册,官方的原话为:

If you have one Network Manager that is persisted through scenes via Don’t Destroy On Load (DDOL), you need to register all prefabs to it which might be spawned in any scene. If you have a separate Network Manager in each scene, you only need to register the prefabs relevant for that scene.

注册的位置在Inspector中最末尾:

image-20241021141033311

我们也可以手动对他进行注册会在其他位置进行注册,注册的代码为:

 NetworkClient.RegisterPrefab(prefab);
Scene Management场景管理

Inspector窗口中默认会有两个场景参数,第一个为离线场景,第二个为进入游戏后首次加载的场景(可以理解为联机大厅等),在下面还有一个参数,用于设置离线或短线时延迟显示的时间,在这之中可以进行一些特殊处理。

image-20241021144527183

在源码中对应部分如下:

/// <summary>在离线时(启动/断开连接/关闭)自动切换到此场景。</summary>
[Header("Scene Management")]
[Scene]
[FormerlySerializedAs("m_OfflineScene")]
[Tooltip("当客户端或服务器停止时,Mirror 将切换到的场景")]
public string offlineScene = "";/// <summary>在上线时(连接后/启动服务器后)自动切换到此场景。</summary>
[Scene]
[FormerlySerializedAs("m_OnlineScene")]
[Tooltip("当服务器启动时,Mirror 将切换到的场景。客户端在连接时会收到一条场景消息以加载服务器当前的场景。")]
public string onlineScene = "";[Range(0, 60), Tooltip("断开连接后可选的延迟,用于显示 '连接丢失...' 消息或类似内容,然后再加载离线场景,这在大型项目中可能需要较长时间。")]
public float offlineSceneLoadDelay = 0;

在需要进行尝尽切换时,可以通过调用ServerChangeScene(string newSceneName)函数来进行切换,它会将onlineScene自动更新为切换到的场景,也可以重写函数自定义场景切换。

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

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

相关文章

在Windows系统中,cmd 查看 MongoDB 相关信息

MongoDB是一种流行的NoSQL数据库&#xff0c;广泛应用于各种现代应用程序中。 1 查看MongoDB的版本号 要查看MongoDB的版本号&#xff0c;可以使用mongo命令连接到MongoDB&#xff0c;然后执行db.version()。 mongo连接到数据库后&#xff0c;执行以下命令&#xff0c;输出M…

读数据工程之道:设计和构建健壮的数据系统16源系统实际细节(下)

1. 数据共享 1.1. 云数据共享的核心概念是&#xff0c;多租户系统支持租户之间共享数据的安全策略 1.2. 任何具有细粒度权限系统的公有云对象存储系统都可以成为数据共享的平台 1.3. 数据共享也简化了数据市场的概念&#xff0c;在几个流行的云和数据平台上都可用 1.4. 数据…

RabbitMQ系列学习笔记(三)--工作队列模式

文章目录 一、工作队列模式原理二、工作队列模式实战1、抽取工具类2、消费者代码3、生产者代码4、查看运行结果 本文参考 尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq RabbitMQ 详解 Centos7环境安装Erlang、RabbitMQ详细过程(配图) 一、工作队列模式原理 与简单模式相…

SpringBoot篇(二、制作SpringBoot程序)

目录 一、代码位置 二、四种方式 1. IDEA联网版 2. 官网 3. 阿里云 4. 手动 五、在IDEA中隐藏指定文件/文件夹 六、复制工程-快速操作 七、更改引导类别名 一、代码位置 二、四种方式 1. IDEA联网版 2. 官网 官网制作&#xff1a;Spring Boot 3. 阿里云 阿里云版制…

基于SSM+微信小程序的家庭记账本管理系统(家庭1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 1、管理员端功能有首页、个人中心、用户管理&#xff0c;消费详情管理、收入详情管理、系统管理等。 2、用户端功能有首页、消费详情、收入详情、论坛信息、我的等功能。 2、项目技术 …

django5入门【02】创建新的django程序

注意&#xff1a; ⭐前提&#xff1a;已经安装了python以及django所依赖的包1、通过django-admin管理工具在命令行创建Django应用程序&#xff0c;创建命令如下&#xff1a; django-admin startproject ProjectName❓ 疑问&#xff1a;除了使用命令行创建django程序外&#x…

OCR经典神经网络(三)LayoutLM v2算法原理及其在发票数据集上的应用(NER及RE)

OCR经典神经网络(三)LayoutLM v2算法原理及其在发票数据集上的应用(NER及RE) LayoutLM系列模型是微软发布的、文档理解多模态基础模型领域最重要和有代表性的工作&#xff1a; LayoutLM v2&#xff1a;在一个单一的多模态框架中对文本&#xff08;text&#xff09;、布局&…

eQEP正交解码

目录 基本介绍 整体框架 关键模块 编译问题 实验效果 基本介绍 编码器是一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感器&#xff0c;我们可以通过编码器测量到位移或者速度信息。编码器从输出数据类型上分&#xff0c;可以分为增量式编码器和绝对式编码器。…

深入浅出MySQL:概述与体系结构解析

目录 1. 初识MySQL1.1. 数据库1.1.1. OLTP&#xff08;联机事务处理&#xff09;1.1.2. OLAP&#xff08;联机分析处理&#xff09; 2. SQL2.1. 定义2.2. DQL&#xff08;数据查询语言&#xff09;2.3. DML&#xff08;数据操纵语言&#xff09;2.4. DDL&#xff08;数据定义语…

Python基于OpenCV的实时疲劳检测

2.检测方法 1&#xff09;方法 与用于计算眨眼的传统图像处理方法不同&#xff0c;该方法通常涉及以下几种组合&#xff1a; 1、眼睛定位。 2、阈值找到眼睛的白色。 3、确定眼睛的“白色”区域是否消失了一段时间&#xff08;表示眨眼&#xff09;。 相反&#xff0c;眼睛长…

Python网络请求库requests的10个基本用法

大家好&#xff01;今天我们要聊聊Python中非常实用的一个库——requests。这个库让发送HTTP请求变得超级简单。无论你是想抓取网页数据还是测试API接口&#xff0c;requests都能派上大用场。下面我们就一起来看看如何使用requests完成一些常见的任务。 引言 随着互联网技术的…

队列(数据结构)——C语言

目录 1.概念与结构 2.队列的实现 初始化QueueInit 申请新节点BuyNode 入队QueuePush 判断队为空QueueEmpty 出队QueuePop 读取队头数据QueueFront 读取队尾数据QueueBack 元素个数QueueSize 销毁队列QueueDestroy 3.整体代码 (文章中结点和节点是同一个意思) 1.概…

keil兼容C51和ARM,C251

三合一 C51,AEM,C251获取STC32的包 将 C51,AEM,C251安装到一块。 C51,AEM,C251 将三个软件分别下载到不同的文件夹KEIL,MDK,KEIL2里。 然后打开KEIL,MDK,KEIL2文件夹&#xff0c;复制KEIL文件夹里的C51和KEIL2文件夹里的C251的文件夹到MDK文件夹里。 打开KEIL和KEIL2文件夹里…

单链表的经典算法OJ

目录 1.反转链表 2.链表的中间节点 3.移除链表元素 ——————————————————————————————————————————— 正文开始 1.反转链表 typedef struct ListNode ListNode; struct ListNode* reverseList(struct ListNode* head) {//判空if(…

运行kafka查看所有主题Topic报错zookeeper is not a recognized option

执行命令查看&#xff1a;./kafka-topics.sh --list --zookeeper localhost:2181 报错 zookeeper is not a recognized option joptsimple.UnrecognizedOptionException: zookeeper is not a recognized optionat joptsimple.OptionException.unrecognizedOption(OptionExcept…

000010 - Mapreduce框架原理

Mapreduce框架原理 1. InputFormat 数据输入1.1 切片与 MapTask 并行度决定机制1.2 Job 提交流程源码和切片源码详解1.2.1 Job 提交流程源码详解1.2.2 FileInputFormat 切片源码解析&#xff08;input.getSplits(job)&#xff09; 1.3 FileInputFormat 切片机制1.3.1 切片机制1…

二、PyCharm基本设置

PyCharm基本设置 前言一、设置中文汉化二、设置代码字体颜色三、设置鼠标滚轮调整字体大小四、修改 PyCharm 运行内存4.1 方式一4.1 方式二 五、显示 PyCharm 运行时内存六、设置代码模版配置的参数有&#xff1a; 七、PyCharm设置背景图总结 前言 为了让我们的 PyCharm 更好用…

一家射频芯片企业终止,报告期持续亏损,高端产品占比不足

飞骧科技终止原因如下&#xff1a;飞骧科技从事的射频芯片行业如今竞争激烈&#xff0c;飞骧科技的产品主要应用于中低端手机&#xff0c;如摩托罗拉、传音&#xff0c;相比同行业上市公司已经退出的低集成度市场&#xff0c;相关产品展飞骧科技业务比重仍然不低。交易所质疑其…

【Matlab】基于Prandtl−Ishlinskii的迟滞模型-RLS辨识

PI模型 PI迟滞模型的输出公式&#xff1a; 代码记录 此代码为根据PI模型&#xff0c;已知输入&#xff08;正弦函数幅值为3.5&#xff09;、阈值以及权重值&#xff0c;利用matlab生成迟滞回线。 %% The Prandtl-Ishlinskii Hysteresis Model- %% 20241021 clc;clear; close…

数据结构与算法——Java实现 44.翻转二叉树

目录 226. 翻转二叉树 思路 代码 本地代码测试 不管前方的路有多苦 只要走的方向正确 不管多么崎岖不平 都比站在原地更接近幸福 —— 24.10.21 226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输…