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的,这样虽然避免了协程的的使用,但是把一件事分开 ...
随机推荐
- Ubuntu pkg_resources.DistributionNotFound: The 'Scrapy==1.0.3' distribution was not found and is required by the application
在Ubuntu16.0.4上安装scrapy,参考:Ubuntu16.04安装Scrapy命令 都安装成功后,import scrapy也都没出错,但是在终端输入:scrapy 命令时出现错误: Fi ...
- scss、less 对浏览器兼容的处理方法, css 的单行溢出、多行溢出
1. scss @mixin rounded($param1,$param2) { #{$param1}:$param2; -webkit-#{$param1}: $param2; ...
- emlog编辑器探寻之旅
本文同步于我的个人博客 emlog编辑器探寻之旅 一直想要寻找一个好用的emlog文本编辑器,寻觅了很久,从默认的KindEditor编辑器开始,用了几天就感觉特别难用,很多需求根本满足不了.后来想要 ...
- BZOJ.3575.[HNOI2014]道路堵塞(最短路 动态SPFA)
题目链接 \(Description\) 给你一张有向图及一条\(1\)到\(n\)的最短路.对这条最短路上的每条边,求删掉这条边后\(1\)到\(n\)的最短路是多少. \(Solution\) 枚 ...
- 在web.xml中添加配置解决hibernate 懒加载异常
在web.xml添加如下,注意:在配置在struts2的拦截器之前,只能解决请求时出现的懒加载异常:如果没有请求,还需要lazy属性的添加(比如过滤器) <!-- 配置Spring的用于解决懒加 ...
- Socket编程的UDP与TCP,应用在哪些地方
随着网络技术飞速发展,网速已不再是传输的瓶颈,UDP协议以其简单.传输快的优势,在越来越多场景下取代了TCP,如网页浏览.流媒体.实时游戏.物联网. 1,网速的提升给UDP稳定性提供可靠网络保障 CD ...
- Queue depth
Queue depth - It is the number of I/O requests that can be kept waiting to be serviced in a port que ...
- iOS开发-工厂模式
工厂模式算是开发中比较常见的设计模式,简单工厂模式,工厂模式和抽象工厂模式,都属于工厂模式.简单工厂模式(simple factory)是类的创建模式,静态工厂方法(static factory me ...
- Unity Alpha融合参数(便查)
Alpha Blending,中文译作Alpha混合 Blending就是控制透明的.处于光栅化的最后阶段. 这里例如我们给一个模型贴一个材质,那么在某个点计算出来颜色值称为源,而该点之前累积的颜色值 ...
- Learning to rank的讲解,单文档方法(Pointwise),文档对方法(Pairwise),文档列表方法(Listwise)
学习排序(Learning to Rank) LTR(Learning torank)学习排序是一种监督学习(SupervisedLearning)的排序方法.LTR已经被广泛应用到文本挖掘的很多领域 ...