feat: AudioSettings 独立出配置文件,而不是零散在代码各处。
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user