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,选择某一资源然后看右下角,在那 ...
随机推荐
- jquery weibo 留言
<script> function getCnTime(s){ ); ))+'-'+toDou(oDate.getDate())+' '+toDou(oDate.getHours())+' ...
- python 树遍历
使用python实现的树遍历,包括宽度优先和深度优先 ef dfs(): tree = { 'A': ['B', 'C'], 'B': ['D', 'E'], 'C': ['F', 'G'], 'D' ...
- Python基础语法,基本数据类型及相关操作
---恢复内容开始--- python文件 文件开头要有 #!/usr/bin/ python --在linux中是告诉系统phthon的路径是在/usr/bin/ python目录下 ...
- 04-c#入门(类型转换)
“无论是什么类型,所有的数据都是一系列的位,即一系列0和1.变量的含义是通过解释这些数据的方式来传达的.”——这句原话是书上翻译的,不过后一句话总感觉理解起来不是很通俗,自己觉得这样理解可能会合适些: ...
- Netbeans导入Nutch1.2
Windows 环境下,Netbeans下导入Nutch1.2. 测试环境: Nutch 1.2 Netbean7.4 Java 1.8.0_20 cygwin 安装步骤: 1.安装: ...
- mac 10.9 安装 gevent
安装步骤: Gevent依赖libevent和greenlet,需要分别安装. 1,安装 macport (如已安装,可以跳过) 2,通过终端 键入: sudo port install libeve ...
- SQLServer 列出每个表的列和属性
USE DBProjectSY GO SELECT OBJECT_SCHEMA_NAME(T.[object_id], DB_ID()) AS [架构名] , T.[name] AS [表名] , A ...
- OpenGL学习笔记3——缓冲区对象
在GL中特别提出了缓冲区对象这一概念,是针对提高绘图效率的一个手段.由于GL的架构是基于客户——服务器模型建立的,因此默认所有的绘图数据均是存储在本地客户端,通过GL内核渲染处理以后再将数据发往GPU ...
- vtk保存图像
vtkWindowToImageFilter * wif = vtkWindowToImageFilter::New(); vtkBMPWriter *bmpw = vtkBMPWriter::New ...
- cocos2d-x:懒人数学函数
做游戏开发,要用到比较多的数学计算,对于程序员来说,还是用一种懒一点的方法,cocos2d-x方便开发者投机取巧...提供了很多方便的的数学函数,方便我们的数学计算.以下是在网上收集到的一些常用的数学 ...