Unity5 AssetBundle 打包以及加载
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using System.IO; public class BuildAssetBundle : Editor { //需要打包的路径,根据项目具体需求自己定
private static string assetPath = "AllAssets"; //导出包路径
private static string AssetBundleOutPsth = "Assets/StreamingAssets"; //保存需要打包的资源路径
private static List<string> assetPathList = new List<string>(); //需要打包的资源后缀
private static Dictionary<string, string> asExtensionDic = new Dictionary<string, string> (); [MenuItem("Assets/BuildAssetBundle")]
private static void BuildAssetBundleSource()
{
assetPathList.Clear (); //根据不同平台拼接不同平台导出路径
string outPsth = Path.Combine (AssetBundleOutPsth, Plathform.GetPlatformFolder(EditorUserBuildSettings.activeBuildTarget)); GetDirs(Application.dataPath + "/" + assetPath); BuildAsset (outPsth);
} //添加需要打包资源的后缀
private static void SetASExtensionDic ()
{
asExtensionDic.Clear (); asExtensionDic.Add (".prefab", ".unity3d");
asExtensionDic.Add (".mat", ".unity3d");
asExtensionDic.Add (".png", ".unity3d");
} //遍历制定文件夹获取需要打包的资源路径
private static void GetDirs(string dirPath)
{
foreach (string path in Directory.GetFiles(dirPath))
{
// 通过资源后缀判断资源是否为需要打包的资源
if (asExtensionDic.ContainsKey(System.IO.Path.GetExtension(path)))
{
//将需要打包的资源路径添加到打包路劲中
assetPathList.Add(path);
}
} if (Directory.GetDirectories(dirPath).Length > ) //遍历所有文件夹
{
foreach (string path in Directory.GetDirectories(dirPath))
{
//使用递归方法遍历所有文件夹
GetDirs(path);
}
}
} //清除已经打包的资源 AssetBundleNames
private static void ClearAssetBundlesName()
{
int length = AssetDatabase.GetAllAssetBundleNames ().Length;
Debug.Log (length);
string[] oldAssetBundleNames = new string[length];
for (int i = ; i < length; i++)
{
oldAssetBundleNames[i] = AssetDatabase.GetAllAssetBundleNames()[i];
} for (int j = ; j < oldAssetBundleNames.Length; j++)
{
AssetDatabase.RemoveAssetBundleName(oldAssetBundleNames[j],true);
}
} //打AS包
private static void BuildAsset(string outPath)
{
//遍历获取到的打包资源路径
for (int i = ; i < assetPathList.Count; i ++)
{
string asPath = assetPathList[i]; //通过资源路径来获取需要打包的资源
AssetImporter assetImporter = AssetImporter.GetAtPath(asPath);
if (assetImporter == null)
{
continue;
} // 从此处(assetPath = "AllAssets")截取路径
string assetName = asPath.Substring(asPath.IndexOf(assetPath));
//替换后缀名
assetName = assetName.Replace(Path.GetExtension(assetName), ".unity3d");
//设置打包资源的名字包括后缀
assetImporter.assetBundleName = assetName;
} //如果不存在到处路径文件,创建一个
if (!Directory.Exists (outPath)) {
Directory.CreateDirectory(outPath);
} //打包
BuildPipeline.BuildAssetBundles (outPath, , EditorUserBuildSettings.activeBuildTarget); //刷新资源路径,避免生成的文件不显示
AssetDatabase.Refresh ();
}
} //根据切换的平台返回相应的导出路径
public class Plathform
{
public static string GetPlatformFolder(BuildTarget target)
{
switch (target)
{
case BuildTarget.Android: //Android平台导出到 Android文件夹中
return "Android";
case BuildTarget.iOS:
return "IOS";
case BuildTarget.WebPlayer:
return "WebPlayer";
case BuildTarget.StandaloneWindows:
case BuildTarget.StandaloneWindows64:
return "Windows";
case BuildTarget.StandaloneOSXIntel:
case BuildTarget.StandaloneOSXIntel64:
case BuildTarget.StandaloneOSXUniversal:
return "OSX";
default:
return null;
}
} }
操作如下,以项目为例
在 StreamingAssets文件夹下生成AB文件
打比完毕,每个资源自动打包出两个文件
下面是加载,封装了一下加载代码如下
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.IO; // 回调方法
public delegate void CallBack(UnityEngine.Object obj); // AS 文件只能加载一次,重复加载出错,两种方案,
// 一、加载后卸载,下次需要使用时重新加载,
// 二、加载后将AS保存起来,下载加载相同AS时直接取出来使用
public class LoadAssetBundle{
//单例
public static readonly LoadAssetBundle Instance = new LoadAssetBundle(); private string path = Application.streamingAssetsPath; //保存加载的AS
private Dictionary<string, AssetBundle> assetBundleRefDic = new Dictionary<string, AssetBundle>(); //PC本地资源需加上 "file://"
private string GetThePathWithPlathform
{
get
{
if (Application.isEditor)
{
return "file://" + path;
}
else
{
return path;
}
}
} // 加载后释放
// assetPath 加载资源路径
// assetName 资源名
// type 加载资源类型
// callBack 加载完成回调
// isUnload 加载后是否卸载
public IEnumerator Load(string assetPath, string assetName, Type type, CallBack callBack, bool isUnload)
{
string loadpath = GetThePathWithPlathform;
string url = Path.Combine(loadpath, assetPath); AssetBundle ab = GetASFromUrl (url); if (ab != null) {
GetObject (ab, assetName, type, callBack, isUnload); yield return null;
}
else
{
WWW www = WWW.LoadFromCacheOrDownload (url, ); yield return www; if (!string.IsNullOrEmpty (www.error)) {
Debug.LogError (www.error);
yield return null;
}
else
{
ab = www.assetBundle;
GetObject ( ab, assetName, type, callBack, isUnload); if (!isUnload)
{
if (!assetBundleRefDic.ContainsKey(url))
{
Debug.Log("add");
assetBundleRefDic.Add(url, ab);
}
}
}
}
} //从 AssetBundle 中将资源加载出来
private void GetObject(AssetBundle ab, string assetName, Type type, CallBack callBack, bool isUnload)
{
UnityEngine.Object obj = ab.LoadAsset (assetName, type); if (callBack != null)
{
callBack(obj); // 回调
} if (isUnload) {
// 加载资源后从内存中卸载
ab.Unload (true);
}
} //根据地址从字典中获取 AssetBundle
private AssetBundle GetASFromUrl(string url)
{
AssetBundle ab = null;
if (assetBundleRefDic.TryGetValue (url, out ab)) {
return ab;
} return null;
}
}
//调用如下 using UnityEngine;
using System.Collections; public class Test : MonoBehaviour { // Update is called once per frame
void Update () {
if (Input.GetKeyDown (KeyCode.A))
{
string loadPath = "Android/allassets/gameobject.unity3d";
string asName = "gameobject";
StartCoroutine(LoadAssetBundle.Instance.Load(loadPath, asName, typeof(GameObject), CallBack, true));
} if (Input.GetKeyDown (KeyCode.D))
{
string loadPath = "Android/allassets/gameobject.unity3d";
string asName = "gameobject";
StartCoroutine(LoadAssetBundle.Instance.Load(loadPath, asName, typeof(GameObject), CallBack, false));
}
} private void CallBack(UnityEngine.Object obj)
{
Debug.Log (obj.name);
GameObject.Instantiate ((GameObject)obj);
}
}
Unity5 AssetBundle 打包以及加载的更多相关文章
- [Unity] unity5.3 assetbundle打包及加载
Unity5.3更新了assetbundle的打包和加载api,下面简单介绍使用方法及示例代码. 在Unity中选中一个prefab查看Inspector窗口,有两个位置可以进行assetbundle ...
- Unity3d 5.x AssetBundle打包与加载
1.AssetBundle打包 unity 5.x版本AssetBundle打包,只需要设置好AssetBundle的名称后,unity会自动将其打包,无需处理其他,唯独需要做的是设置好个AssetB ...
- Unity5 AssetBundle系列——资源加载卸载以及AssetBundleManifest的使用
下面代码列出了对于assetbundle资源的常用操作,其中有针对bundle.asset.gameobject三种类型对象的操作,实际使用中尽量保证成对使用. 这一块的操作比较繁琐,但只要使用正确, ...
- Unity5 AssetBundle打包加载及服务器加载
Assetbundle为资源包不是资源 打包1:通过脚本指定打包 AssetBundleBuild ab = new AssetBundleBuild ...
- AssetBundle资源打包与加载
AssetBundle资源打包 1.AssetLabels资源标签 文件名:资源打包成AssetBundle后的文件名,类似于压缩包的名字 后缀:自定义 文件名和后缀名都是小写格式(大写会自动转为小 ...
- unity中ScriptableObject在assetbundle中的加载
转载请标明出处:http://www.cnblogs.com/zblade/ 以前都是写一些个人的调研博客,从今天开始,也写一些个人在开发中遇到的一些可以分享的趟坑博客,为后续的开发人员提供一些绵薄之 ...
- Assetbundle管理与加载
最近在做项目优化的时候发现公司的项目用的还是老式的WWW去加载assetbundle资源的形式,而且是通过在两个Update里面分开加载AB和Asset的,这样虽然避免了协程的的使用,但是把一件事分开 ...
- Assetbundle创建与加载
[Assetbundle创建与加载] Unity有两种动态加载机制:一种是Resource.Load.一种是AssetBundle.Assetbundle是Unity Pro提供的功能,它可以把多个游 ...
- Unity3D AssetBundle的打包与加载
在Unity项目开发过程中,当要做热更新时常常使用一个叫做AssetBundle的东西,这里做一点个人的学习记录 步骤1: 设置打包标签:具体步骤----进入Unity,选择某一资源然后看右下角,在那 ...
随机推荐
- ASP.Net上传大文件解决方案之IIS7.0下的配置
开源的Brettle.Web.NeatUpload.在公司IIS6.0使用正常,但是在Windows 2008 server IIS7上使用不正常.在网上看到一个解决办法但是没有效果 IIS 7 默认 ...
- 代码管理 – SVN
代码管理工具也用了不少年了,整理下. 管理工具比较 用过VSS,CVS,TFS,SVN还有一个微软内部使用的不记得什么名字了.这里进行一些简单比较,重点介绍SVN的用法. CVS历史悠久,1986年就 ...
- [AIR] 新建窗口的方法
有时根据需要,我们需要在AIR程序中开多个窗口window 以下新建一个窗口: var opion:NativeWindowInitOptions = new NativeWindowInitOpti ...
- Map接口
Map实现的包括HashMap 和TreeMap .建议使用HashMap ,效率更高.并且允许使用null值,单是必须保证键的唯一性,TreeMap不允许有空.在添加删除和定位映射关系的时候不如Ha ...
- 深入理解Oracle的并行操作-转载
转载:http://czmmiao.iteye.com/blog/1487568 并行(Parallel)和OLAP系统 并行的实现机制是:首先,Oracle会创建一个进程用于协调并行服务进程之间的信 ...
- Unix 用gdb分析core dump文件
产生core文件条件 用ulimit -c 指定core文件大小来开启core文件的生成,如:ulimit -c unlimited 用gdb分析core文件的条件 可执行程序在编译时,需加入-g参数 ...
- XShell 无法匹配的outgoing encryption算法 ,No matching outgoing encryption algorithm found
在链接的属性(SSH -> 安全性) 的加密算法列表中选择 aes256-ctr, mac加密列表中选择hmac-sha2-256,保存即可 To enable hmac-sha2-256 an ...
- Use Spring transaction to simplify Hibernate session management
Spring对Hibernate有很好的支持 DataSource ->SessionFactory-> HibernateTranscationManagerHibernate中通 ...
- GCD、dispatch函数介绍
iOS多线程的方法有3种: NSThread NSOperation GCD(Grand Central Dispatch) 其中,由苹果所倡导的为多核的并行运算提出的解决方案:GCD能够访问线程池, ...
- 线程Thread
一.线程: 程序:保存在物理介质(光盘,软盘,硬盘)当中的代码片段 进程:一旦程序运行起来,就变成了操作系统当中的一个进程 线程:程序当中一条独立执行的线索 二.线程的五大状态 新生 就绪 运行 ...