您的位置:首页 > 其它

AssetBundle打包资源

2014-12-16 14:16 323 查看
首先说一下,我做Unity开发有一年多了,然后之前做AR增强现实的时候也遇到过这类的问题,然后在网上看了一下其他大神写的东西,然后我写这篇文章也是为了以后可以看一下,积累一下学习的东西,为了方便以后的学习。

AssetBundle打包资源写了两种方法都可以。

创建两个空的预设Prefab,命名为Prefab1,Prefab2,然后创建两个Cube,分别把Cube赋给Prefab。项目所需的文件夹如图所示:



在写具体的内容之前,先创建一个CreateAssetBundle C#脚本,并且把该脚本放在Editor文件夹下,打开脚本首先添加引用using UnityEditor.

方法一:


第一种打包方法就完成了,然后我们可以在Unity项目中的Assets中看到多出了Build AssetBundle From Selection和Save Scene选项。选中我们要打包的资源然后选择相应的选项就可以了,打包后的资源我是保存在AssetBundle这个文件夹下。前面说了写这个东东就是为了自己以后能看看自己遇到的问题,然后以及方便查找使用。所以代码也搞上来:

//方法一:

//在Unity编辑器中添加菜单

[MenuItem("Assets/Build AssetBundle From Selection")]

//打包模型资源

static void ExportResource()

{

//打开保存面板,获得用户选择的路径

string path = EditorUtility.SaveFilePanel("Save Resource", "", "New Resource", "assetbundle");

if (path.Length != 0)

{

//选择要保存的对象

Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);

//打包

BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets, BuildTarget.StandaloneWindows);

}

}

//在Unity编辑器中添加菜单

[MenuItem("Assets/Save Scene")]

//打包场景资源

static void ExportScene()

{

//打开保存面板,获得用户选择的路径

string path = EditorUtility.SaveFilePanel("Save Resource", "", "test", "unity3d");

if (path.Length != 0)

{

//选择要保存的对象

Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);

//定义要打包场景的资源路径

string[] scenes = { "Assets/Scene/demo.unity" };

//打包

BuildPipeline.BuildStreamedSceneAssetBundle(scenes, path, BuildTarget.WebPlayer);

}

}

方法二:





代码部分:

//方法二:

//在Unity编辑器中添加菜单

[MenuItem("Custom Editor/Create AssetBundles Main")]

//单个资源的打包

static void CreateAssetBundlesMain()

{

//获取选择要打包资源的所有游戏对象

Object[] SelectAsset = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);

//遍历所有的游戏对象

foreach (Object obj in SelectAsset)

{

string sourcePath = AssetDatabase.GetAssetPath(obj);

//本地测试:建议最后将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();

}

//在Unity编辑器中添加菜单

[MenuItem("Custom Editor/Create AssetBunldes ALL")]

//所有对象一起打包成一个AssetBundle

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();

}

}

//在Unity编辑器中添加菜单

[MenuItem("Custom Editor/Create Scene")]

//打包场景资源

static void CrateSceneALL()

{

//清空一下缓存

Caching.CleanCache();

string Path = Application.dataPath + "/StreamingAssets/MySence.assetbundle";

string[] levels = { "Assets/Scene/demo.unity" };

BuildPipeline.BuildPlayer(levels, Path, BuildTarget.WebPlayer, BuildOptions.BuildAdditionalStreamedScenes);

AssetDatabase.Refresh();

}



方法二写完了,然后在Unity中可以看见多出来一个Custom Editor,我们所用到的选项都在这个里面。这种方法打包后的资源存放在StreamingAssets这个文件夹下



好了,写这个是自己以后用着方便然后没事的时候自己还可以回过头来看看,希望你们用着也 方便一点,直接拿过来复制粘贴就可以用。慢慢学习慢慢积累吧!要走的路还很长。加油!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: