当前位置: 首页 > news >正文

Unity插件-Mirror使用方法(一)Mirror介绍

目录

一、使用介绍

二、插件介绍

1、简述

2、核心功能与特点

基于组件的高层抽象

服务器-客户端架构

序列化与同步

可扩展性与灵活性

跨平台支持

社区与生态

3、典型应用场景

4、基本使用示例

安装

设置 NetworkManager

同步变量与 RPC

5、优缺点对比

6、为什么选择 Mirror?

7、常见问题

1️⃣ 检查 Unity 版本

2️⃣ ​通过 Package Manager 安装依赖

3️⃣ ​手动修改 manifest.json

4️⃣ ​验证依赖是否加载


一、使用介绍

插件来源:Unity AssetStore

(Mirror | 网络 | Unity Asset Store)

Github:GitHub - MirrorNetworking/Mirror: #1 Open Source Unity Networking Library

官方网页:Mirror Networking – Open Source Networking for Unity

官方文档:Mirror Networking | Mirror

使用版本:Unity 2022.3.53f1c1、Mirror 96.0.1


二、插件介绍

1、简述

Unity Mirror 是一个专为 Unity 引擎设计的开源、社区驱动的网络库,主要用于简化多人联机游戏的开发。它最初是为了替代 Unity 原生的 UNet 系统(已被官方弃用)而创建的,因其轻量、灵活和高效的特点,成为 Unity 开发者构建多人游戏的热门选择。


2、核心功能与特点

基于组件的高层抽象

  1. Mirror 提供了 NetworkManagerNetworkIdentityNetworkBehaviour 等组件,开发者只需通过继承和配置这些组件,即可快速实现网络同步逻辑,无需深入底层协议细节。

服务器-客户端架构

  1. 支持权威服务器模式(服务器控制逻辑,客户端仅负责输入和渲染)。
  2. 提供 NetworkServer 和 NetworkClient 类,管理连接、消息处理和对象同步。
  3. 支持 LAN 和互联网联机,可通过 Relay 服务器(如 Steam)实现 NAT 穿透。

序列化与同步

  1. 变量同步:通过 [SyncVar] 属性标记变量,自动将状态从服务器同步到客户端。
  2. 指令同步:使用 [Command](客户端调用服务器方法)和 [ClientRpc](服务器调用客户端方法)实现远程过程调用(RPC)。
  3. Transform 同步:内置 NetworkTransform 组件自动同步物体位置、旋转和缩放。

可扩展性与灵活性

  1. 支持自定义序列化、消息类型和网络传输层(如 TCP、UDP、WebSockets)。
  2. 允许开发者覆盖默认行为(如连接认证、对象生成规则)。

跨平台支持

  1. 兼容 Unity 支持的几乎所有平台(PC、移动端、主机、WebGL 等)。

社区与生态

  1. 丰富的文档和示例项目(如多人射击、RPG、实时策略模板)。
  2. 活跃的 Discord 社区和 GitHub 仓库,便于问题解决和功能讨论。
  3. 与常用插件(如 FishNet、Lobby 系统)兼容。

3、典型应用场景

  • 多人联机游戏(PvP、PvE、合作模式)

  • 实时同步应用(如虚拟会议、协作工具)

  • 原型快速开发(无需从零实现网络逻辑)


4、基本使用示例

安装

通过 Unity Package Manager 或 GitHub 仓库导入 Mirror。

导入Mirror插件资源

设置 NetworkManager

// 创建 NetworkManager 对象并配置服务器地址、端口和玩家预制体。
public class MyNetworkManager : NetworkManager {public override void OnServerAddPlayer(NetworkConnection conn) {GameObject player = Instantiate(playerPrefab);NetworkServer.AddPlayerForConnection(conn, player);}
}

同步变量与 RPC

public class Player : NetworkBehaviour {[SyncVar]public int health = 100;[Command]public void CmdTakeDamage(int damage) {health -= damage;}[ClientRpc]public void RpcRespawn() {transform.position = Vector3.zero;}
}

5、优缺点对比

优点缺点
开源免费,社区支持强大需要自行处理复杂同步逻辑(如预测与插值)
学习曲线较低(相比底层 Socket)大型项目需优化网络流量
高度可定制化依赖 Unity 的更新兼容性

6、为什么选择 Mirror?

  • UNet 的继承者:Unity 已弃用 UNet,Mirror 是社区维护的最佳替代方案。

  • 轻量高效:相比 Photon 等第三方服务,Mirror 提供更多控制权且无额外成本。

  • 适合中小团队:快速实现多人功能,无需深厚网络编程经验。

7、常见问题

导入 Unity 资源包时遇到的错误提示 ​"This Asset Package has Unity Package Manager dependencies" 意味着该资源包依赖两个特定的 UPM(Unity Package Manager)包:com.unity.ugui@2.0.0 和 com.unity.nuget.newtonsoft-json@3.0.0


解决方法:

1️⃣ 检查 Unity 版本

  • 确保你使用的 Unity 版本与资源包兼容。
  • com.unity.ugui@2.0.0 通常对应 ​Unity 2020.3+,旧版本可能无法支持。

2️⃣ ​通过 Package Manager 安装依赖

  1. 打开 Unity Editor,进入顶部菜单:
    Window > Package Manager
  2. 在 Package Manager 窗口中:
    • 确保选择 ​Unity Registry​ 作为包源。
  3. 搜索并安装以下包:
    • ​**"Unity UI" (com.unity.ugui)**​
      • 确保版本为 2.0.0(可能需要升级 Unity)。
    • ​**"Newtonsoft Json" (com.unity.nuget.newtonsoft-json)**​
      • 安装 3.0.0 版本。

3️⃣ ​手动修改 manifest.json

如果包管理器中没有找到指定版本,可手动添加依赖:

  1. 打开项目目录:YourProject/Packages/manifest.json
  2. 在 dependencies 部分添加以下内容:
    {"dependencies": {"com.unity.ugui": "2.0.0","com.unity.nuget.newtonsoft-json": "3.0.0",// 其他依赖...}
    }
  3. 保存文件,重启 Unity Editor。

4️⃣ ​验证依赖是否加载

  • 重启 Unity 后,检查 ​Package Manager​ 中是否已正确加载这两个包。
  • 如果出现版本冲突,尝试删除项目目录下的 Library 文件夹并重新导入资源包。

相关文章:

Unity插件-Mirror使用方法(一)Mirror介绍

目录 一、使用介绍 二、插件介绍 1、简述 2、核心功能与特点 基于组件的高层抽象 服务器-客户端架构 序列化与同步 可扩展性与灵活性 跨平台支持 社区与生态 3、典型应用场景 4、基本使用示例 安装 设置 NetworkManager 同步变量与 RPC 5、优缺点对比 6、为什…...

HVAC 设计:使用 Ansys Discovery 探索更好的设计

通过 Ansys Discovery 及其 2025 年新功能利用 CFD,通过 Computational Insights 应对 HVAC 行业的挑战。 挑战 HVAC 行业在设计高效可靠的管道系统方面面临多项挑战: 压力损失:设计不当的管道会增加能耗并降低热性能。复杂的几何形状&…...

ChatGPT 提示词框架

作为一个资深安卓开发工程师,我们在日常开发中经常会用到 ChatGPT 来提升开发效率,比如代码优化、bug 排查、生成单元测试等。 但要想真正发挥 ChatGPT 的潜力,我们需要掌握一些提示词(Prompt)的编写技巧,并…...

004-利用Docker安装Mysql

利用Docker安装Mysql 一、在镜像仓库找到 Mysql1.镜像仓库地址2.复制命令3.下载Mysql镜像4.查看镜像 二、创建实例并启动三、用本地工具连接数据库四、设置 Mysql 配置 一、在镜像仓库找到 Mysql 1.镜像仓库地址 https://hub.docker.com 2.复制命令 docker pull mysql:8.0…...

Dify使用和入门

第一步:了解 Dify 在开始之前,先简单了解一下 Dify 是什么: Dify 是一个开源的 LLM 应用开发平台,专注于帮助开发者快速构建生产级的生成式 AI 应用。它支持知识库集成、RAG(检索增强生成)技术、复杂工作…...

高效管理 React 状态和交互:我的自定义 Hooks 实践

高效管理 React 状态和交互:自定义 Hooks 实践 在 React 中,Hooks 是一种使我们能够在函数组件中使用状态和副作用的强大工具。随着项目的增大,重复的逻辑可能会出现在多个组件中,这时使用自定义 Hooks 就非常合适。它们帮助我们…...

ESP 32控制无刷电机2

import machine import time import socket import network from machine import I2C, Pin, ADC def start_ap(): """ 启动ESP32的AP模式 """ ap network.WLAN(network.AP_IF) ap.active(True) ssid ESP32_APTest …...

揭开人工智能中 Tokens 的神秘面纱

揭开人工智能中 Tokens 的神秘面纱 在人工智能,尤其是自然语言处理(NLP)领域,"tokens" 是一个频繁出现且至关重要的概念。对于理解语言模型如何处理和理解人类语言,tokens 起着基础性的作用。那么&#xff…...

萌新学 Python 之 random 函数

random 模块:主要用来生成随机数 先导入包:import random randint(a, b),生成 [a, b] 之间的整数,包含边界 a 和 b,a 和 b 为整数 random(),生成的是 [0,1) 之间的浮点数,包含 0 不包含 1 r…...

2-2linux系统IO

文章目录 linux系统文件io1 open /close1.1 open1.2 close1.3 示例1.3.1 打开已经存在的文件 2 read/write2.1 read2.2 write使用 遗留问题:新创建的文件权限很奇怪3 lseek3.1 文件指针的移动3.2 文件拓展 perror函数 linux系统文件io 系统函数是系统专有的函数&am…...

周边游平台设计与实现(代码+数据库+LW)

摘 要 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对旅游信息管理的提升&#xff0c…...

视频批量分段工具

参考原文:视频批量分段工具 选择视频文件 当您启动这款视频批量分段工具程序后,有两种便捷的方式来选择要处理的视频文件。其一,您可以点击程序界面中的 “文件” 菜单,在下拉选项里找到 “选择视频文件” 按钮并点击&#xff1b…...

Android -- 使用Sharepreference保存List储存失败,原因是包含Bitmap,drawable等类型数据

1.报错信息如下: class android.content.res.ColorStateList declares multiple JSON fields named mChangingConfigurations 2.Bean类属性如下: data class AppInfoBean( val appName: String?, val appIcon: Drawable, val appPackage: String?,…...

java项目之基于ssm的图书馆书库管理系统(源码+文档)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的图书馆书库管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 该系统可以实现图书信息管理…...

编写一个程序,输入一个数字并输出其阶乘(Python版)

编写一个程序,输入一个数字并输出其阶乘 要计算一个数字的阶乘,可以编写一个简单的 Python 程序,使用循环或者递归来实现: 1. 使用 for 循环计算阶乘 # 输入一个数字 num int(input("请输入一个数字: "))# 初始化阶乘结果 facto…...

dify基础之prompts

摘要:在大型语言模型(LLM)应用中,Prompt(提示词)是连接用户意图与模型输出的核心工具。本文从概念、组成、设计原则到实践案例,系统讲解如何通过Prompt解锁LLM的潜能,提升生成内容的…...

实践教程:使用DeepSeek实现PDF转Word的高效方案

🎈Deepseek推荐工具 PDF文件因其跨平台、格式稳定的特性被广泛使用,但在内容编辑场景中,用户常需将PDF转换为可编辑的Word文档。传统的付费工具(如Adobe Acrobat)或在线转换平台存在成本高、隐私风险等问题。本文将使…...

网络安全审计员

在当今数字化时代,随着信息技术的迅猛发展,网络安全问题日益凸显,成为各行各业不容忽视的重要议题。特别是对于企业、政府机构等组织而言,网络安全不仅关乎数据资产的安全,更与组织的声誉、客户信任乃至法律法规的遵从…...

算法-二叉树篇13-路径总和

路径总和 力扣题目链接 题目描述 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回…...

如何设计一个短链系统?

短链系统设计的关键要点: 系统功能实现 短链生成:接收长链接,先检查是否已有对应短链,存在则直接返回。否则,使用分布式 ID 生成器(如号段模式、SnowFlake 算法、数据库自增 ID、Redis 自增等)生成唯一 ID,或通过哈希算法(如 MurmurHash)处理长链接得到哈希值。再将生…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

Selenium常用函数介绍

目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...

GraphRAG优化新思路-开源的ROGRAG框架

目前的如微软开源的GraphRAG的工作流程都较为复杂,难以孤立地评估各个组件的贡献,传统的检索方法在处理复杂推理任务时可能不够有效,特别是在需要理解实体间关系或多跳知识的情况下。先说结论,看完后感觉这个框架性能上不会比Grap…...

React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?

系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...