Mirror网络框架-从入门到精通之Mirror简介

前言

在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。Mirror是一个用于Unity的开源网络框架,专为多人游戏开发设计。它使得开发者能够轻松实现网络连接、数据同步和游戏状态管理。本文将深入介绍Mirror的基本概念、如何与其他网络框架进行比较,以及如何从零开始创建一个使用Mirror的简单网络项目。

什么是Mirror?

Mirror是一个功能强大的Lite网络框架,旨在替代Unity的UNet网络解决方案。它提供了高效的多玩家架构、简单易用的API,以及良好的社区支持。Mirror特别适合快速开发小型到中型的多人在线游戏(MMO、第一人称射击、角色扮演游戏等),旨在简化网络游戏的开发流程。

Mirror与其他网络框架的比较

在Unity中,有多种网络框架可供选择,最主要的包括Mirror、Photon和UNet。以下是它们的比较:

Mirror vs UNet

性能:Mirror在性能上优化明显,支持更高的玩家同步及更低的延迟。与UNet相比,Mirror在数据压缩和带宽利用方面表现更佳。
易用性:Mirror的使用方式更加直观且简单,功能的实现相对容易,对于新手非常友好。UNet由于已停止维护,学习成本和使用成本相对更高。
社区支持:Mirror拥有一个活跃的社区,开发者们可以在社区中获取支持和分享经验,与UNet相比,Mirror的更新频率更高,能够更快地响应用户需求。

Mirror vs Photon

收费模式:Photon采取按月付费的收费模式,根据连接数和使用的功能收费,而Mirror是完全开源且免费使用,适合预算有限的开发者。
功能特性:Photon提供一些现成的服务,例如房间匹配和实时聊天等,而Mirror在灵活性和可定制性方面更强,能够更好地满足开发者的特殊需求。
可扩展性:Mirror的代码是完全开源并且高度可扩展,开发者可以根据需要自定义核心功能和网络行为。而Photon的功能虽然丰富,但在某些方面可能受到平台的限制。

Mirror vs FishNet

性能:FishNet特别强调高性能支持,适合处理大量玩家并保持低延迟。Mirror在小到中型项目中表现良好,但在极端高并发的情况下可能需进行精细调优。
易用性:Mirror的API设计更加直观,适合新手开发者快速上手,而FishNet虽易用但有一些独特概念,学习曲线略高。
功能特性:FishNet提供了一些先进的网络功能,例如状态同步和组管理,适合复杂游戏的开发。Mirror则专注于提供更简洁且易于理解的功能实现。
社区与支持:Mirror的社区相对较大,文档和资源丰富,而FishNet虽然相对较新,但社区正在快速发展,有不断增加的支持和资料。

和普通的CS服务器架构区别

  1. 架构设计
    普通客户端-服务器架构:
    自定义实现:开发者需要从头开始设计和实现客户端与服务器之间的通信协议,包括数据传输、连接管理、状态同步等。
    服务器责任:服务器通常扮演着权威角色,负责管理游戏状态、逻辑处理和玩家间的通信。开发者需要手动实现所有功能。
    使用网络框架(如Mirror、Photon、FishNet):
    现成的基础设施:这些框架提供了现成的组件和API,使得网络通信、状态同步和房间管理等功能的实现更加简单和高效。
    抽象层次:框架通常会提供更高层次的抽象,让开发者可以专注于游戏逻辑,而不是底层网络实现。

  2. 开发效率
    普通客户端-服务器架构:
    开发周期较长:由于需要从零开始实现通信和管理机制,开发时间和成本较高。
    维护复杂性:项目维护较为困难,需要开发者持续跟踪网络问题和性能瓶颈。
    使用网络框架:
    快速开发:框架提供的工具和功能显著减少了开发时间,让开发者能够更快地构建和迭代游戏。
    更易维护:网络框架通常会随着开发者社区的反馈进行更新和优化,降低了维护难度。

  3. 性能和扩展性
    普通客户端-服务器架构:
    性能取决于实现:游戏性能高度依赖于开发者的实现,可能面临低效的网络协议和数据处理造成的性能瓶颈。
    扩展性问题:扩展功能或处理高并发玩家时,可能需要重新设计架构,增加开发工作量。
    使用网络框架:
    优化和性能提升:框架通常会考虑到性能优化,通过如数据压缩、连接池等技术提高性能,支持多用户并发。
    灵活的扩展性:许多框架具有良好的可扩展性,开发者可以方便地添加新功能或者调整现有功能。

  4. 网络管理
    普通客户端-服务器架构:
    手动管理连接:需要手动处理玩家连接、断开连接、心跳检测等,这可能导致容易出现问题。
    复杂的错误处理:需要自己实现重连机制和错误处理逻辑,增加了开发难度。
    使用网络框架:
    自动管理:框架会负责处理连接的建立和维护,简化开发者的工作。
    内置错误处理:大部分框架内置了错误处理和重连机制,减少了开发者需要关注的细节。

  5. 功能特性
    普通客户端-服务器架构:
    功能实现依赖开发者:所有功能(如房间管理、玩家同步、聊天功能)都需要由开发者在C/S双端自行实现,工作量较大。
    使用网络框架:
    丰富的功能:网络框架通常提供了现成的功能,如房间创建与管理、玩家状态同步、实时通信等,可以直接调用,降低了开发门槛。

创建新项目并配置Mirror

下面是如何创建一个新的Unity项目并配置Mirror的步骤:

下载并安装Unity:确保你已经安装了最新版本的Unity。

创建新项目:

打开Unity Hub,点击“新建项目”。
选择适合你项目的模板(例如2D或3D),输入项目名称并点击“创建”。
导入Mirror网络库:

打开Unity后,在顶部菜单栏中选择“Window” -> “Package Manager”。
在Package Manager中,选择“Add package from git URL”,输入Mirror的GitHub链接(例如:https://github.com/vis2k/Mirror.git),或者从Unity Asset Store下载Mirror插件。
等待Unity导入Mirror,之后会在你的项目中生成相应的文件夹和示例代码。
配置基础设置:

在Hierarchy面板中,右键点击空白处,选择“Create Empty”创建一个空对象,并命名为“NetworkManager”。
在Inspector面板中,点击“Add Component”,添加“NetworkManager”和“NetworkManagerHUD”组件。这样,你就可以使用Mirror提供的基本网络功能。
实现简单的客户端-服务器结构
要实现一个简单的客户端-服务器结构,可以按照以下步骤进行配置:

添加玩家预制体:

创建一个简单的玩家角色模型,并在其上添加“NetworkIdentity”组件,以确保网络同步。
在“NetworkIdentity”组件中,勾选“Local Player Authority”。
创建一个用于玩家控制的脚本,并继承自Mirror的“NetworkBehaviour”,你可以在其中定义玩家的控制逻辑。
修改NetworkManager:

在NetworkManager组件中,将玩家预制体拖入“Player Prefab”字段。
在“NetworkManagerHUD”中,你将能够看到开始服务器和连接客户端的按钮。
运行程序:

打开一个Unity编辑器窗口,点击“Start Host”以启动服务器。
再打开一个Unity编辑器窗口,点击“Start Client”连接到服务器。
现在,你应该可以看到在两个窗口中各自控制的玩家角色。

基本网络概念

在使用Mirror进行多人游戏开发时,理解基本网络概念是至关重要的。以下是一些核心概念:

  • 网络对象(Network Objects):在Mirror中,任何需要在网络中同步的对象都应该是网络对象。它通过“NetworkIdentity”组件进行标识。

  • 命令(Commands):命令是从客户端发送到服务器的函数调用。通过在脚本中使用[Command]属性,你可以定义客户端请求服务器执行特定操作。

  • 远程过程调用(RPC):RPC是从服务器调用客户端的方法,这可以通过[ClientRpc]属性实现。它允许服务器向所有连接的客户端发送信息。

  • 同步变量:使用[SyncVar]属性,你可以在客户端和服务器之间同步变量的状态。一旦在服务器上更改,所有连接的客户端都会收到更新。

  • 网络管理器(NetworkManager):这是管理与网络相关的所有活动的核心组件,例如启动和停止服务器、处理玩家连接及断开。

最后

通过掌握这些基本概念,你将能够更高效地使用Mirror进行多人游戏的开发。

以上就是对Mirror网络框架的简单介绍与使用指南,希望这篇博客可以帮助到你在Unity中实现多人游戏的开发。如果你有任何问题或建议,欢迎在评论区留言!

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

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

相关文章

Yocto 项目中的交叉编译:原理与实例

Yocto 项目是一个强大的工具集,它专注于为嵌入式系统生成定制的 Linux 发行版。交叉编译在 Yocto 项目中扮演着核心角色,它使得开发者能够在功能强大的宿主机上构建适用于资源受限目标设备的软件系统。这篇文章将从运行原理、实际案例和工具链组成等角度…

python学opencv|读取图像(二十二)使用cv2.polylines()绘制多边形

【1】引言 前序学习进程中,已经掌握了使用pythonopencv绘制线段、矩形和圆形的基本操作,相关链接包括且不限于: python学opencv|读取图像(十八)使用cv2.line创造线段-CSDN博客 python学opencv|读取图像(…

教师管理系统

大概功能: 1.显示所有教师 2.按姓名查找教师 3.按工号查找教师 4.增加教师 5.删除教师 6.退出 数据会保存到 txt 文件里面 姓名:必须是中文 手机号码:必须是11位,必须是数字 效果展示: 代码展示: Teache…

小程序配置文件 —— 14 全局配置 - tabbar配置

全局配置 - tabBar配置 tabBar 字段:定义小程序顶部、底部 tab 栏,用以实现页面之间的快速切换;可以通过 tabBar 配置项指定 tab 栏的表现,以及 tab 切换时显示的对应页面; 在上面图中,标注了一些 tabBar …

[Wireshark] 使用Wireshark抓包https数据包并显示为明文、配置SSLKEYLOGFILE变量(附下载链接)

wireshark 下载链接:https://pan.quark.cn/s/eab7f1e963be 提取码:rRAg 链接失效(可能会被官方和谐)可评论或私信我重发 chrome与firefox在访问https网站的时候会将密钥写入这个环境变量SSLKEYLOGFILE中,在wireshark…

Android笔记(四十一):TabLayout内的tab不滚动问题

背景 假设二级页面是上面图片的布局,当进来时TabLayout和ViewPager2绑定完就马上调setCustomItem,跳转到最后一个tab页面时,会发现tab不滚动,手动滑一下ViewPager2时才会滚动tab到正确的位置 原因分析 调用TabLayoutMediator.at…

【Spring】 Bean 注入 HttpServletRequest 能保证线程安全的原理

文章目录 前言1. 图示2. 源码坐标后记 前言 今天看了一段老业务代码,HttpServletRequest 被注入后直接用于业务逻辑。 好奇Spring是如何解决线程安全问题。 Controller public class TestController {ResourceHttpServletRequest request;ResponseBodyGetMapping(…

Unity中如何修改Sprite的渲染网格

首先打开SpriteEditor 选择Custom OutLine,点击Genrate 则在图片边缘会出现边缘线,调整白色小方块可以调整边缘 调整后,Sprite就会按照调整后的网格渲染了。 如何在UI中使用? 只要在UI的Image组件中选择Use Sprite Mesh 即可 结果&#xff1…

【Artificial Intelligence篇】AI 前沿探秘:开启智能学习的超维征程

目录 一、人工智能的蓬勃发展与智能学习的重要性: 二、数据的表示与处理 —— 智能学习的基石: 三、构建一个简单的感知机模型 —— 智能学习的初步探索: 四、神经网络 —— 开启超维征程的关键一步: 五、超维挑战与优化 —— 探索智能学习的深度: 六、可视化与交互 —— …

docker-compos mysql5.7主从配置

docker-compos mysql5.7主从配置 docker-compose目录结构 配置文件 master/my.cnf [client] port 3306 socket /var/run/mysqld/mysqld.sock[mysqld_safe] pid-file /var/run/mysqld/mysqld.pid socket /var/run/mysqld/mysqld.sock nice 0…

开源轻量级文件分享服务Go File本地Docker部署与远程访问

???欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老…

路过石岩浪心古村

周末常去的七彩城堡儿童乐园附近经常有老房子,没想到老房子最多的地方还是浪心古村。而且越看越有历史。 见到一座写着《序西书室》的房子,我最开始以为是一个古代的学校。但是查了百度更加不知道什么意思了哈。‌“序西书室”‌是指《文心雕龙》中的一个…

探索PyTorch:从入门到实践的demo全解析

探索PyTorch:从入门到实践的demo全解析 一、环境搭建:PyTorch的基石(一)选择你的“利器”:安装方式解析(二)步步为营:详细安装步骤指南二、基础入门demo:点亮第一盏灯(一)张量操作:深度学习的“积木”(二)自动求导:模型学习的“幕后英雄”三、数据处理demo:喂饱…

SpringMVC学习(二)——RESTful API、拦截器、异常处理、数据类型转换

一、RESTful (一)RESTful概述 RESTful是一种软件架构风格,用于设计网络应用程序。REST是“Representational State Transfer”的缩写,中文意思是“表现层状态转移”。它基于客户端-服务器模型和无状态操作,以及使用HTTP请求来处理数据。RES…

Windows中安装Python3

Windows中安装Python3 1. 下载Python安装包 首先,访问Python的官方网站 Python.org,选择适合你Windows版本的Python安装包。 2. 运行安装包 下载完成.exe文件后,双击运行安装包。在安装过程中,有一些关键的选项需要特别注意&a…

虚幻引擎结构之UWorld

Uworld -> Ulevel ->Actors -> AActor 在虚幻引擎中,UWorld 类扮演着至关重要的角色,它就像是游戏世界的总指挥。作为游戏世界的核心容器,UWorld 包含了构成游戏体验的众多元素,从游戏实体到关卡设计,再到物…

2024第一届Solar杯应急响应挑战赛

日志流量 日志流量-1 直接放到D盾分析 解码 flag{A7b4_X9zK_2v8N_wL5q4} 日志流量-2 哥斯拉流量 工具解一下 flag{sA4hP_89dFh_x09tY_lL4SI4} 日志流量-3 tcp流6复制data流 解码 改pdf flag{dD7g_jk90_jnVm_aPkcs} 内存取证 内存取证-1 vol.py -f 123.raw --profileWin…

HarmonyOS Next 实现登录注册页面(ARKTS) 并使用Springboot作为后端提供接口

1. HarmonyOS next ArkTS ArkTS围绕应用开发在 TypeScript (简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集 ArkTS在TS的基础上扩展了struct和很多的装饰器以达到描述UI和状态管理的目的 以下代码是一个基于…

Spring Boot教程之四十:使用 Jasypt 加密 Spring Boot 项目中的密码

如何使用 Jasypt 加密 Spring Boot 项目中的密码 在本文中,我们将学习如何加密 Spring Boot 应用程序配置文件(如 application.properties 或 application.yml)中的数据。在这些文件中,我们可以加密用户名、密码等。 您经常会遇到…

七、队列————相关概念详解

队列————相关概念详解 前言一、队列1.1 队列是什么?1.2 队列的类比 二、队列的常用操作三、队列的实现3.1 基于数组实现队列3.1.1 基于环形数组实现的队列3.1.2 基于动态数组实现的队列 3.2 基于链表实现队列 四、队列的典型应用总结 前言 本篇文章,我们一起来…