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的,这样虽然避免了协程的的使用,但是把一件事分开 ...
随机推荐
- window配置右键菜单
window配置右键菜单 cmd -> regeidt :打开注册表 文件右键 依次点开HKEY_CLASSES_ROOT ---> * ---> shell. 右键shell,新建 ...
- collections集合模块 [namedtuple,deque,*]
collections是Python内建的一个集合模块,提供了许多有用的集合类. namedtuple namedtuple是一个函数, 它用来创建一个自定义的tuple对象,并且规定了 tuple元 ...
- loj#2552. 「CTSC2018」假面
题目链接 loj#2552. 「CTSC2018」假面 题解 本题严谨的证明了我菜的本质 对于砍人的操作好做找龙哥就好了,blood很少,每次暴力维护一下 对于操作1 设\(a_i\)为第i个人存活的 ...
- POJ 2417 Discrete Logging BSGS
http://poj.org/problem?id=2417 BSGS 大步小步法( baby step giant step ) sqrt( p )的复杂度求出 ( a^x ) % p = b % ...
- hihoCoder.1513.小Hi的烦恼(bitset 五维偏序)
题目链接 五维偏序,对每一维维护bitset,表示哪儿为1(比它大),然后5个bitset与起来就能得到答案了. 具体实现可以用5*n个bitset,按排名搞个前缀和. 复杂度\(O(n^2/w)\) ...
- Python3Numpy——相关性协方差应用
基本理论 Correlation Are there correlations between variables? Correlation measures the strength of the ...
- Python3练习题系列(08)——代码阅读方法及字典跳转表理解
问题:分析下面代码 cities['_find'] = find_city city_found = cities['_find'](cities, state) 分析过程: 一个函数也可以作为一个变 ...
- URL中可以出现的字符
http://blog.csdn.net/hejisan/article/details/51786969
- Unity3d脚本编程_
UnityEngine.Component引入了新的成员,如下: 新引入的成员 ...
- db2笔记
第七章:数据库备份与恢复 (恢复的概念,db2日志,数据库和表空间的备份,数据库和表空间的恢复,数据库和表空间的前滚,recover使用程序,数据库重建,监控备份恢复和复原,优化备份恢复和复原)1) ...