[Unity实战]Mirror网络与Addressable场景管理

news2025/2/28 20:56:37

前言

很遗憾,Mirror包括UNET的场景管理不支持Addressables。我做手机游戏,需要实现服务器广播场景切换,但主程序没有场景,热更代码和资源都在AB包里。我已经在Google上搜索了一段时间,没有找到有用的解决方案。

Reddit上的某人建议使用Fishnet,它支持Addressables。但这在项目进行到一半的时候是不可能的。所以我自己动手开始改NetworkManager。后来考虑了一下,寻思抽出来做一个demo开源,真的希望能帮助/启发那些也在找解决办法苦苦挣扎的人。

https://github.com/Shepherd0619/MirrorAddressablesDemo

说实话,只要你知道Mirror如何管理场景,改造就不会很复杂。

我把所有的自定义脚本和2个演示场景(源自TanksDemo)放在了_Project文件夹下。

目前能发现的是原先拖拖乐的OnlineScene和OfflineScene我没做支持,但这个我感觉一般都不会用那个东西。

最终效果如图:

1. Host/Server:

2. 客户端侧: 

实现

如果你希望自己将Addressables实现到Mirror的场景管理中,你需要按照以下步骤进行操作,这也是我实现过程的概述:

1. Editor下右键空白处使用Mirror的模板创建自己的NetworkManager。(如果你已经有一个,请跳过此步骤。)

2. 将'loadingSceneAsync'的类型更改为'AsyncOperationHandle'。

public static new AsyncOperationHandle<SceneInstance> loadingSceneAsync;

3. 重写/覆盖场景管理代码块下的几乎所有函数,包括但不限于ServerChangeScene、OnClientSceneChanged、ClientChangeScene、OnClientSceneInternal和UpdateScene。

PS:我们主要用Addressable替换使用SceneManager的代码行。例如:

loadingSceneAsync = Addressables.LoadSceneAsync(newSceneName);

4. 需要注意的一点是'UpdateScene'函数调用的NetworkClient.AddPlayer。由于loadingSceneAsync现在是一个结构体,你不能将其设置为null,并且在加载完成后,需要一段时间让loadingSceneAsync.IsValid()变为false。因此,我将结构体设置为default,以防止多次调用FinishLoadScene。

5. 现在应该可以运行了,不要忘记将你的场景添加到Addressables Group中。

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

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

相关文章

KVM——虚拟机中使用命令行形式安装虚拟机

目录 一. 删除虚拟机中的虚拟机步骤 二. 虚拟机中以命令行形式安装虚拟机 一. 删除虚拟机中的虚拟机步骤 这样就删除成功了。 二. 虚拟机中以命令行形式安装虚拟机 安装 [rootkvm-server ~]# virt-install --connect qemu:///system -n vm10 -r 3100 --disk path/var/lib…

【Material-UI】复杂按钮 (Complex Button) 自定义详解

文章目录 一、ButtonBase 组件简介二、实例讲解&#xff1a;创建复杂的图片按钮1. 样式定义2. 核心组件构建3. 交互效果 三、高级自定义技巧1. 响应式设计2. 动态内容与动画 四、总结 在现代 Web 应用中&#xff0c;按钮不仅仅是一个点击交互元素&#xff0c;它们也承载着传递信…

批发行业进销存-登录适配 android 横竖屏幕 源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构

一、横竖屏切换的意义 以下是移动端横屏竖屏可切换在进销存中的一些重要应用&#xff1a; a、数据录入与查看 在录入商品信息、库存数量等大量数据时&#xff0c;横屏模式可以提供更宽阔的输入区域&#xff0c;减少输入错误。例如&#xff0c;在输入长串的商品编码或详细的商…

数值分析【1】

第一章&#xff1a; 相对误差 四 规格化浮点数 秦九韶 第二章&#xff1a; 二分法 不动点迭代法 Taylor 埃特金加速 构造新的同根函数 有个公式 牛顿法&#xff08;切线法&#xff09;、弦截法&#xff08;割线法&#xff09;

谷粒商城实战笔记-137-商城业务-首页-整合dev-tools渲染一级分类数据

文章目录 一&#xff0c;使用热加载工具spring-boot-devtools1&#xff0c;引入devtools依赖2&#xff0c;ctrlshiftf9 编译静态资源 二&#xff0c;thymeleaf原理三&#xff0c;渲染一级分类 一&#xff0c;使用热加载工具spring-boot-devtools 因为我们采用的前后端一体的开…

Windows 平台 Docker Protainer可视化平台,忘记登录密码,重置密码

下载protainer 的文件 运行重置密码的密令 docker run --rm -v C:\Users\Administrator\AppData\Local\Docker:/data portainer/helper-reset-password成功运行后可以看到重置的密码 把key 和db 文件重新上传到容器里 docker cp portainer.key portainer:/data/portainer.k…

5.10.结构化开发方法-结构化分析

案例分析第一题会考 结构化特点&#xff1a;自顶向下&#xff0c;逐步分解&#xff0c;面向数据。三大模型&#xff1a;功能模型&#xff08;数据流图&#xff09;、行为模型&#xff08;状态转换图&#xff09;、数据模型(E-R图)以及数据字典。 数据流图DFD 数据流图DFD基…

网络IO模型及零拷贝问题

文章目录 BIOaccept监听案例read案例利用多线程 NIO案例NIO存在的问题 IO multiplexing-IO多路复用文件描述符(FD&#xff0c;句柄&#xff09; 是什么reactor反应模式 select方法优点缺点小总结 poll方法优点缺点 epoll方法 Reactor模式单Reactor单线程 单Reactor多线程主从Re…

linux docker安装 gitlab后忘记root密码如何找回

1. docker ps - a 查看当前gitlab 当前的id2. docker exec -it gitlab /bin/bash 进入docker git 容器中【gitlab 注意可以上图中的name&#xff0c;也可以是id都可以的】,如下图3.gitlab-rails console -e production 输入该指令&#xff0c;启动Ruby on Rails控制台&…

Copy as cURL 字段含义

当前端在开发过程中&#xff0c;遇到接口错误反馈给后端人员时&#xff0c;一般在此接口处右键复制为cURL。 格式如下&#xff1a; curl https://xxx.xxx.cn/xxx/xxx/management/record/list \-H accept: application/json, text/plain, */* \-H accept-language: zh-CN,zh;q0…

LVS集群中的负载均衡技术

目录 1、LVS技术原理 2、NAT模式原理及部署方法 1、工作原理 2、部署方法 1、网络配置 2、软件安装与启用 3、测试 2、DR模式工作原理及部署方法 1、工作原理 2、部署方法 1、网络配置 2、解决vip响应问题 3、测试 3、ipvsadm命令及参数 1.管理集群服务中的增删…

数据同步工具之Flink CDC

Flink CDC&#xff08;Change Data Capture&#xff09;是基于Apache Flink的一个扩展&#xff0c;用于捕获和处理数据库中的数据变化。它能够实时捕获关系数据库中的数据变更&#xff08;如插入、更新、删除操作&#xff09;&#xff0c;并将这些变更流式传输到Flink进行处理。…

【OceanBase系列】—— OceanBase应急三板斧

作者&#xff1a; 花名&#xff1a;洪波&#xff0c; OceanBase 数据库解决方案架构师 目前随着OceanBase数据库越来越流行&#xff0c;社区已经有很多用户在生产环境使用了OceanBase&#xff0c;也有不少用户的核心业务用到了OceanBase数据库&#xff0c;在使用OceanBase数据库…

演示:基于WPF的DrawingVisual开发的矢量地图

一、目的&#xff1a;基于WPF的DrawingVisual开发的矢量地图 二、预览 默认样式 深黑样式 深蓝色样式 深蓝色透明样式 三、环境 VS2022&#xff0c;Net7&#xff0c;GDAL,审图号为GS(2019)1822号矢量数据,DrawingVisual 四、主要功能 支持多种显示样式&#xff08;默认样式&…

代码随想录27期|Python|Day39|​62. 不同路径​|​63. 不同路径 II​

62. 不同路径 简单题。由于规定了只能走右边和下边&#xff0c;所以右下角的值等于左对角线的两数之和。 1、确定dp和下标&#xff1a;二维数组&#xff0c;i&#xff0c;j分别为行和列&#xff0c;dp值为所需步数&#xff1b; 2、 初始化&#xff1a;只有上边和左边全部初始…

Java二十三种设计模式-享元模式(12/23)

享元模式&#xff1a;高效管理大量对象的设计模式 引言 在软件开发中&#xff0c;有时需要处理大量相似或重复的对象&#xff0c;这可能导致内存使用效率低下和性能问题。享元模式提供了一种解决方案&#xff0c;通过共享对象的共同部分来减少内存占用。 基础知识&#xff0c…

Apache OFBiz 曝出严重漏洞,允许预身份验证 RCE

近日&#xff0c;研究人员发现 Apache OFBiz 中存在一个新的关键漏洞&#xff0c;该漏洞是 Apache OFBiz 中的一个错误授权问题&#xff0c;被追踪为CVE-2024-38856。该漏洞影响 18.12.14 之前的版本&#xff0c;18.12.15 版本解决了该漏洞。 SonicWall 的安全研究员 Hasib Vh…

字节跳动发Seed-TTS语音合成模型,可模仿任意人的声音,效果逼真

前期我们介绍过很多语音合成的模型&#xff0c;比如ChatTTS&#xff0c;微软语音合成大模型等&#xff0c;随着大模型的不断进步&#xff0c;其合成的声音基本跟真人没有多大的区别。本期介绍的是字节跳动自家发布的语音合成模型Seed-TTS。 Seed-TTS 推理包含四个功能模块&…

JavaScript中判断变量的类型

数据类型 在 JavaScript 中有 8 种基本的数据类型&#xff08;7 种原始类型和 1 种引用类型&#xff09;&#xff0c;它们分别是&#xff1a; 原始类型/基本类型&#xff1a; Number&#xff0c;BigInt&#xff0c;String&#xff0c;Boolean&#xff0c;null&#xff0c;unde…

C++开发基础之深入理解C++中的两种单例模式实现——线程安全与效率的权衡

引言&#xff1a; 单例模式是设计模式中的一种&#xff0c;它保证一个类仅有一个实例&#xff0c;并提供一个全局访问点。在C中&#xff0c;实现单例模式的方式多种多样&#xff0c;但随着多线程应用的普及&#xff0c;如何确保单例模式在多线程环境下的线程安全性成为了一个重…