您的位置:首页 > 移动开发 > Unity3D

Unity3D中实现按资源名称自动化命名打包AssetBundle

2017-07-14 19:09 573 查看


1. 概述

一般当需要打包成AssetBundle的资源不多时,可以自己通过AssetLabels窗口手动命名,然后再打包,但是当需要打包的资源过多时,一个一个的去手动编辑就特别的麻烦,因此如果能按资源名称自动命名打包AssetBundle,这样子就会方便很多。

实现功能:只需点击一下“AutoBuildAll”,即可将指定目录的资源全部自动生成按文件名称命名的AssetBundle,如下所示。





 


2. 实现的主要思路

第一步,强制删除原有的AssetBundle标签,避免把不必要的资源也一起打包,这是由于打包时会把所有带有AssetBundle标签的资源都打包;

第二步,逐个获取指定目录下的文件名称(除.meta文件外),并给资源按名称打上AssetBundle标签;

第三步,生成AssetBundles到指定目录。

 


3. 具体实现代码

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

public class AssetBundleBuilder : MonoBehaviour {

//资源存放路径
static string assetsDir = Application.dataPath + "/AssetBundleBuilder/Res";
//打包后存放路径
const string assetBundlesPath = "Assets/AssetBundleBuilder/AssetBundles";

[MenuItem("AssetBundle/AutoBuildAll")]
static void AutoBuildAll()
{
//清除所有的AssetBundleName
ClearAssetBundlesName();
//设置指定路径下所有需要打包的assetbundlename
SetAssetBundlesName(assetsDir);
//打包所有需要打包的asset
BuildPipeline.BuildAssetBundles(assetBundlesPath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
}

[MenuItem("AssetBundle/BuildWithName")]
static void BuildAllAssetBundle()
{
BuildPipeline.BuildAssetBundles(assetBundlesPath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
}

/// <summary>
/// 清除所有的AssetBundleName,由于打包方法会将所有设置过AssetBundleName的资源打包,所以自动打包前需要清理
/// </summary>
static void ClearAssetBundlesName()
{
//获取所有的AssetBundle名称
string[] abNames = AssetDatabase.GetAllAssetBundleNames();

//强制删除所有AssetBundle名称
for (int i = 0; i < abNames.Length; i++)
{
AssetDatabase.RemoveAssetBundleName(abNames[i], true);
}
}

/// <summary>
/// 设置所有在指定路径下的AssetBundleName
/// </summary>
static void SetAssetBundlesName(string _assetsPath)
{
//先获取指定路径下的所有Asset,包括子文件夹下的资源
DirectoryInfo dir = new DirectoryInfo(_assetsPath);
FileSystemInfo[] files = dir.GetFileSystemInfos(); //GetFileSystemInfos方法可以获取到指定目录下的所有文件以及子文件夹

for (int i = 0; i < files.Length; i++)
{
if (files[i] is DirectoryInfo)  //如果是文件夹则递归处理
{
SetAssetBundlesName(files[i].FullName);
}
else if(!files[i].Name.EndsWith(".meta")) //如果是文件的话,则设置AssetBundleName,并排除掉.meta文件
{
SetABName(files[i].FullName);     //逐个设置AssetBundleName
}
}

}

/// <summary>
/// 设置单个AssetBundle的Name
/// </summary>
/// <param name="filePath"></param>
static void SetABName(string assetPath)
{
string importerPath ="Assets"+assetPath.Substring(Application.dataPath.Length);  //这个路径必须是以Assets开始的路径
AssetImporter assetImporter = AssetImporter.GetAtPath(importerPath);  //得到Asset

string tempName=assetPath.Substring(assetPath.LastIndexOf(@"\")+1);
string assetName = tempName.Remove(tempName.LastIndexOf(".")); //获取asset的文件名称
assetImporter.assetBundleName = assetName;    //最终设置assetBundleName
}
}

参考资料:
http://blog.csdn.net/onafioo/article/details/50969945
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息