Files
AudioSystem/Assets/Scripts/OCES/AssetsManagement/Editor/AssetBundleBuilder.cs
T
2026-05-15 16:45:58 +08:00

108 lines
4.0 KiB
C#

using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEditor;
namespace OCES.Editor
{
public static class AssetBundleBuilder
{
static string BuildBundle(string bundleName, string outputDir, BuildTarget buildTarget, params string[] sourceDirs)
{
// 1. 收集所有文件(递归)
List<string> assetNames = new();
List<string> addressableNames = new();
foreach (string dir in sourceDirs)
{
if (!Directory.Exists(dir))
{
Debug.LogWarning($"[AssetBundleBuilder] 目录不存在,跳过: {dir}");
continue;
}
string[] files = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories);
foreach (string file in files)
{
if (file.EndsWith(".meta")) continue;
if (file.EndsWith(".DS_Store")) continue;
if (file.StartsWith("._")) continue;
if (file.EndsWith(".pkf")) continue;
string assetPath = file.Replace("\\", "/");
assetNames.Add(assetPath);
string relative = assetPath.Replace("Assets/Resources/", "");
string withoutExt = Path.ChangeExtension(relative, null);
addressableNames.Add(withoutExt);
}
}
if (assetNames.Count == 0)
{
return $"[AssetBundleBuilder] {bundleName}: 无文件";
}
Directory.CreateDirectory(outputDir);
// 2. 构建
AssetBundleBuild build = new()
{
assetBundleName = bundleName + ".ab",
assetNames = assetNames.ToArray(),
addressableNames = addressableNames.ToArray()
};
AssetBundleManifest manifest = BuildPipeline.BuildAssetBundles(
outputDir,
new[] { build },
BuildAssetBundleOptions.None,
buildTarget);
return !manifest ? $"[{bundleName}.ab] 构建失败"
: $"[AssetBundleBuilder] {bundleName}.ab 构建完成,包含 {assetNames.Count} 个资源";
}
internal static string BuildBundles(
bool buildAudio, string audioBundlePath,
bool buildHaptic, string hapticBundlePath,
BuildTarget buildTarget)
{
string log = "";
if (buildAudio)
log += BuildBundleFromPath(audioBundlePath, buildTarget,
"Assets/Resources/Audios",
"Assets/Resources/AudioData") + "\n";
if (buildHaptic)
log += BuildBundleFromPath(hapticBundlePath, buildTarget,
"Assets/Resources/Haptics",
"Assets/Resources/HapticData") + "\n";
AssetDatabase.Refresh();
return log.TrimEnd('\n');
}
/// <summary>
/// 根据配置中的相对路径构建单个 Bundle。
/// </summary>
/// <param name="relativePath">配置中的路径,如 "Bundles/audios.ab"</param>
/// <param name="target"></param>
/// <param name="sourceDirs"></param>
public static string BuildBundleFromPath(
string relativePath, BuildTarget target, params string[] sourceDirs)
{
// 解析路径 → 输出目录 + Bundle 名
string fullPath = Path.Combine(Application.streamingAssetsPath, relativePath);
string outputDir = Path.GetDirectoryName(fullPath);
string bundleName = Path.GetFileNameWithoutExtension(fullPath);
return string.IsNullOrEmpty(bundleName)
? $"[AssetBundleBuilder] 无效路径: {relativePath}"
: BuildBundle(bundleName, outputDir, target, sourceDirs);
}
}
}