当前位置: 首页 > 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)处理长链接得到哈希值。再将生…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

企业如何增强终端安全?

在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

LLMs 系列实操科普(1)

写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...