Unity中的StreamingAssets— AB包打包方法及AB包加载

时间:2025-03-08 20:45:21
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 } }