Lua、AB包热更新总结

1.AB包热更新
(1)AB包是一种特定的压缩文件,可以放模型贴图音效等等
(2)Resources目录下打包时只读 无法修改;而AB包存储的位置是自定义的,能够动态更新,同时可以决定资源包初始的大小。
(3)热更新流程:客户端自带很少的默认资源,通过获取资源服务器地址,再通过文件对比资源服务器的资源,检测哪些是需要下载的,就是AB包。
2.AB包资源打包
(1)官方提供的工具:Asset Bundle Browser
(2)工具的参数
在这里插入图片描述

(3)AB包生成的文件在这里插入图片描述
3.AB包资源加载

void Start(){//加载AB包AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/model");//加载AB包中的指定资源//如果只使用名字加载 可能会出现类型分不清GameObject go2 = ab.LoadAsset("Cube");//建议使用泛型加载 或者 指定类型加载GameObject go2 = ab.LoadAsset<GameObject>("Cube");GameObject go = ab.LoadAsset("Cube", typeof(GameObject)) as GameObject;   Instantiate(go);//同一个AB包不能够重复加载//卸载单个的资源//true会把已经加载的资源也卸载 false则只卸载AB包的资源ab.Unload(true);//卸载所有加载的AB包//false则只卸载AB包的资源AssetBundle.UnloadAllAssetBundles(true);}

4.依赖包
(1)一个资源用到了其他AB包中的资源 此时 如果只加载这个资源 不加载依赖资源的AB包 就会出现材质丢失 所以又要加载该资源 也要加载其他AB包 但是依赖资源太多就会很麻烦,所以使用主包加载这些依赖资源
(2)使用该方法的缺点就是,会加载出全部的依赖资源,但不知道谁需要用,A依赖1资源,B依赖2资源,加载的时候会加载1和2资源
在这里插入图片描述
5.AB管理器的同步加载和异步加载(目的就是更方便的调用)

public class ABManager : BasePanelMono<ABManager>
{//让外部更方便的加载//主包private AssetBundle mainAB = null;//依赖包private AssetBundleManifest mainfest = null;//存储加载过的abprivate Dictionary<string, AssetBundle> abDic = new Dictionary<string, AssetBundle>();private string Path{get{return Application.streamingAssetsPath + "/";}}private string MainABName{get{
#if UNITY_IOSreturn "IOS";
#elif UNITY_ANDROIDreturn "Android";
#elsereturn "PC";
#endif}}public void LoadAB(string abName){//加载主包 和 主包中的固定文件//根据固定文件 获取该AB包的依赖资源 加入字典中//判断字典中是否存在该AB包 加入字典中if (mainAB == null){mainAB = AssetBundle.LoadFromFile(Path + MainABName);mainfest = mainAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");}AssetBundle ab = null;string[] str = mainfest.GetAllDependencies(abName);for (int i = 0; i < str.Length; i++){//判断依赖是否被加载过if (!abDic.ContainsKey(str[i])){ab = AssetBundle.LoadFromFile(Path + str[i]);abDic.Add(str[i], ab);}}if (!abDic.ContainsKey(abName)){ab = AssetBundle.LoadFromFile(Path + abName);abDic.Add(abName, ab);}}/// <summary>/// 同步加载/// </summary>/// <param name="abName"></param>AB包的名字/// <param name="resName"></param>目标资源名字/// <returns></returns>public Object LoadRes(string abName,string resName){LoadAB(abName);Object obj = abDic[abName].LoadAsset(resName);if (obj is GameObject)return Instantiate(obj);elsereturn obj;}public Object LoadRes(string abName, string resName,System.Type type){LoadAB(abName);Object obj = abDic[abName].LoadAsset(resName,type);if (obj is GameObject)return Instantiate(obj);elsereturn obj;}public T LoadRes<T>(string abName, string resName) where T : Object{LoadAB(abName);T obj = abDic[abName].LoadAsset<T>(resName);if (obj is GameObject)return Instantiate(obj);elsereturn obj;}//异步加载public void LoadResAsync(string abName, string resName,UnityAction<Object> callback){StartCoroutine(IELoadResAsync(abName, resName, callback));}private IEnumerator IELoadResAsync(string abName, string resName, UnityAction<Object> callback){LoadAB(abName);AssetBundleRequest abr = abDic[abName].LoadAssetAsync(resName);yield return abr;//等待abr加载完毕//如果abr的资源是gameobject就实例化 不是就返回出去if (abr.asset is GameObject)callback(Instantiate(abr.asset));elsecallback(abr.asset);yield return null;}//单个AB卸载public void Unload(string abName){if(abDic.ContainsKey(abName)){abDic[abName].Unload(false);abDic.Remove(abName);}}//全部卸载public void UnloadAll(){AssetBundle.UnloadAllAssetBundles(false);abDic.Clear();mainAB = null;mainfest = null;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

huggingface笔记:gpt2

0 使用的tips GPT-2是一个具有绝对位置嵌入的模型&#xff0c;因此通常建议在输入的右侧而不是左侧填充GPT-2是通过因果语言建模&#xff08;CLM&#xff09;目标进行训练的&#xff0c;因此在预测序列中的下一个标记方面非常强大 利用这一特性&#xff0c;GPT-2可以生成语法连…

人工智能时代打工人摸鱼秘籍(1)- 为啥说大模型像人?

人工智能以势不可挡的方式席卷全球。 所有公司&#xff0c;都在削尖脑袋想&#xff0c;如何在在产品、营销、运营、服务和管理上加持大人工智能的能力。 公司在卷生卷死的时候&#xff0c;有一批人已经偷偷在用大模型提&#xff08;摸&#xff09;效&#xff08;鱼&#xff09;…

昇思25天学习打卡营第1天|初识MindSpore

# 打卡 day1 目录 # 打卡 day1 初识MindSpore 昇思 MindSpore 是什么&#xff1f; 昇思 MindSpore 优势|特点 昇思 MindSpore 不足 官方生态学习地址 初识MindSpore 昇思 MindSpore 是什么&#xff1f; 昇思MindSpore 是全场景深度学习架构&#xff0c;为开发者提供了全…

KDP数据分析实战:从0到1完成数据实时采集处理到可视化

智领云自主研发的开源轻量级Kubernetes数据平台&#xff0c;即Kubernetes Data Platform (简称KDP)&#xff0c;能够为用户提供在Kubernetes上的一站式云原生数据集成与开发平台。在最新的v1.1.0版本中&#xff0c;用户可借助 KDP 平台上开箱即用的 Airflow、AirByte、Flink、K…

LLMs之gptpdf:gptpdf的简介、安装和使用方法、案例应用之详细攻略

LLMs之gptpdf&#xff1a;gptpdf的简介、安装和使用方法、案例应用之详细攻略 目录 gptpdf的简介 1、处理流程 第一步&#xff0c;使用 PyMuPDF 库&#xff0c;对 PDF 进行解析出所有非文本区域&#xff0c;并做好标记&#xff0c;比如: 第二步&#xff0c;使用视觉大模型&…

RUST 编程语言 绘制随机颜色图片 画圆形 画矩形 画直线

什么是Rust Rust是一种系统编程语言&#xff0c;旨在提供高性能和安全性。它是由Mozilla和其开发社区创建的开源语言&#xff0c;设计目标是在C的应用场景中提供一种现代、可靠和高效的选择。Rust的目标是成为一种通用编程语言&#xff0c;能够处理各种计算任务&#xff0c;包…

基于若依的文件上传、下载

基于若依实现文件上传、下载 文章目录 基于若依实现文件上传、下载1、前端实现-文件上传1.1 通用上传分析1.2 修改实现上传接口 2、后端实现-文件上传3、后端实现-文件下载4、前端实现-文件下载 官网其实也写了&#xff0c;但是我是自己改造封装了一下&#xff0c;再次迈向全栈…

3.js - 模板渲染 - 简单

3.js 真tm枯燥啊&#xff0c;狗都不学 效果图 源码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } from three/examples/jsm/libs/li…

elementui中日期/时间的禁用处理,使用传值的方式

项目中,经常会用到 在一个学年或者一个学期或者某一个时间段需要做的某件事情,则我们需要在创建这个事件的时候,需要设置一定的时间周期,那这个时间周期就需要给一定的限制处理,避免用户的误操作,优化用户体验 如下:需求为,在选择学年后,学期的设置需要在学年中,且结束时间大…

使用京东云主机搭建幻兽帕鲁游戏联机服务器全流程,0基础教程

使用京东云服务器搭建幻兽帕鲁Palworld游戏联机服务器教程&#xff0c;非常简单&#xff0c;京东云推出幻兽帕鲁镜像系统&#xff0c;镜像直接选择幻兽帕鲁镜像即可一键自动部署&#xff0c;不需要手动操作&#xff0c;真正的新手0基础部署幻兽帕鲁&#xff0c;阿腾云整理基于京…

【LabVIEW学习篇 - 2】:LabVIEW的编程特点

文章目录 LabVIEW的编程特点图形编程天然并行运行基于数据流运行 LabVIEW的编程特点 图形编程 LabVIEW使用图形化的图形化编程语言&#xff08;G语言&#xff09;&#xff0c;用户通过在程序框图中拖放和连接各种节点&#xff08;Nodes&#xff09;来编写程序。每个节点代表一…

图像增强 目标检测 仿射变换 图像处理 扭曲图像

1.背景 在目标检测中&#xff0c;需要进行图像增强。这里的代码模拟了旋转、扭曲图像的功能&#xff0c;并且在扭曲的时候&#xff0c;能够同时把标注的结果也进行扭曲。 这里忽略了读取xml的过程&#xff0c;假设图像IMG存在对应的标注框&#xff0c;且坐标为左上、右下两个…

vue学习笔记(购物车小案例)

用一个简单的购物车demo来回顾一下其中需要注意的细节。 先看一下最终效果 功能&#xff1a; &#xff08;1&#xff09;全选按钮和下面的商品项的选中状态同步&#xff0c;当下面的商品全部选中时&#xff0c;全选勾选&#xff0c;反之&#xff0c;则不勾选。 &#xff08…

SpringBoot新手快速入门系列教程四:创建第一个SringBoot的API

首先我们用IDEA新建一个项目&#xff0c;请将这些关键位置按照我的设置设置一下 接下来我将要带着你一步一步创建一个Get请求和Post请求&#xff0c;通过客户端请求的参数&#xff0c;以json格式返回该参数{“message”:"Hello"} 1,先在IDE左上角把这里改为文件模式…

华为云OBS 通过S3客户端访问

华为云好像没有对S3协议的支持说明其实底层是支持S3协议的。 使用S3的时候我们会需要endpoint&#xff0c;桶名字&#xff0c;region&#xff0c;AWS_ACCESS_KEY,AWS_SECRET_KEY 其中endpoint 就是图片中的&#xff0c;桶名字也很容易找到&#xff0c;region 就是你的endpoint…

【开源项目】LocalSend 局域网文件传输工具

【开源项目】LocalSend 局域网文件传输工具 一个免费、开源、跨平台的局域网传输工具 LocalSend 简介 LocalSend 是一个免费的开源跨平台的应用程序&#xff0c;允许用户在不需要互联网连接的情况下&#xff0c;通过本地网络安全地与附近设备共享文件和消息。 项目地址&…

liunx文件系统,日志分析

文章目录 1.inode与block1.1 inode与block概述1.2 inode的内容1.3 文件存储1.4 inode的大小1.5 inode的特殊作用 2.硬链接与软链接2.1链接文件分类 3.恢复误删除的文件3.1 案例:恢复EXT类型的文件3.2 案例:恢复XFS类型的文件3.2.1 xfsdump使用限制 4.分析日志文件4.1日志文件4.…

docker部署redis/mongodb/

一、redis 创建/root/redis/conf/redis.conf 全部执行命令如下 docker run -it -d --name redis -p 6379:6379 --net mynet --ip 172.18.0.9 -m 400m -v /root/redis/conf:/usr/local/etc/redis -e TXAsia/Shangehai redis redis-server /usr/local/etc/redis/redis.conf 部署…

Java 基础--File - IO流(2)

I/O流 定义 数据从硬盘流向内存为输入流&#xff0c;数据从内存流向硬盘为输出流。输入也叫读取数据&#xff0c;输出也叫写出数据。 IO分类 1.按照数据的流向分为&#xff1a;输入流和输出流 ①输入流&#xff1a;把数据从其他设备上读取到内存中的流 ②输出流&#xff1…

python小练习04

三国演义词频统计与词云图绘制 import jieba import wordcloud def analysis():txt open("三国演义.txt",r,encodingutf-8).read()words jieba.lcut(txt)#精确模式counts {}for word in words:if len(word) 1:continueelif word "诸葛亮" or word &q…