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

AB包相关知识

Lua与AB包/Addressables以及YooAsset摘自千问Lua是菜谱逻辑决定了菜怎么做味道如何。因为你需要随时换菜谱热更新所以菜谱不能死板地印在墙上编译进主包。AssetBundle是外卖盒格式你把写好的菜谱Lua 文件装进外卖盒里方便运输。Addressables / YooAsset是配送系统管理它们负责去仓库服务器拿外卖盒。检查盒子是不是最新的版本管理。把盒子送到厨房内存并拆开盒子把菜谱拿出来交给厨师Lua 虚拟机。值得注意的是现在除了 Lua还有一种流行的热更方案是HybridCLR原 ilruntime/huohuo 的替代者。如果你用HybridCLR你的逻辑是 C# 写的那么 Lua 的地位就会下降可能只用来写简单的 UI 脚本或配置文件。AB包相关概念热更新基本规则AB包浏览器插件的安装AB包浏览器文件的安装https://blog.csdn.net/qq_36303853/article/details/148812182#t5资源概念C#代码不能放到AB包因为C#是编译型语言我们才需要脚本语言luaUnity 编辑器通过反射实现了对预设体上组件的动态识别、属性展示——这就是为什么Csharp脚本文件不能进AB包而组件能进AB包的原因预制体相关概念https://blog.csdn.net/2303_80204192/article/details/157287772#t1AB包打包流程1.给资源划分包如果模型上有其他主包中的资源在打包时会构建依赖关系2.打包页面打包后对应文件夹就会出现build页签中的相关属性AB包资源加载都是先加载AB包再加载AB包中资源1.AB包的同步加载void Start() { //加载AB包 AssetBundle abAssetBundle.LoadFromFile(Application.streamingAssetsPath /model); //加载资源 一种泛型一种非泛型 GameObject goab.LoadAssetGameObject(Sphere); GameObject go2 ab.LoadAsset(Sphere, typeof(GameObject)) as GameObject; //实例化 Instantiate(go); }注意AB包不能重复加载否则会报错2.AB包的异步加载利用协程void Start() { // 开始协程加载 UI 精灵 StartCoroutine(ABResLoad(head, ui_DL_an_queding_01)); } IEnumerator ABResLoad(string ABname, string resName) { // 加载 AB 包 AssetBundleCreateRequest abcr AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath / ABname); yield return abcr; // 加载资源Sprite AssetBundleRequest abr abcr.assetBundle.LoadAssetAsyncSprite(resName); yield return abr; img.sprite abr.asset as Sprite; }3.卸载AB包及其资源void Update() { if (Input.GetKeyDown(KeyCode.Space)) { // 卸载所有加载的 AB 包参数为 true 会把通过 AB 包加载的资源也卸载 AssetBundle.UnloadAllAssetBundles(false); //卸载单个资源 AssetBundle ab AssetBundle.LoadFromFile(Application.streamingAssetsPath /model); // 加载资源泛型和非泛型两种写法 GameObject go ab.LoadAssetGameObject(Sphere); // 卸载单个 AB 包 ab.Unload(false); } }TrueAB包以及资源一起卸载 FalseAB包卸载资源不会卸载AB包的依赖如果一个模型在A包中其材质在B包中那么只加载A包中的模型资源会丢失材质方法一同时加载AB包获取模型材质和模型方法二这里利用主包的依赖性//依赖包的关键知识点—利用主包 获取依赖信息 //加载主包 AssetBundle abMain AssetBundle.LoadFromFile(Application.streamingAssetsPath / PC); //加载主包中的固定文件 AssetBundleManifest abManifest abMain.LoadAssetAssetBundleManifest(AssetBundleManifest); //从固定文件中 得到依赖信息 string[] strs abManifest.GetAllDependencies(model); //得到了 依赖包的名字 for (int i 0; i strs.Length; i) { Debug.Log(strs[i]); }ManiFest文件中的依赖关系如下缺陷主包依赖关系文件只能记录包与包之间的依赖关系至于包中资源具体依赖关系是不知道的比如A包中a资源依赖B包C包A包中b资源需要D包E包使用如上代码会导致加载a资源时也会加载不需要的D包E包GetAllDependencies获取Manifest文件中的与对应包中的依赖关系我这里设定一个红色球球的模型放在model包中材质放在materia包中添加然后根据AB包打包流程打包情况如下调用APIstring[] strs mainABManifest.GetAllDependencies(abName);abName为model即找到model包中的依赖关系并传递给strs函数strs参数中的数据为mateia。AB包资源加载管理器首先需要注意同步加载要有三种方法泛型方法同步加载与普通参数同步加载额外需要注意Lua中不支持泛型方法所以可能会用Type形式同步加载优化端反正三种方法都要完成如下操作加载对应包——查找对应包中的依赖关系——加载对应依赖包——记录加载过的包不如将这套流程打包成一个函数在三个方法中调用public void LoadAB(string abName) { //加载主包及主包的依赖关系 if(mainABnull) { mainAB AssetBundle.LoadFromFile(pathUrl MainABName); mainABManifest mainAB.LoadAssetAssetBundleManifest(AssetBundleManifest); } //获取依赖关系 string[] strs mainABManifest.GetAllDependencies(abName); for(int i0;istrs.Length;i) { //如果AB包的依赖包没有加载过则加载并且记录 if(!abDic.ContainsKey(strs[i])) { AssetBundle ab AssetBundle.LoadFromFile(pathUrl strs[i]); abDic.Add(strs[i],ab); } } //加载资源来源包 //如果AB包没有加载过则加载并且记录 if(!abDic.ContainsKey(abName)) { AssetBundle ab AssetBundle.LoadFromFile(pathUrl abName); abDic.Add(abName,ab); } }不指定类型的同步加载public object LoadRes(string abName,string assetName) { //加载资源 LoadAB(abName); //此处设计优化了一下在加载的同时判断是否为object类型如果是object类型则直接实例化后返回 Object obj abDic[abName].LoadAsset(assetName); if(obj is GameObject) { return Instantiate(obj); } else { return obj; } }指定类型的同步加载public object LoadRes(string abName,string assetName,System.Type type) { //加载资源 LoadAB(abName); //此处设计优化了一下在加载的同时判断是否为object类型如果是object类型则直接实例化后返回 Object obj abDic[abName].LoadAsset(assetName,type); if(obj is GameObject) { return Instantiate(obj); } else { return obj; } }外部调用该函数举例这里的model包中的Sphere存储是红色的球所以会加载一个红色的球public class ABTest : MonoBehaviour { void Start() { GameObject go ABMgr.Instance.LoadRes(model, Sphere,typeof(GameObject)) as GameObject; go.transform.position Vector3.up; } }泛型的同步加载public T LoadResT(string abName,string assetName) where T:Object { //加载资源 LoadAB(abName); //此处设计优化了一下在加载的同时判断是否为object类型如果是object类型则直接实例化后返回 T obj abDic[abName].LoadAssetT(assetName); if(obj is GameObject) { return Instantiate(obj) as T; } else { return obj as T; } }异步加载这里需要注意AB包的加载不适用异步加载只有加载资源时才使用异步加载与同步加载相似也有三种加载方法加载AB包以及AB包依赖关系与同步加载共用APiLoadABabName不指定类型的异步加载public void LoadResAsync(string abName,string assetName,UnityActionObject callback) { StartCoroutine(LoadResAsyncCoroutine(abName,assetName,callback)); } private IEnumerator LoadResAsyncCoroutine(string abName,string assetName,UnityActionObject callback) { //加载AB包 LoadAB(abName); //异步加载资源 AssetBundleRequest abr abDic[abName].LoadAssetAsync(assetName); yield return abr; //此处设计优化了一下在加载的同时判断是否为object类型如果是object类型则直接实例化后返回 Object obj abr.asset; if(obj is GameObject) { callback(Instantiate(obj)); } }对传参UnityActionT不太了解具体原理请看UnityActionhttps://blog.csdn.net/2303_80204192/article/details/157148540#t3调用对应方法指定类型异步加载public void LoadResAsync(string abName,string assetName,System.Type type,UnityActionObject callback) { StartCoroutine(LoadResAsyncCoroutine(abName,assetName,type,callback)); } public IEnumerator LoadResAsyncCoroutine(string abName,string assetName,System.Type type,UnityActionObject callback) { //加载AB包 LoadAB(abName); //异步加载资源 AssetBundleRequest abr abDic[abName].LoadAssetAsync(assetName,type); yield return abr; //此处设计优化了一下在加载的同时判断是否为object类型如果是object类型则直接实例化后返回 Object obj abr.asset; if(obj is GameObject) { callback(Instantiate(obj)); } }根据泛型加载资源public void LoadResAsyncT(string abName,string assetName,UnityActionObject callback) where T:Object { StartCoroutine(LoadResAsyncCoroutineT(abName,assetName,callback)); } public IEnumerator LoadResAsyncCoroutineT(string abName,string assetName,UnityActionObject callback) where T:Object { //加载AB包 LoadAB(abName); //异步加载资源 AssetBundleRequest abr abDic[abName].LoadAssetAsyncT(assetName); yield return abr; //此处设计优化了一下在加载的同时判断是否为object类型如果是object类型则直接实例化后返回 Object obj abr.asset; if(obj is GameObject) { callback(Instantiate(obj)); } }

相关文章:

AB包相关知识

Lua与AB包/Addressables以及YooAsset 摘自千问: Lua 是菜谱(逻辑):决定了菜怎么做,味道如何。因为你需要随时换菜谱(热更新),所以菜谱不能死板地印在墙上(编译进主包&a…...

AI算法工程师如何进行模型部署?这2个工具+3个技巧,快速上线

对于软件测试从业者来说,模型部署并不是一个陌生的概念——随着AI功能逐渐渗透到各类应用软件中,测试工程师不仅需要验证模型输出的准确性,更需要理解部署流程对模型稳定性、响应速度和结果一致性的影响。很多测试同学会有这样的困惑&#xf…...

机器学习的最佳实践:这7个原则让你的模型更稳定

对于软件测试从业者而言,机器学习技术正在快速融入测试流程:从自动化测试用例生成、缺陷预测到测试环境异常检测,机器学习模型的稳定性直接决定了测试结果的可靠性——如果模型在测试环境波动、输入数据变化时性能骤降,不仅无法提…...

基于LSTM自编码器的家用电器功耗异常检测系统构建指南

1. 项目概述:从能耗洞察到智能干预我们每天都在和各种家用电器打交道,从清晨唤醒你的咖啡机,到深夜还在默默工作的路由器。你有没有想过,这些看似微不足道的设备,其背后隐藏的能耗模式,其实大有文章&#x…...

猫抓浏览器扩展终极指南:5分钟掌握全网视频资源下载技巧

猫抓浏览器扩展终极指南:5分钟掌握全网视频资源下载技巧 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否经常遇到心仪的视频无法…...

Redis 客户端连接详解

Redis 客户端连接详解 引言 Redis 是一款高性能的内存数据结构存储系统,常用于缓存、会话管理、实时排行榜等功能。客户端连接是 Redis 生态系统中的重要组成部分,本文将详细介绍 Redis 客户端连接的相关知识,包括连接方式、连接配置、连接管理等方面。 Redis 客户端连接…...

如何快速定制Office界面:终极开源工具使用指南

如何快速定制Office界面:终极开源工具使用指南 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/gh_mirrors/of/office-ribbonx-editor O…...

ArduPilot飞行模式实战:从代码角度看Stabilize、Acro、Loiter模式如何切换(附避坑指南)

ArduPilot飞行模式深度解析:从状态机到实战避坑指南 在开源飞控领域,ArduPilot以其强大的飞行模式系统著称。不同于普通用户只需了解模式功能,开发者更需要掌握模式切换的底层机制——这直接关系到飞行安全与二次开发效率。本文将带您深入Sta…...

不止于绘图:用GMT 6.4的`grdtrack`和`project`命令玩转地形剖面分析与可视化

不止于绘图:用GMT 6.4的grdtrack和project命令玩转地形剖面分析与可视化 当我们谈论地理空间分析时,很多人首先想到的是绘制精美的地图。但GMT(Generic Mapping Tools)的真正魅力在于它强大的地理计算能力。本文将带你超越基础绘图…...

Jetson Orin上TVA模型DLA精准卸载配置

重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...

模拟电路实现自主循线机器人:无MCU的硬件逻辑设计

1. 项目概述:用最纯粹的模拟电路,造一台会“思考”的机器人每次看到那些在赛道上灵巧穿梭的循线小车,你是不是也手痒,想自己动手做一个?但一听到“单片机”、“编程”、“Arduino”这些词,又觉得门槛太高&a…...

Driver Store Explorer终极指南:轻松管理Windows驱动存储区,释放宝贵磁盘空间

Driver Store Explorer终极指南:轻松管理Windows驱动存储区,释放宝贵磁盘空间 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否曾为Windows系统越来越慢而烦…...

DLA功耗优化验证:tegrastats实战指南

重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...

从科研图表到商业报表:如何用Matplotlib的legend()提升你的图表专业度?

从科研图表到商业报表:如何用Matplotlib的legend()提升你的图表专业度? 在数据驱动的决策时代,图表不仅是科研论文中的证据载体,更是商业汇报中的说服工具。我曾见证一位生物统计学家将同一组临床试验数据呈现给三种不同受众&…...

C语言(12) 指针的常见操作

指针的常见操作指针变量&#xff0c;有两方面的意思:一个指针指向的内容(数据值&#xff0c;一级)指针变量本身存储的数据 (地址值)#include <stdio.h>int main() {int a 10;int b 0 ;int c 50;int *p NULL;int *q NULL;p &a; // 对指针变量本身进行修改// 对指…...

想深耕网络安全行业,这些必备条件缺一不可

网络空间的攻防对抗日益激烈&#xff0c;网络安全已成为企业生存和国家安全的命脉&#xff0c;它负责构筑数字世界的坚固防线&#xff0c;保护核心资产与用户隐私免受侵害。 想要成为一名优秀的网络安全专家&#xff0c;除了敏锐的安全意识和高度的责任感&#xff0c;更需要锤…...

DeepSeek安全测试辅助Prompt工程白皮书(含17个CVE靶场验证指令模板)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek安全测试辅助 DeepSeek系列大模型在代码生成、漏洞模式识别与安全上下文理解方面展现出独特优势&#xff0c;可作为安全测试工程师的智能协作者。其对OWASP Top 10、CWE分类体系及常见PoC结构具…...

3步快速上手Whisper-WebUI:轻松实现语音转字幕的完整指南

3步快速上手Whisper-WebUI&#xff1a;轻松实现语音转字幕的完整指南 【免费下载链接】Whisper-WebUI A Web UI for easy subtitle using whisper model. 项目地址: https://gitcode.com/gh_mirrors/wh/Whisper-WebUI 还在为视频制作繁琐的字幕而烦恼吗&#xff1f;Whis…...

第2章 谁在危险中——被AI替代的五类程序员

第2章 谁在危险中——被AI替代的五类程序员 核心问题:哪些程序员最容易被AI替代?背后的原因是什么? 2.1 问题定义:一场正在发生的结构性塌陷 2.1.1 数据不会说谎 2026年1月12日,Ravio发布了一份让整个科技圈沉默的报告:过去一年,初级开发者岗位招聘量暴跌73%。 不是…...

Cesium动态数据可视化实战:CallbackProperty结合setInterval打造实时运动轨迹

Cesium动态数据可视化实战&#xff1a;CallbackProperty结合setInterval打造实时运动轨迹 在三维地理信息系统中&#xff0c;实时数据可视化一直是开发者面临的挑战之一。想象一下&#xff0c;当我们需要在地球表面追踪一架正在飞行的无人机&#xff0c;或者监控城市中数百辆出…...

别让依赖毁了你的实验:记一次Vision Mamba复现中causal_conv1d与mamba-ssm的版本“打架”事件

Vision Mamba复现实战&#xff1a;破解依赖冲突的工程化解决方案在深度学习项目的复现过程中&#xff0c;依赖管理往往是最容易被忽视却又最常导致问题的环节。最近在复现Vision Mamba模型时&#xff0c;我遭遇了一场典型的Python依赖"战争"——causal_conv1d与mamba…...

别再乱建索引了!用Explain的key_len字段,一眼看穿你的MySQL联合索引到底生效了几个字段

解密MySQL联合索引&#xff1a;用key_len精准判断索引生效范围 在数据库性能优化领域&#xff0c;联合索引的使用一直是个既基础又容易踩坑的话题。很多开发者虽然知道"最左匹配原则"这个名词&#xff0c;但在实际业务场景中&#xff0c;面对复杂的查询条件组合时&a…...

终极指南:Windows 10完美安装PL2303驱动,解决老旧USB转串口芯片兼容性问题

终极指南&#xff1a;Windows 10完美安装PL2303驱动&#xff0c;解决老旧USB转串口芯片兼容性问题 【免费下载链接】pl2303-win10 Windows 10 driver for end-of-life PL-2303 chipsets. 项目地址: https://gitcode.com/gh_mirrors/pl/pl2303-win10 你是否还在为Windows…...

基于KS距离度量交通流分布偏移:提升DRL交通信号控制鲁棒性的工程实践

1. 项目概述与核心挑战在智能交通系统&#xff08;ITS&#xff09;领域&#xff0c;基于深度强化学习&#xff08;DRL&#xff09;的交通信号控制&#xff08;Traffic Signal Control&#xff09;正从研究走向实际部署。作为一名长期关注AI落地应用的从业者&#xff0c;我见过太…...

量子机器学习与傅里叶分析:革新期权定价的混合计算范式

1. 项目概述&#xff1a;当量子机器学习遇见金融定价在金融工程的核心地带&#xff0c;期权定价一直是个计算密集型的硬骨头。传统的蒙特卡洛模拟虽然通用&#xff0c;但为了达到足够的精度&#xff0c;动辄需要百万甚至千万次的路径模拟&#xff0c;计算成本高昂。近年来&…...

基于Arduino与蓝牙模块的六路无线开关控制系统设计与实现

1. 项目概述&#xff1a;用手机蓝牙控制六路LED想不想把手机变成一个无线遥控器&#xff0c;随手一点就能开关家里的灯带、氛围灯&#xff0c;甚至是其他电器&#xff1f;这个项目就是为你准备的。它基于一块功能增强的Arduino兼容板——GlowDuino Uno&#xff0c;配合一个极其…...

DIY智能USB充电器:基于电流检测与双稳态继电器的零功耗节能方案

1. 项目概述&#xff1a;打造一款智能、节能的USB手机充电器作为一名电子爱好者&#xff0c;我经常折腾各种电源项目。市面上很多手机充电器&#xff0c;包括一些原装货&#xff0c;都存在一个通病&#xff1a;手机充满电后&#xff0c;充电器依然插在插座上&#xff0c;内部电…...

基于PIC32单片机实现Android USB音频转SPDIF输出的DIY方案

1. 项目概述&#xff1a;为Android设备打造一个高保真SPDIF音频接口作为一名长期折腾嵌入式音频和家庭影院的玩家&#xff0c;我经常遇到一个痛点&#xff1a;手头那些性能不错的Android手机或平板&#xff0c;其内置的3.5mm耳机孔或者USB-C口的音频输出质量&#xff0c;在连接…...

微信红包助手终极指南:无需ROOT的智能抢红包解决方案

微信红包助手终极指南&#xff1a;无需ROOT的智能抢红包解决方案 【免费下载链接】WeChatLuckyMoney :money_with_wings: WeChats lucky money helper (微信抢红包插件) by Zhongyi Tong. An Android app that helps you snatch red packets in WeChat groups. 项目地址: ht…...

AutoPentest:面向红队的渗透测试决策引擎架构解析

1. 这不是又一个“自动化扫描器”&#xff0c;而是一套能替你做决策的渗透测试工作流引擎AutoPentest这个名字&#xff0c;第一眼容易让人联想到Nmap加个for循环、或者Burp Suite里点几下Intruder——但实际用过的人很快会意识到&#xff1a;它根本不在同一个维度上。我第一次在…...