[Unity3d]打包Assetbundle并加载

简介:

由于我们要将模型资源放在远程的服务器端,但如果直接放fbx模型是不可以加载的,所以我们可以将fbx做成预设或者是直接将其打包成assetbundle格式的,然后通过www来加载获取。


说下使用方法:

1、把附件脚本放到工程文件夹下的...\Assets\Editor文件夹下。

2、在工程的Project视图里点击想要保存的资源,网络上推荐的是Prefab,右键点击,选择菜单里最下面的两个选项任意一个都可以,第一个选项对应的自定义属性有一个过期了,但是不影响使用。

3、指定文件的构建路径和文件后缀,后缀无所谓。

4、推荐制造做法:

任何形式的资源都可以,包括集合资源,比如创建一个空的GameObject,把所有想要关联的其他GameObject都拖进去,然后在project视图里创建一个prefab,将这个集合资源GameObject拖进去作为一个prefab。执行上面的第2、3步骤。


官方的讲解:http://game.ceeger.com/Script/BuildPipeline/BuildPipeline.BuildAssetBundle.html


1.首先要讲一下不同平台下的一个StreamingAssets路径,这是不同的。

	    //不同平台下StreamingAssets的路径是不同的,这里需要注意一下。 	    public static readonly string PathURL = #if UNITY_ANDROID   //安卓 		"jar:file://" + Application.dataPath + "!/assets/"; #elif UNITY_IPHONE  //iPhone 		Application.dataPath + "/Raw/"; #elif UNITY_STANDALONE_WIN || UNITY_EDITOR  //windows平台和web平台 	"file://" + Application.dataPath + "/StreamingAssets/"; #else         string.Empty; #endif

这就获取到了不同平台的一个路径,我们可以将打包的文件放在这些路径下,然后再从这路径去读取资源。

2.关于打包assetbundle的脚本

using UnityEngine; using System.Collections; using UnityEditor;  public class Test : Editor { 	//打包单个 	[MenuItem("Custom Editor/Create AssetBunldes Main")] 	static void CreateAssetBunldesMain () 	{         //获取在Project视图中选择的所有游戏对象 		Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets);           //遍历所有的游戏对象 		foreach (Object obj in SelectedAsset)  		{ 			//本地测试:建议最后将Assetbundle放在StreamingAssets文件夹下,如果没有就创建一个,因为移动平台下只能读取这个路径 			//StreamingAssets是只读路径,不能写入 			//服务器下载:就不需要放在这里,服务器上客户端用www类进行下载。 			string targetPath = Application.dataPath + "/StreamingAssets/" + obj.name + ".assetbundle"; 			if (BuildPipeline.BuildAssetBundle (obj, null, targetPath, BuildAssetBundleOptions.CollectDependencies)) {   				Debug.Log(obj.name +"资源打包成功"); 			}  			else  			{  				Debug.Log(obj.name +"资源打包失败"); 			} 		} 		//刷新编辑器 		AssetDatabase.Refresh ();	 		 	} 	 	[MenuItem("Custom Editor/Create AssetBunldes ALL")] 	static void CreateAssetBunldesALL () 	{ 		 		Caching.CleanCache ();    		string Path = Application.dataPath + "/StreamingAssets/ALL.assetbundle";   		 		Object[] SelectedAsset = Selection.GetFiltered (typeof(Object), SelectionMode.DeepAssets);   		foreach (Object obj in SelectedAsset)  		{ 			Debug.Log ("Create AssetBunldes name :" + obj); 		} 		 		//这里注意第二个参数就行 		if (BuildPipeline.BuildAssetBundle (null, SelectedAsset, Path, BuildAssetBundleOptions.CollectDependencies)) { 			AssetDatabase.Refresh (); 		} else { 			 		} 	} 	 	[MenuItem("Custom Editor/Create Scene")] 	static void CreateSceneALL () 	{ 		//清空一下缓存 		Caching.CleanCache(); 		string Path = Application.dataPath + "/MyScene.unity3d"; 		string  []levels = {"Assets/Level.unity"};     	//打包场景     	BuildPipeline.BuildPlayer( levels, Path,BuildTarget.WebPlayer, BuildOptions.BuildAdditionalStreamedScenes); 		AssetDatabase.Refresh (); 	} 	 } 

前提要新手动创建一个StreamingAssets文件夹

3.读取资源,这里只举例从本地读取,跟从网络读取是一样的,可以参考官方文档:

http://game.ceeger.com/Script/WWW/WWW.html

using UnityEngine; using System.Collections;  public class RunScript : MonoBehaviour { 	  	    //不同平台下StreamingAssets的路径是不同的,这里需要注意一下。 	    public static readonly string PathURL = #if UNITY_ANDROID 		"jar:file://" + Application.dataPath + "!/assets/"; #elif UNITY_IPHONE 		Application.dataPath + "/Raw/"; #elif UNITY_STANDALONE_WIN || UNITY_EDITOR 	"file://" + Application.dataPath + "/StreamingAssets/"; #else         string.Empty; #endif 	 	void OnGUI() 	{ 		if(GUILayout.Button("Main Assetbundle")) 		{ 			//StartCoroutine(LoadMainGameObject(PathURL + "Prefab0.assetbundle")); 			//StartCoroutine(LoadMainGameObject(PathURL +  "Prefab1.assetbundle")); 		 			StartCoroutine(LoadMainCacheGameObject(PathURL + "Prefab0.assetbundle")); 			StartCoroutine(LoadMainCacheGameObject(PathURL +  "Prefab1.assetbundle")); 		} 		 		if(GUILayout.Button("ALL Assetbundle")) 		{ 			StartCoroutine(LoadALLGameObject(PathURL + "ALL.assetbundle")); 		} 		 		if(GUILayout.Button("Open Scene")) 		{ 			StartCoroutine(LoadScene()); 		} 		 	} 	 	//读取一个资源 	 	private IEnumerator LoadMainGameObject(string path) 	{ 		 WWW bundle = new WWW(path); 		  		 yield return bundle; 		  		 //加载到游戏中 		 yield return Instantiate(bundle.assetBundle.mainAsset); 		  		 bundle.assetBundle.Unload(false); 	} 	 	//读取全部资源 	 	private IEnumerator LoadALLGameObject(string path) 	{ 		 WWW bundle = new WWW(path); 		  		 yield return bundle; 		  		 //通过Prefab的名称把他们都读取出来 		 Object  obj0 =  bundle.assetBundle.Load("Prefab0"); 		 Object  obj1 =  bundle.assetBundle.Load("Prefab1"); 		 		 //加载到游戏中	 		 yield return Instantiate(obj0); 		 yield return Instantiate(obj1); 		 bundle.assetBundle.Unload(false); 	} 	 	private IEnumerator LoadMainCacheGameObject(string path) 	{ 		 WWW bundle = WWW.LoadFromCacheOrDownload(path,5); 		  		 yield return bundle; 		  		 //加载到游戏中 		 yield return Instantiate(bundle.assetBundle.mainAsset); 		  		 bundle.assetBundle.Unload(false); 	} 	 	 	private IEnumerator LoadScene() 	{ 		 WWW download = WWW.LoadFromCacheOrDownload ("file://"+Application.dataPath + "/MyScene.unity3d", 1); 			 		  yield return download; 		  var bundle = download.assetBundle;   		  Application.LoadLevel ("Level"); 	} } 


如果assetbundle文件放在服务器端,直接用www.loadfromcacheordownload()通过版本来控制是否从服务器下载并保存到本地。本人亲自测试,这个方法是能下载到本地的,至于下载在本地哪儿我就不太清楚了,我猜测应该是存在沙盒文件下(移动开发者的朋友应该知道),当然也可以自己来做版本控制,那样更灵活,并且摆脱www.loadfromcacheordownload()方法的束缚,貌似这个方法存贮文件是有空间大小限制的,据说是50M,本人没有亲自考证,后期我会自己做一个版本控制!


==================== 迂者 丁小未 CSDN博客专栏=================

MyBlog:http://blog.csdn.net/dingxiaowei2013             MyQQ:1213250243

Unity QQ群:858550         cocos2dx QQ群:280818155

====================== 相互学习,共同进步 ===================


















本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366177,如需转载请自行联系原作者

相关文章
|
3月前
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
185 5
|
3月前
|
API C# 图形学
Unity3D学习笔记9——加载纹理
Unity3D学习笔记9——加载纹理
41 2
|
3月前
|
图形学 数据安全/隐私保护 iOS开发
Unity与IOS⭐Xcode打包,上架TestFlight的完整教程
Unity与IOS⭐Xcode打包,上架TestFlight的完整教程
|
5月前
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
171 2
|
5月前
|
存储 JSON 图形学
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
187 0
|
5月前
|
编解码 算法 图形学
【unity小技巧】减少Unity中的构建打包大小
【unity小技巧】减少Unity中的构建打包大小
161 0
|
5月前
|
定位技术 图形学 开发者
【Unity实战】切换场景加载进度和如何在后台异步加载具有庞大世界的游戏场景,实现无缝衔接(附项目源码)
【Unity实战】切换场景加载进度和如何在后台异步加载具有庞大世界的游戏场景,实现无缝衔接(附项目源码)
355 0
|
6月前
|
缓存 API 图形学
【Unity 3D】AssetBundle打包、上传、加载、卸载详解及演示(附源码)
【Unity 3D】AssetBundle打包、上传、加载、卸载详解及演示(附源码)
268 0
|
3月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
184 6
|
2月前
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
112 4