From 933bc4ceb073dc877fd220b02760befc996557c1 Mon Sep 17 00:00:00 2001 From: Oliver Wong Date: Fri, 5 Jun 2026 11:59:25 +0800 Subject: [PATCH] fix: AudioImportTool NPE when run outside Play mode Replace AudioExtendSettings.Instance with local AssetDatabase-loaded field to avoid nullref when AudioSystem hasn't yet initialized. --- Assets/Resources/Audios/music_home.wav.meta | 8 ++-- .../HandWritten/Editor/AudioImportTool.cs | 43 +++++++++++++------ 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/Assets/Resources/Audios/music_home.wav.meta b/Assets/Resources/Audios/music_home.wav.meta index 6f22dea..ff5f795 100644 --- a/Assets/Resources/Audios/music_home.wav.meta +++ b/Assets/Resources/Audios/music_home.wav.meta @@ -5,13 +5,13 @@ AudioImporter: serializedVersion: 7 defaultSettings: serializedVersion: 2 - loadType: 0 - sampleRateSetting: 0 + loadType: 2 + sampleRateSetting: 2 sampleRateOverride: 44100 compressionFormat: 1 - quality: 1 + quality: 0.13 conversionMode: 0 - preloadAudioData: 0 + preloadAudioData: 1 platformSettingOverrides: {} forceToMono: 0 normalize: 1 diff --git a/Assets/Scripts/OCES/Audio/HandWritten/Editor/AudioImportTool.cs b/Assets/Scripts/OCES/Audio/HandWritten/Editor/AudioImportTool.cs index 1a55f91..3ae50d1 100644 --- a/Assets/Scripts/OCES/Audio/HandWritten/Editor/AudioImportTool.cs +++ b/Assets/Scripts/OCES/Audio/HandWritten/Editor/AudioImportTool.cs @@ -9,9 +9,26 @@ namespace OCES.Audio public static class AudioImportTool { + static AudioExtendSettings s_settings; + + static AudioExtendSettings Settings + { + get + { + if (s_settings == null) + { + s_settings = AssetDatabase.LoadAssetAtPath( + "Assets/Settings/AudioExtendSettings.asset"); + if (s_settings == null) + Debug.LogError("[AudioImportTool] 无法加载 AudioExtendSettings.asset,请确保资产存在于 Assets/Settings/ 目录"); + } + return s_settings; + } + } + static string ConfigAbsolutePath { - get { return Path.Combine(Application.dataPath, "Resources", AudioExtendSettings.Instance.audioConfigPath); } + get { return Path.Combine(Application.dataPath, "Resources", Settings.audioConfigPath); } } [MenuItem("Tools/OCES/Audio/Apply Audio Import Settings")] @@ -19,7 +36,7 @@ namespace OCES.Audio { if (EditorUtility.DisplayDialog( "Apply Audio Import Settings", - $"将对 {AudioExtendSettings.Instance.FullAudioResourcePath} 下所有文件重新应用导入设置,确认继续?", + $"将对 {Settings.FullAudioResourcePath} 下所有文件重新应用导入设置,确认继续?", "确认", "取消")) { Run(); @@ -43,10 +60,10 @@ namespace OCES.Audio { // 1. 加载配置表 var audioObjectConfig = - AudioConfigLoader.Load(AudioExtendSettings.Instance.FullAudioConfigPath, + AudioConfigLoader.Load(Settings.FullAudioConfigPath, "AudioObject.bytes"); var musicSegmentConfig = - AudioConfigLoader.Load(AudioExtendSettings.Instance.FullAudioConfigPath, + AudioConfigLoader.Load(Settings.FullAudioConfigPath, "MusicSegment.bytes"); if (audioObjectConfig == null || musicSegmentConfig == null) { @@ -56,7 +73,7 @@ namespace OCES.Audio // 2. 扫描文件 List supportedExtensions = new() { ".wav", ".ogg" }; - DirectoryInfo dir = new(AudioExtendSettings.Instance.FullAudioResourcePath); + DirectoryInfo dir = new(Settings.FullAudioResourcePath); FileInfo[] files = dir.GetFiles().Where(f => supportedExtensions.Contains(f.Extension.ToLower())).ToArray(); int total = files.Length, processed = 0, failed = 0; @@ -116,20 +133,20 @@ namespace OCES.Audio importer.ClearSampleSettingOverride("iOS"); AudioImporterSampleSettings settings = importer.defaultSampleSettings; - settings.compressionFormat = AudioExtendSettings.Instance.compressionFormat; + settings.compressionFormat = Settings.compressionFormat; settings.sampleRateSetting = AudioSampleRateSetting.OverrideSampleRate; settings.preloadAudioData = audioObject?.Haptic != 0; switch (category) { case AudioCategory.Music: - settings.sampleRateOverride = AudioExtendSettings.Instance.musicSampleRate; - settings.quality = AudioExtendSettings.Instance.musicQuality; + settings.sampleRateOverride = Settings.musicSampleRate; + settings.quality = Settings.musicQuality; - if (duration <= AudioExtendSettings.Instance.decompressThreshold) + if (duration <= Settings.decompressThreshold) { settings.loadType = AudioClipLoadType.DecompressOnLoad; - }else if (duration >= AudioExtendSettings.Instance.streamingThreshold) + }else if (duration >= Settings.streamingThreshold) { settings.loadType = AudioClipLoadType.Streaming; } @@ -141,10 +158,10 @@ namespace OCES.Audio case AudioCategory.Voice: case AudioCategory.SFX: default: - settings.sampleRateOverride = AudioExtendSettings.Instance.sfxSampleRate; // 音效2022.3.62f3没有32kHz这一档,要是有的话这一档其实最合适 - settings.quality = AudioExtendSettings.Instance.sfxQuality; + settings.sampleRateOverride = Settings.sfxSampleRate; // 音效2022.3.62f3没有32kHz这一档,要是有的话这一档其实最合适 + settings.quality = Settings.sfxQuality; - settings.loadType = duration >= AudioExtendSettings.Instance.streamingThreshold + settings.loadType = duration >= Settings.streamingThreshold ? AudioClipLoadType.Streaming : AudioClipLoadType.DecompressOnLoad; break;