Unity5 AssetBundle系列——资源加载卸载以及AssetBundleManifest的使用
下面代码列出了对于assetbundle资源的常用操作,其中有针对bundle、asset、gameobject三种类型对象的操作,实际使用中尽量保证成对使用。
这一块的操作比较繁琐,但只要使用正确,是可以保证资源完全没有泄露的。
using UnityEngine;
using System.Collections; public class TestAssetBundle : MonoBehaviour
{
public string AssetBundleName = "cube1.assetbundle"; private string dir = "";
private AssetBundle bundle = null;
private UnityEngine.Object asset = null;
private GameObject go = null; private void Start() { dir = Application.dataPath + "/StreamingAssets/"; } private void OnGUI()
{
// 这些操作一遍走下来,申请的资源是可以完全回收的
if (GUILayout.Button("LoadAssetBundle", GUILayout.Width(), GUILayout.Height())) { LoadBundle(); }
if (GUILayout.Button("LoadAsset", GUILayout.Width(), GUILayout.Height())) { LoadAsset(); }
if (GUILayout.Button("Instantiate", GUILayout.Width(), GUILayout.Height())) { Instantiate(); }
if (GUILayout.Button("Destroy", GUILayout.Width(), GUILayout.Height())) { Destroy(); }
if (GUILayout.Button("Unload", GUILayout.Width(), GUILayout.Height())) { Unload(); }
if (GUILayout.Button("UnloadForce", GUILayout.Width(), GUILayout.Height())) { UnloadForce(); }
if (GUILayout.Button("UnloadUnusedAssets", GUILayout.Width(), GUILayout.Height())) { UnloadUnusedAssets(); }
} // 加载AssetBundle
private void LoadBundle()
{
bundle = AssetBundle.LoadFromFile(System.IO.Path.Combine(dir, AssetBundleName));
if (bundle == null) Debug.LogError("LoadBundle Failed");
} // 从AssetBundle加载Asset
private void LoadAsset()
{
if (bundle == null) return; asset = bundle.LoadAsset("Cube1");
if (asset == null) Debug.LogError("LoadAsset Failed");
} // 根据Asset实例化GameObject
private void Instantiate()
{
if (asset == null) return; go = GameObject.Instantiate(asset) as GameObject;
if (go == null) Debug.LogError("Instantiate Failed");
} // 销毁GameObject
private void Destroy()
{
if (go == null) return; GameObject.Destroy(go);
go = null;
} // 弱卸载,释放AssetBundle本身的内存
private void Unload()
{
if (bundle == null) return; // unload完,bundle就不能再用了,记得要置空
bundle.Unload(false);
asset = null;
bundle = null;
} // 强卸载(无视引用的卸载),释放AssetBundle本身的内存,同时回收从AssetBundle抽取的Asset
private void UnloadForce()
{
if (bundle == null) return; // unload完,bundle就不能再用了,记得要置空
bundle.Unload(true);
asset = null;
bundle = null;
} // 全局弱卸载,回收无引用Asset
private void UnloadUnusedAssets()
{
Resources.UnloadUnusedAssets();
} }
由于bundle相互之前会有依赖,所以在使用一个bundle包之前,需要先加载其依赖的所有bundle包,这个过程需要借助全局manifest来实现,简单代码如下:
using UnityEngine;
using System.Collections; public class TestManifest : MonoBehaviour
{
private string dir = "";
private GameObject go = null;
private AssetBundleManifest manifest = null; private void Start() { dir = Application.dataPath + "/StreamingAssets/"; } private void OnGUI()
{
if (GUILayout.Button("LoadAssetBundleManifest", GUILayout.Width(), GUILayout.Height())) { LoadAssetBundleManifest(); }
if (GUILayout.Button("LoadBundle", GUILayout.Width(), GUILayout.Height())) { LoadBundle(); }
} // 加载Manifest
private void LoadAssetBundleManifest()
{
var bundle = AssetBundle.LoadFromFile(System.IO.Path.Combine(dir, "StreamingAssets"));
manifest = bundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
// 压缩包释放掉
bundle.Unload(false);
bundle = null;
} // 加载AssetBundle
private void LoadBundle()
{
string bundleName = "assets.resources.test.cube1.prefab.assetbundle";
// 注意:GetAllDependencies会返回直接和间接关联的AssetBundle
// 加载依赖包没有顺序要求
string[] dependence = manifest.GetAllDependencies(bundleName);
for (int i = ; i < dependence.Length; ++i )
{
AssetBundle.LoadFromFile(System.IO.Path.Combine(dir, dependence[i]));
// 注意:这里不需要手动LoadAsset
// 只需要加载AssetBundle即可
// Asset会在加载其它关联Asset时自动加载
} var bundle = AssetBundle.LoadFromFile(System.IO.Path.Combine(dir, bundleName));
var asset = bundle.LoadAsset("Cube1");
go = GameObject.Instantiate(asset) as GameObject;
}
}
Unity5 AssetBundle系列——资源加载卸载以及AssetBundleManifest的使用的更多相关文章
- Unity5 AssetBundle 打包以及加载
using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEditor; us ...
- Unity -- AssetBundle(本地资源加载和加载依赖关系)
1.本地资源加载 1).建立Editor文件夹 2).建立StreamingAssets文件夹和其Windows的子文件夹 将下方第一个脚本放入Editor 里面 脚本一 资源打包AssetBund ...
- AssetBundle系列——资源的加载、简易的资源管理器
每个需要进行资源管理的类都继承自IAssetManager,该类维护它所使用到的所有资源的一个资源列表.并且每个资源管理类可以重写其资源引用接口和解引用接口. 每个管理器有自己的管理策略,比如Scen ...
- 详谈 Unity3D AssetBundle 资源加载,结合实际项目开发实例
第一次搞资源更新方面,这里只说更新,加载,AssetBundle资源加载,谈谈自己的理解,以及自己在项目中遇到的那些神坑,现在回想一下,真的是自己跪着过来的,说多了,都是泪. 我这边是安卓AssetB ...
- AssetBundle使用心得【资源加载】
0.资源加载方式 静态资源 Asset下所有资源称为静态资源 Resources资源 Resources目录下,通过实例化得到的资源 AssetBundle资源 又称为增量更新资源 1.什么是Asse ...
- 细谈unity资源加载和卸载
转载请标明出处:http://www.cnblogs.com/zblade/ 一.概要 在了解unity的资源管理方式之后,接下来细谈一下Unity的资源是如何从磁盘中加载到运行时的内存中,以及又是如 ...
- Unity3D之Mecanim动画系统学习笔记(十):Mecanim动画的资源加载相关
资源加载是必备的知识点,这里就说说Mecanim动画的资源如何打包及加载. 注意,Unity4.x和Unity5.x的AssetBundle打包策略不一样,本笔记是基于Unity4.x的AssetBu ...
- Unity5 AssetBundle系列——简单的AssetBundleManager
一个AssetBundle同时只能加载一次,所以实际使用中一般会伴随着AssetBundle包的管理. 下面是一个简单的AssetBundle管理器,提供了同步和异步加载函数: using Unity ...
- Assetbundle管理与加载
最近在做项目优化的时候发现公司的项目用的还是老式的WWW去加载assetbundle资源的形式,而且是通过在两个Update里面分开加载AB和Asset的,这样虽然避免了协程的的使用,但是把一件事分开 ...
随机推荐
- asp.net core for vs code
1,命令 2,模板 3,更换启动浏览器 4,vscode使用nuget 5,使用ef migration 6,配置.net core的工作目录 7,使用dotnet ef migrations命令 8 ...
- Android-认识Bitmap
Android-认识Bitmap 学习自 Android开发艺术探索 例行废话 在Android的各种APP中都被离不开各种各样的图片,有的图片很大,有的图片很小不管这样图片都是一种很吃内存的资源,而 ...
- Android二维码学习
http://www.cnblogs.com/liuan/category/347622.html http://blog.csdn.net/xiaanming/article/details/101 ...
- C#获得窗口控件句柄
/*整个Windows编程的基础.一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例,诸如,一个窗口,按钮,图标,滚动条, ...
- BZOJ.3252.攻略(贪心 长链剖分/线段树)
题目链接 贪心,每次选价值最大的一条到根的链.比较显然(不选白不选). 考虑如何维护这个过程.一个点的价值选了就没有了,而它只会影响它子树里的点,可以用DFS序+线段树修改.而求最大值也可以用线段树. ...
- php curl请求https 返回无结果|false|errno:35
1 SSL: certificate subject name 'WMSvc-GWAMSERVER02' does not match target host name 把curl_setopt($c ...
- BZOJ4261 : 建设游乐场
将图黑白染色,每个点拆成两个点,分别表示水平和竖直方向,再增加一个点以控制流量,那么每个格子都需要找两个方向去连接. $S$到每个黑点的控制点连边,流量$2$,费用$0$: 控制点向两个方向的点各连两 ...
- 19 个必须知道的 Visual Studio 快捷键
项目相关的快捷键 Ctrl + Shift + B = 生成项目 Ctrl + Alt + L = 显示Solution Explorer(解决方案资源管理器) Shift + Alt+ C = 添加 ...
- python测试开发django-49.allow_tags和mark_safe
前言 前面一篇使用allow_tags方法可以在xadmin的后台页面中插入html代码,在2.x版本ModelAdmin里面删除了allow_tags属性的支持,使用mark_safe函数代替 al ...
- 使用Python学习selenium测试工具-4:查找元素
转自:https://blog.csdn.net/wd168/article/details/51819930 web通常包含了Hyper Text Markup Language (HTML).Ca ...