Unity中的StreamingAssets— AB包打包方法及AB包加载
public class BuildUtils
{
/// <summary>
/// 打包游戏资源AssetBundle
/// </summary>
public static void BuildGameResBundle(string targetPath)
{
Hashtable tb = new Hashtable();
tb[""] = "GameRes/AUI";
AssetBundleBuild[] buildArray = MakeAssetBundleBuildArray(tb);
BuildBundles(buildArray, targetPath);
}
/// <summary>
/// 根据哈希表构建AssetBundleBuild列表
/// </summary>
/// <param name="tb">哈希表,key为assetBundleName,value为目录</param>
/// <returns></returns>
public static AssetBundleBuild[] MakeAssetBundleBuildArray(Hashtable tb)
{
AssetBundleBuild[] buildArray = new AssetBundleBuild[tb.Count];
int index = 0;
foreach (string key in tb.Keys)
{
buildArray[index].assetBundleName = key;
List<string> fileList = new List<string>();
fileList = GetFiles(Application.dataPath + "/" + tb[key], true);
buildArray[index].assetNames = fileList.ToArray();
++index;
}
return buildArray;
}
/// <summary>
/// 递归遍历获取目标目录中的所有文件
/// </summary>
/// <param name="sourceDir">目标目录</param>
/// <param name="splitAssetPath">是否要切割目录,以Assets目录为根</param>
public static List<string> GetFiles(string sourceDir, bool splitAssetPath)
{
List<string> fileList = new List<string>();
string[] fs = Directory.GetFiles(sourceDir);
string[] ds = Directory.GetDirectories(sourceDir);
for (int i = 0, len = fs.Length; i < len; ++i)
{
var index = splitAssetPath ? fs[i].IndexOf("Assets") : 0;
fileList.Add(fs[i].Substring(index));
}
for (int i = 0, len = ds.Length; i < len; ++i)
{
fileList.AddRange(GetFiles(ds[i], splitAssetPath));
}
return fileList;
}
/// <summary>
/// 打AssetBundle
/// </summary>
/// <param name="buildArray">AssetBundleBuild列表</param>
public static void BuildBundles(AssetBundleBuild[] buildArray, string targetPath)
{
if (!Directory.Exists(targetPath))
{
Directory.CreateDirectory(targetPath);
}
BuildPipeline.BuildAssetBundles(targetPath, buildArray, BuildAssetBundleOptions.ChunkBasedCompression, GetBuildTarget());
}
/// <summary>
/// 获取当前平台
/// </summary>
public static BuildTarget GetBuildTarget()
{
#if UNITY_STANDALONE
return BuildTarget.StandaloneWindows;
#elif UNITY_ANDROID
return BuildTarget.Android;
#else
return BuildTarget.iOS;
#endif
}
}