Unity3d 同步加载 Assetbundle 方法 AssetBundle.CreateFromFile

今天在群里问朋友有没有 同步加载 Assetbundle 的方法,同事给我指点 Unity3d 不知道在哪一个版本新增了一个 AssetBundle.CreateFromFile 的接口,这个接口是同步读取Assetbundle的。于是到帮助文档查询相关资料。

http://docs.unity3d.com/ScriptReference/AssetBundle.CreateFromFile.html

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

AssetBundle.CreateFromFile
public static AssetBundle CreateFromFile(string path);
Parameters
path	Path of the file on disk

See Also: WWW.assetBundle, WWW.LoadFromCacheOrDownload.
Description

Loads an asset bundle from a disk.

Only uncompressed asset bundles are supported by this function. This is the fastest way to load an asset bundle.

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

与之前使用WWW方式相比,使用 CreateFromFile读取 Assetbundle 方式有以下不同:

1、WWW是异步的, CreateFromFile 是同步的。

2、CreateFromFile接口读取的必须是没有压缩的Assetbundle文件。

来对比两种方式的打包与读取

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

打包Assetbundle 压缩 与 不压缩

如果使用 CreateFromFile 这个API 来读取 Assetbundle ,那么打包 Assetbundle 的时候要注意打包成 非压缩的 ,也就是要加上 这个 设置。

BuildAssetBundleOptions.UncompressedAssetBundle

代码如下:

using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;

public class NewBehaviourScript : Editor {

	[MenuItem ("cp/build Girl NoLZMA")]
	static void BuildGirlNoLZMA()
	{
		string targetdir = Application.dataPath + "/bundleNoLZMA";

		uint crc = 0;
		//公共资源入栈;
		BuildPipeline.PushAssetDependencies ();

		string filePath = "Assets/res/01.png";
		Object obj = AssetDatabase.LoadMainAssetAtPath(filePath);
		//Build;
		if (BuildPipeline.BuildAssetBundle(obj, null, targetdir+"/01.png.unity3d", out crc,BuildAssetBundleOptions.UncompressedAssetBundle | BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.DeterministicAssetBundle, BuildTarget.StandaloneWindows))
		{
			AssetDatabase.Refresh ();
		}

		filePath = "Assets/res/Aoki Shizuku.mp3";
		obj = AssetDatabase.LoadMainAssetAtPath(filePath);
		//Build;
		if (BuildPipeline.BuildAssetBundle(obj, null, targetdir+"/Aoki Shizuku.mp3.unity3d", out crc,BuildAssetBundleOptions.UncompressedAssetBundle | BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.DeterministicAssetBundle, BuildTarget.StandaloneWindows))
		{
			AssetDatabase.Refresh ();
		}

		//普通资源入栈;
		BuildPipeline.PushAssetDependencies ();

		filePath = "Assets/Resources/Girl.prefab";
		obj = AssetDatabase.LoadMainAssetAtPath(filePath);
		//Build;
		if (BuildPipeline.BuildAssetBundle(obj, null, targetdir+"/Girl.prefab.unity3d", out crc,BuildAssetBundleOptions.UncompressedAssetBundle | BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.DeterministicAssetBundle, BuildTarget.StandaloneWindows))
		{
			AssetDatabase.Refresh ();
		}

		BuildPipeline.PopAssetDependencies ();
		BuildPipeline.PopAssetDependencies ();

	}

	[MenuItem ("cp/build Girl")]
	static void BuildGirl()
	{
		string targetdir = Application.dataPath + "/bundle";

		uint crc = 0;
		//公共资源入栈;
		BuildPipeline.PushAssetDependencies ();

		string filePath = "Assets/res/01.png";
		Object obj = AssetDatabase.LoadMainAssetAtPath(filePath);
		//Build;
		if (BuildPipeline.BuildAssetBundle(obj, null, targetdir+"/01.png.unity3d", out crc, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.DeterministicAssetBundle, BuildTarget.StandaloneWindows))
		{
			AssetDatabase.Refresh ();
		}

		filePath = "Assets/res/Aoki Shizuku.mp3";
		obj = AssetDatabase.LoadMainAssetAtPath(filePath);
		//Build;
		if (BuildPipeline.BuildAssetBundle(obj, null, targetdir+"/Aoki Shizuku.mp3.unity3d", out crc, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.DeterministicAssetBundle, BuildTarget.StandaloneWindows))
		{
			AssetDatabase.Refresh ();
		}

		//普通资源入栈;
		BuildPipeline.PushAssetDependencies ();

		filePath = "Assets/Resources/Girl.prefab";
		obj = AssetDatabase.LoadMainAssetAtPath(filePath);
		//Build;
		if (BuildPipeline.BuildAssetBundle(obj, null, targetdir+"/Girl.prefab.unity3d", out crc, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.DeterministicAssetBundle, BuildTarget.StandaloneWindows))
		{
			AssetDatabase.Refresh ();
		}

		BuildPipeline.PopAssetDependencies ();
		BuildPipeline.PopAssetDependencies ();

	}
}

加上 不压缩 的设置后,打包 Assetbundle 速度明显变快。

对比两种方式打包出来的 Assetbundle 文件。  文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

WWW 与 CreateFromFile 方式读取 Assetbundle

CreateFromFile 是同步操作,WWW 是异步操作。

using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour {

	// Use this for initialization
	void Start () {

	}

	// Update is called once per frame
	void Update () {
		//Debug.Log ("Update");
	}

	void OnGUI()
	{

		if(GUILayout.Button("Load Girl"))
		{
			StartCoroutine(LoadDepends("file://"+Application.dataPath+"/bundle/01.png.unity3d"));
			StartCoroutine(LoadDepends("file://"+Application.dataPath+"/bundle/Aoki Shizuku.mp3.unity3d"));

			StartCoroutine(Load("file://"+Application.dataPath+"/bundle/Girl.prefab.unity3d"));
		}

		if(GUILayout.Button("Load Girl NOLZMA"))
		{
			AssetBundle assetbundle01=AssetBundle.CreateFromFile(Application.dataPath+"/bundleNoLZMA/01.png.unity3d");
			AssetBundle assetbundlemp3=AssetBundle.CreateFromFile(Application.dataPath+"/bundleNoLZMA/Aoki Shizuku.mp3.unity3d");

			AssetBundle assetbundle=AssetBundle.CreateFromFile(Application.dataPath+"/bundleNoLZMA/Girl.prefab.unity3d");
			Instantiate(assetbundle.mainAsset);
		}
	}

	private IEnumerator LoadDepends(string path)
	{
		WWW www = new WWW (path);
		Debug.Log("LoadDepends 1");
		yield return www;
		Debug.Log ("LoadDepends 2");
		Object obj= Instantiate (www.assetBundle.mainAsset);
		Debug.Log("LoadDepends 3");
		yield return new WaitForSeconds (3.0f);
	}

	private IEnumerator Load(string path)
	{
		yield return new WaitForSeconds (3f);

		WWW www = new WWW (path);
		Debug.Log("Load 1");
		yield return www;
		Debug.Log ("Load 2");
		Object obj= Instantiate (www.assetBundle.mainAsset);
		Debug.Log("Load 3");
		www.assetBundle.Unload (false);
		Resources.UnloadUnusedAssets ();
	}

}

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

注意:

使用 不压缩 打包 Assetbundle 的方式,推荐大家使用 7Zip 的 LZMA 压缩算法进行整体压缩,在游戏开始时进行解压。

示例工程下载:

http://pan.baidu.com/s/1o63fOz4

文章转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

时间: 2024-08-24 03:39:10

Unity3d 同步加载 Assetbundle 方法 AssetBundle.CreateFromFile的相关文章

Unity3d热更新全书-资源加载(一)从AssetBundle说起

Unity3D动态下载资源,有没有解?有,AssetBundle就是通用解,任何一本书都会花大幅篇章来介绍AssetBundle. 我们也来说说AssetBundle 我们试全面的分析一下Unity3D提供的资源加载机制 1.Resources//内嵌资源,使用方法Resources.Load,可以加载任意种类的资源,不能动态修改,卒. 2.StreamingAssets//随包资源,使用方法IO或WWW.Load.WWW.Load可以加载任意种类资源,IO仅限bytes 和 text. 3.W

Unity3D异步加载方法

异步加载的方法很多,这里我介绍一下我前段时间学到的一个异步加载方法,感觉挺好用,有兴趣的可以看看,下面就直接贴代码: /// <summary> /// Async to load. /// Created By Hong Youwei /// 2015.3.25 /// </summary> using UnityEngine; using System.Collections; public class AsyncToLoad : MonoBehaviour { public

Javascript 文件的同步加载与异步加载

HTML 4.01 的script属性 charset: 可选.指定src引入代码的字符集,大多数浏览器忽略该值.defer: boolean, 可选.延迟脚本执行,相当于将script标签放入页面body标签的底部,js脚本会在document的DOMContentLoaded之前执行.除IE和较新版本的Firefox外,其他浏览器并未支持.language: 已废弃.大部分浏览器会忽略该值.src: 可选.指定引入的外部代码文件,不限制后缀名.type: 必选.指定脚本的内容类型(MIME类

关于AMD(异步加载模块)和CMD(同步加载模块),require.js

1.CommonJS,有一个全局性方法require(),用于加载模块.假定有一个数学模块math.js,就可以像下面这样加载. var math = require('math'); 然后,就可以调用模块提供的方法: var math = require('math'); math.add(2,3); // 5 第二行math.add(2, 3),在第一行require('math')之后运行,因此必须等math.js加载完成.也就是说,如果加载时间很长,整个应用就会停在那里等. 这对服务器端

Android处理延时加载的方法

在项目开发中,经常需要通过延时加载来实现满足我们的项目要求.那到底怎样来实现延时,下面结合java与android的相关方法来实现延时问题. 一.利用线程的Sleep方法 <span style="font-family:Microsoft YaHei;font-size:18px;"><span style="white-space:pre"> </span>new Thread(new Runnable(){ @Overrid

同步加载、异步加载、延迟加载

一.同步加载 平常默认用的都是同步加载.如:<script src="http://yourdomain.com/script.js"></script>  同步模式又称阻塞模式,会阻止浏览器的后续处理,停止了后续的文件的解析,执行,如图像的渲染.流览器之所以会采用同步模式,是因为加载的js文件中有对dom的操作,重定向,输出document等默认行为,所以同步才是最安全的.通常会把要加载的js放到body结束标签之前,使得js可在页面最后加载,尽量减少阻塞页面

js jquery 页面加载初始化方法

一.js页面加载初始化方法 // 1.在body里面写初始化方法. <body onload='init()'> </body> <script type="text/javascript"> function init(){ // 初始化内容 } </script> // 2.window.onload=function(){} <script type="text/javascript"> window

Fragment的可见再加载的方法(真正的Fragment的OnResume和OnPause)

一 起因 我们在做应用的过程中,一个应用的界面可能是多个Fragment切换而成的,但是如果在每次应用启动的时候就去加载大量的网络数据(假设你的每个Fragment都需要加载网络数据,你也可以理解为初始化大量资源)肯定是不好的,能不能有一种方法可以在我们看到我们的Fragment时再去加载对应的Fragment的数据呢? 当然是有的. 二 解决 Fragment虽然有onResume和onPause的,但是这两个方法是Activity的方法,调用时机也是与Activity相同,和ViewPage

html页面加载初始化方法

js: 方法一: window.onload=function(){内容} 方法二(自己定义方法): function onload(){内容} onload(); jQuery: 方法一: $(document).ready(function(){内容}); 方法二: $(function(){内容}); 方法三: jQuery(function($){内容}); 注意:由于jquery使用$符号,这样和有些组件 ,例如dwr就有冲突,为了解决这个问题,可以使用:var j = jQuery.