Unity5.3更新了assetbundle的打包和加载api,下面简单介绍使用方法及示例代码。

  在Unity中选中一个prefab查看Inspector窗口,有两个位置可以进行assetbundle的标记。

  第一个为assetBundleName,如果这里不是None,则这个资源会记录到AssetDatabase里,使用BuildAssetBundles打包时,会自动将AssetBundleName一致的资源打到一个包中。

  第二个为Variant,可用于区分不同分辨率的资源。如果在abName=S的情况下,variant有None也有HD,打ab包时会报错,如果variant有指定,则同一abName的资源的variant不能为None。

     

// 此api用于打包所有标记了AssetBundleName的资源

public static AssetBundleManifest BuildAssetBundles(

  string outputPath,

  BuildAssetBundleOptions assetBundleOptions = BuildAssetBundleOptions.None,

  BuildTarget targetPlatform = BuildTarget.WebPlayer

);

// 此api用于打包指定的资源

public static AssetBundleManifestBuildAssetBundles(

  string outputPath,

  AssetBundleBuild[] builds,

  BuildAssetBundleOptionsassetBundleOptions = BuildAssetBundleOptions.None,

  BuildTargettargetPlatform = BuildTarget.WebPlayer

);

  其中,AssetBundleBuild数组参数,用于指定资源,AssetBundleBuild有三个属性,分别指定assetBundleName,variant,资源路径等。

 
 

  以下为打包及加载部分代码:大部分参考了雨凇MOMO的文章《UGUI研究院之全面理解图集与使用(三)》,做了部分修改。

 #define USE_ASSETBUNDLE

 using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEditor.VersionControl; public class UIMain : MonoBehaviour{ AssetBundle assetbundle = null;
void Start ()
{
CreatImage(loadSprite("flag_blue"));
CreatImage(loadSprite("flag_yellow"));
} private void CreatImage(GameObject gobj ){
Sprite sprite = gobj.GetComponent<SpriteRenderer>().sprite as Sprite;
GameObject go = new GameObject(sprite.name);
go.layer = LayerMask.NameToLayer("UI");
go.transform.parent = transform;
go.transform.localScale= Vector3.one;
Image image = go.AddComponent<Image>();
image.sprite = sprite;
image.SetNativeSize();
} private GameObject loadSprite(string spriteName){
#if USE_ASSETBUNDLE
if(assetbundle == null)
assetbundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath +"/flagbundle");
return assetbundle.LoadAsset(spriteName) as GameObject;
#else
return Resources.Load<GameObject>("Sprite/" + spriteName);
#endif
} }

UIMain

 using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using System.IO;
using UnityEditor.VersionControl; public class AltasMaker : MonoBehaviour { [MenuItem ("MyMenu/AtlasMaker")]
static private void MakeAtlas()
{
string spriteDir = Application.dataPath + "/Resources/Sprite";
Debug.Log("spriteDir : " + spriteDir);
if(!Directory.Exists(spriteDir)){
Directory.CreateDirectory(spriteDir);
} DirectoryInfo rootDirInfo = new DirectoryInfo (Application.dataPath + "/Atlas");
foreach (DirectoryInfo dirInfo in rootDirInfo.GetDirectories()) {
foreach (FileInfo pngFile in dirInfo.GetFiles("*.png", SearchOption.AllDirectories)) {
string allPath = pngFile.FullName;
Debug.Log("allPath1 : " + allPath);
string assetPath = allPath.Substring(allPath.IndexOf("Assets"));
Debug.Log("assetPath : " + assetPath);
Sprite sprite = AssetDatabase.LoadAssetAtPath<Sprite>(assetPath);
GameObject go = new GameObject(sprite.name);
go.AddComponent<SpriteRenderer>().sprite = sprite;
allPath = spriteDir+ "/" +sprite.name+ ".prefab";
Debug.Log("allPath2 : " + allPath);
string prefabPath = allPath.Substring(allPath.IndexOf("Assets"));
PrefabUtility.CreatePrefab(prefabPath, go);
GameObject.DestroyImmediate(go);
}
}
} [MenuItem ("MyMenu/Build Assetbundle")]
static private void BuildAssetBundle()
{
string outputdir = Application.dataPath + "/StreamingAssets"; if(!Directory.Exists(outputdir))
{
Directory.CreateDirectory(outputdir);
} DirectoryInfo rootDirInfo = new DirectoryInfo (Application.dataPath + "/Atlas");
foreach (DirectoryInfo dirInfo in rootDirInfo.GetDirectories()) {
List<Sprite> assets = new List<Sprite>(); foreach (FileInfo pngFile in dirInfo.GetFiles("*.png", SearchOption.AllDirectories))
{
string allPath = pngFile.FullName;
string assetPath = allPath.Substring(allPath.IndexOf("Assets"));
assets.Add(AssetDatabase.LoadAssetAtPath<Sprite>(assetPath));
} AssetBundleBuild[] buildMap = new AssetBundleBuild[]; buildMap[].assetBundleName = dirInfo.Name + "bundle"; // 想定义的任何名称
string[] spriteNames = new string[assets.Count];
for(int i = ; i < assets.Count; i++)
{
spriteNames[i] = "Assets/Atlas/" + dirInfo.Name + "/" + assets[i].name + ".png"; // 注意路径写全
}
buildMap[].assetNames = spriteNames;
buildMap[].assetBundleVariant = null; BuildPipeline.BuildAssetBundles(
outputdir, // output path
buildMap, // build bundles info
BuildAssetBundleOptions.UncompressedAssetBundle, // options
GetBuildTarget()); // build target
}
} [MenuItem ("MyMenu/Build All AssetBundles")]
static private void BuildAllAssetBundles()
{
BuildPipeline.BuildAssetBundles(
Application.dataPath + "/StreamingAssets", // output path
BuildAssetBundleOptions.ChunkBasedCompression, // options
GetBuildTarget());
} static private BuildTarget GetBuildTarget()
{
BuildTarget target = BuildTarget.WebPlayer;
#if UNITY_STANDALONE
target = BuildTarget.StandaloneOSXIntel64;
#elif UNITY_IPHONE
target = BuildTarget.iPhone;
#elif UNITY_ANDROID
target = BuildTarget.Android;
#endif
return target;
}
}

AltasMaker

  注:1 经过验证,同一个资源如果没有改变,不会被重新build

    2 如果缓存文件不刷新,强制调用Caching.CleanCache()。

  assetbundle有三种压缩格式:默认为LZMA模式(最小),还有LZ4和不压缩(最大)。

  不同压缩格式相关优缺点及使用详见下文:Unity5.x新的AssetBundle机制02——压缩

其他参考:

UGUI研究院之全面理解图集与使用(三)

【厚积薄发】揭开Unity AssetBundle庐山真面目(二)

Unity3D 5.3 新版AssetBundle使用方案及策略

AssetDatabase

[Unity] unity5.3 assetbundle打包及加载的更多相关文章

  1. Unity5 AssetBundle 打包以及加载

    using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEditor; us ...

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

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

  3. unity中ScriptableObject在assetbundle中的加载

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

  4. AssetBundle资源打包与加载

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

  5. Assetbundle管理与加载

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

  6. Unity开发实战探讨-资源的加载释放最佳策略简要心得

    Unity开发实战探讨-资源的加载释放最佳策略简要心得 看过我另外一篇关于Unity资源释放随笔<Unity开发实战探讨-资源的加载释放最佳策略>如果觉得略微复杂,那么下面是一些比较简要的 ...

  7. Unity开发实战探讨-资源的加载释放最佳策略

    注:本文中用到的大部分术语和函数都是Unity中比较基本的概念,所以本文只是直接引用,不再详细解释各种概念的具体内容,若要深入了解,请查阅相关资料. Unity的资源陷阱 游戏资源的加载和释放导致的内 ...

  8. Assetbundle创建与加载

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

  9. Unity3D AssetBundle的打包与加载

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

随机推荐

  1. React Diff算法

    Web界面由DOM树来构成,当其中某一部分发生变化时,其实就是对应的某个DOM节点发生了变化.在React中,构建UI界面的思路是由当前状态决定界面.前后两个状态就对应两套界面,然后由React来比较 ...

  2. 解决Windows下网络原因Composer安装失败问题

    由于Composer镜像都在国外,所以直接在官网下载Windows Installer后安装很多情况下是无法成功安装的. 解决办法: 1,将php添加到系统环境变量,并开启openssl扩展. 2,点 ...

  3. P25、面试题1:赋值运算符函数

    题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString { public: CMyString(char* pData = NULL); CMyStr ...

  4. HDU 1006 [Tick Tick]时钟问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1006 题目大意:钟表有时.分.秒3根指针.当任意两根指针间夹角大于等于n°时,就说他们是happy的, ...

  5. 张高兴的 Windows 10 IoT 开发笔记:使用 MAX7219 驱动 8&#215;8 点阵

    GitHub:https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/MAX7219

  6. ssh更改默认端口号及实现免密码远程登陆

    近来在复习防火墙管理工具 iptables 的基本使用方法,涉及到对端口添加或删除防火墙策略的内容,之前对ssh更改默认端口号及免密码登录的方法不熟悉,这次做一个基本的总结防止自己遗忘. 错误偏差及其 ...

  7. DAL分页

    using System;using System.Collections.Generic;using LModel.DTO;using Newtonsoft.Json;using System.Da ...

  8. SVN上线步骤笔记

    项目代码位置: /data/svn/play_out 项目代码目录名称: test SVN创建位置:/data/svn/repos_Websvn线上地址:svn://192.168.1.1/repos ...

  9. 如何在VMware中安装Linux系统

    这篇文章主要讲述如何在VMware12中安装RHEL6.9Linux操作系统 步骤一: 打开VMware软件,在主页中点击创建新的虚拟机或者点击左上角文件,在列表中点击新建虚拟机,如图: 步骤二: 点 ...

  10. 图片Alpha预乘的作用[转]

    Premultiplied Alpha 这个概念做游戏开发的人都不会不知道.Xcode 的工程选项里有一项 Compress PNG Files,会对 PNG 进行 Premultiplied Alp ...