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 打包以及加载的更多相关文章

  1. [Unity] unity5.3 assetbundle打包及加载

    Unity5.3更新了assetbundle的打包和加载api,下面简单介绍使用方法及示例代码. 在Unity中选中一个prefab查看Inspector窗口,有两个位置可以进行assetbundle ...

  2. Unity3d 5.x AssetBundle打包与加载

    1.AssetBundle打包 unity 5.x版本AssetBundle打包,只需要设置好AssetBundle的名称后,unity会自动将其打包,无需处理其他,唯独需要做的是设置好个AssetB ...

  3. Unity5 AssetBundle系列——资源加载卸载以及AssetBundleManifest的使用

    下面代码列出了对于assetbundle资源的常用操作,其中有针对bundle.asset.gameobject三种类型对象的操作,实际使用中尽量保证成对使用. 这一块的操作比较繁琐,但只要使用正确, ...

  4. Unity5 AssetBundle打包加载及服务器加载

    Assetbundle为资源包不是资源 打包1:通过脚本指定打包 AssetBundleBuild ab = new AssetBundleBuild                         ...

  5. AssetBundle资源打包与加载

    AssetBundle资源打包  1.AssetLabels资源标签 文件名:资源打包成AssetBundle后的文件名,类似于压缩包的名字 后缀:自定义 文件名和后缀名都是小写格式(大写会自动转为小 ...

  6. unity中ScriptableObject在assetbundle中的加载

    转载请标明出处:http://www.cnblogs.com/zblade/ 以前都是写一些个人的调研博客,从今天开始,也写一些个人在开发中遇到的一些可以分享的趟坑博客,为后续的开发人员提供一些绵薄之 ...

  7. Assetbundle管理与加载

    最近在做项目优化的时候发现公司的项目用的还是老式的WWW去加载assetbundle资源的形式,而且是通过在两个Update里面分开加载AB和Asset的,这样虽然避免了协程的的使用,但是把一件事分开 ...

  8. Assetbundle创建与加载

    [Assetbundle创建与加载] Unity有两种动态加载机制:一种是Resource.Load.一种是AssetBundle.Assetbundle是Unity Pro提供的功能,它可以把多个游 ...

  9. Unity3D AssetBundle的打包与加载

    在Unity项目开发过程中,当要做热更新时常常使用一个叫做AssetBundle的东西,这里做一点个人的学习记录 步骤1: 设置打包标签:具体步骤----进入Unity,选择某一资源然后看右下角,在那 ...

随机推荐

  1. zookeeper在集群负载均衡中的应用

    zookeeper本身是不提供负载均衡的策略,需要自己来实现,所以这里确切的说,是在负载均衡中应用到了zookeeper做集群的协调. 对于HTTP请求的负载均衡,成熟的解决方案是Nginx(或Hap ...

  2. 浅谈人脸检测之Haar分类器方法

    我们要探讨的Haar分类器实际上是Boosting算法(提升算法)的一个应用,Haar分类器用到了Boosting算法中的AdaBoost算法,只是把AdaBoost算法训练出的强分类器进行了级联,并 ...

  3. JS中两个感叹号!!的意义

    var foo = true; console.log(!foo); // false console.log(!!foo); // true 两个 !! 就是 非非 如果值为boolean值 两个感 ...

  4. Sql Server Job 简单使用

    http://www.cnblogs.com/zerocc/p/3400529.html(转载) use msdb EXEC sp_add_job @job_name =   'tk_bakdata' ...

  5. CentOS 6.5下静默安装oracle

    本例: 通过SSH远程连接云主机,上传oracle11g安装包,在centos6.5上无图形化界面静默安装oracle11g. 涉及工具及环境: 1.本地环境windows7+ssh远程连接工具xSh ...

  6. (Tree)94.Binary Tree Inorder Traversal

    /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tre ...

  7. [JavaScript]顺序的异步执行

    我们知道,在适用js的时候,程序是单线程执行的,而且如果遇到阻塞就会将浏览器卡死. 能否异步的执行,让程序不再卡呢? 可以,用setTimeout. 但是,问题又来了,如果我有这样的要求: 执行一个函 ...

  8. Delphi DateUtils时间单元

    Uses DateUtils //时间单元,非常有用. 记得引用这个单元,不然不能用. CompareDate 比较两个日期时间值日期部分的大小 CompareDateTime 比较两个日期时间值的大 ...

  9. Ajax发送异步请求(四步操作)

    1.第一步(得到XMLHttpRequest) *ajax其实只需要学习一个对象:XMLHttpRequest,如果掌握了它,就掌握了ajax!! *得到XMLHttpRequest >大多数浏 ...

  10. UDP发送和接收

    发送函数 public bool udpSend(string ip, int port, byte[] data) { Socket socket = new Socket(AddressFamil ...