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

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

前言

很遗憾,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中。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 多租户系统数据隔离方案
  • 深入理解SQL中的窗口函数
  • Android顶部标题栏自定义,添加按钮
  • springboot多媒体内容管理系统-计算机毕业设计源码08580
  • Linux学习笔记:Linux基础知识汇总(个人复习版)
  • 2435. 矩阵中和能被 K 整除的路径(leetcode)
  • 详解Xilinx FPGA高速串行收发器GTX/GTP(5)--详解8B10B编解码
  • Mojo中值的所有权简介
  • 区块链的搭建和运维4
  • 数据可视化Axure大屏原型制作分享
  • CAN 应用编程基础-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
  • 华为OD-D卷找座位
  • 计算机毕业设计选题推荐-生活垃圾治理系统-Java/Python项目实战
  • 苹果应用程序清理卸载工具:App Cleaner Uninstaller Pro for Mac
  • Python设计模式 - 抽象工厂模式
  • [译] 怎样写一个基础的编译器
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • iOS编译提示和导航提示
  • Javascript Math对象和Date对象常用方法详解
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • nginx 负载服务器优化
  • react 代码优化(一) ——事件处理
  • swift基础之_对象 实例方法 对象方法。
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 半理解系列--Promise的进化史
  • 阿里云API、SDK和CLI应用实践方案
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #stm32驱动外设模块总结w5500模块
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (C语言)fgets与fputs函数详解
  • (C语言)字符分类函数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (二)windows配置JDK环境
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (三十五)大数据实战——Superset可视化平台搭建
  • (十六)串口UART
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (四)React组件、useState、组件样式
  • (转)一些感悟
  • .axf 转化 .bin文件 的方法
  • .NET C# 操作Neo4j图数据库
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net 受管制代码
  • .NET处理HTTP请求
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET开发人员必知的八个网站
  • .NET开发者必备的11款免费工具
  • /bin、/sbin、/usr/bin、/usr/sbin
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [Android]通过PhoneLookup读取所有电话号码
  • [HOW TO]如何在iPhone应用程序中发送邮件