feat: AudioSettings 独立出配置文件,而不是零散在代码各处。

This commit is contained in:
2026-05-14 20:22:00 +08:00
parent 410e6b0a4f
commit 5e0a4aef64
13 changed files with 251 additions and 60 deletions
@@ -0,0 +1,60 @@
using UnityEngine;
using UnityEditor;
namespace OCES.Audio.Editor
{
static class AudioExtendSettingsProvider
{
const string k_assetPath = "Assets/Settings/AudioExtendSettings.asset";
[SettingsProvider]
static SettingsProvider Create()
{
return new SettingsProvider("Project/Audio Extend", SettingsScope.Project)
{
label = "Audio Extend",
guiHandler = searchContext =>
{
var settings = AssetDatabase.LoadAssetAtPath<AudioExtendSettings>(k_assetPath);
if (settings == null)
{
EditorGUILayout.HelpBox(
$"未找到 AudioExtendSettings.asset\n期望路径: {k_assetPath}",
MessageType.Warning);
if (GUILayout.Button("创建默认配置"))
CreateDefaultAsset();
return;
}
SerializedObject so = new SerializedObject(settings);
SerializedProperty prop = so.GetIterator();
prop.NextVisible(true); // 跳过 Script 字段
EditorGUI.BeginChangeCheck();
while (prop.NextVisible(false))
EditorGUILayout.PropertyField(prop, true);
if (EditorGUI.EndChangeCheck())
{
so.ApplyModifiedProperties();
EditorUtility.SetDirty(settings);
AssetDatabase.SaveAssets();
}
},
keywords = new[] { "Audio", "SFX", "Music", "Mixer", "Path", "Import" }
};
}
[MenuItem("Tools/Audio/Create AudioExtendSettings Asset")]
static void CreateDefaultAsset()
{
if (!AssetDatabase.IsValidFolder("Assets/Settings"))
AssetDatabase.CreateFolder("Assets", "Settings");
var asset = ScriptableObject.CreateInstance<AudioExtendSettings>();
AssetDatabase.CreateAsset(asset, k_assetPath);
AssetDatabase.SaveAssets();
Debug.Log($"[AudioExtend] 已创建默认配置:{k_assetPath}");
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 862f5cacec834b47a75da0d8ba2710f1
timeCreated: 1778757352
@@ -9,16 +9,9 @@ namespace OCES.Audio
public static class AudioImportTool
{
const string k_audioResourcePath = "Audios";
const string k_audioConfigPath = "AudioData";
static string AudioAbsolutePath
{
get { return Path.Combine(Application.dataPath, "Resources", k_audioResourcePath); }
}
static string ConfigAbsolutePath
{
get { return Path.Combine(Application.dataPath, "Resources", k_audioConfigPath); }
get { return Path.Combine(Application.dataPath, "Resources", AudioExtendSettings.Instance.audioConfigPath); }
}
[MenuItem("Tools/Audio/Apply Audio Import Settings")]
@@ -26,7 +19,7 @@ namespace OCES.Audio
{
if (EditorUtility.DisplayDialog(
"Apply Audio Import Settings",
$"将对 {AudioAbsolutePath} 下所有文件重新应用导入设置,确认继续?",
$"将对 {AudioExtendSettings.Instance.FullAudioResourcePath} 下所有文件重新应用导入设置,确认继续?",
"确认", "取消"))
{
Run();
@@ -49,8 +42,12 @@ namespace OCES.Audio
public static void Run()
{
// 1. 加载配置表
var audioObjectConfig = AudioConfigLoader.Load<AudioObjectConfig>(ConfigAbsolutePath, "AudioObject.bytes");
var musicSegmentConfig = AudioConfigLoader.Load<MusicSegmentConfig>(ConfigAbsolutePath, "MusicSegment.bytes");
var audioObjectConfig =
AudioConfigLoader.Load<AudioObjectConfig>(AudioExtendSettings.Instance.FullAudioConfigPath,
"AudioObject.bytes");
var musicSegmentConfig =
AudioConfigLoader.Load<MusicSegmentConfig>(AudioExtendSettings.Instance.FullAudioConfigPath,
"MusicSegment.bytes");
if (audioObjectConfig == null || musicSegmentConfig == null)
{
Debug.LogError("[AudioImportTool] 配置表加载失败,终止");
@@ -59,7 +56,7 @@ namespace OCES.Audio
// 2. 扫描文件
List<string> supportedExtensions = new() { ".wav", ".ogg" };
DirectoryInfo dir = new(AudioAbsolutePath);
DirectoryInfo dir = new(AudioExtendSettings.Instance.FullAudioResourcePath);
FileInfo[] files = dir.GetFiles().Where(f => supportedExtensions.Contains(f.Extension.ToLower())).ToArray();
int total = files.Length, processed = 0, failed = 0;
@@ -119,32 +116,37 @@ namespace OCES.Audio
importer.ClearSampleSettingOverride("iOS");
AudioImporterSampleSettings settings = importer.defaultSampleSettings;
settings.compressionFormat = AudioCompressionFormat.Vorbis;
settings.compressionFormat = AudioExtendSettings.Instance.compressionFormat;
settings.sampleRateSetting = AudioSampleRateSetting.OverrideSampleRate;
settings.preloadAudioData = audioObject?.Haptic != 0;
switch (category)
{
case AudioCategory.Music:
settings.sampleRateOverride = 44100;
settings.quality = 0.13f;
settings.loadType = duration switch
settings.sampleRateOverride = AudioExtendSettings.Instance.musicSampleRate;
settings.quality = AudioExtendSettings.Instance.musicQuality;
if (duration <= AudioExtendSettings.Instance.decompressThreshold)
{
<= 5 => AudioClipLoadType.DecompressOnLoad,
>= 15 => AudioClipLoadType.Streaming,
_ => AudioClipLoadType.CompressedInMemory,
};
settings.loadType = AudioClipLoadType.DecompressOnLoad;
}else if (duration >= AudioExtendSettings.Instance.streamingThreshold)
{
settings.loadType = AudioClipLoadType.Streaming;
}
else
{
settings.loadType = AudioClipLoadType.CompressedInMemory;
}
break;
case AudioCategory.Voice:
case AudioCategory.SFX:
default:
settings.sampleRateOverride = 22050; // 音效2022.3.62f3没有32kHz这一档,要是有的话这一档其实最合适
settings.quality = 0.5f;
settings.loadType = duration switch
{
>= 15 => AudioClipLoadType.Streaming,
_ => AudioClipLoadType.DecompressOnLoad,
};
settings.sampleRateOverride = AudioExtendSettings.Instance.sfxSampleRate; // 音效2022.3.62f3没有32kHz这一档,要是有的话这一档其实最合适
settings.quality = AudioExtendSettings.Instance.sfxQuality;
settings.loadType = duration >= AudioExtendSettings.Instance.streamingThreshold
? AudioClipLoadType.Streaming
: AudioClipLoadType.DecompressOnLoad;
break;
}