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.
This commit is contained in:
2026-06-05 11:59:25 +08:00
parent 7f6d0d5317
commit 6004985e06
2 changed files with 34 additions and 17 deletions
+4 -4
View File
@@ -5,13 +5,13 @@ AudioImporter:
serializedVersion: 7 serializedVersion: 7
defaultSettings: defaultSettings:
serializedVersion: 2 serializedVersion: 2
loadType: 0 loadType: 2
sampleRateSetting: 0 sampleRateSetting: 2
sampleRateOverride: 44100 sampleRateOverride: 44100
compressionFormat: 1 compressionFormat: 1
quality: 1 quality: 0.13
conversionMode: 0 conversionMode: 0
preloadAudioData: 0 preloadAudioData: 1
platformSettingOverrides: {} platformSettingOverrides: {}
forceToMono: 0 forceToMono: 0
normalize: 1 normalize: 1
@@ -9,9 +9,26 @@ namespace OCES.Audio
public static class AudioImportTool public static class AudioImportTool
{ {
static AudioExtendSettings s_settings;
static AudioExtendSettings Settings
{
get
{
if (s_settings == null)
{
s_settings = AssetDatabase.LoadAssetAtPath<AudioExtendSettings>(
"Assets/Settings/AudioExtendSettings.asset");
if (s_settings == null)
Debug.LogError("[AudioImportTool] 无法加载 AudioExtendSettings.asset,请确保资产存在于 Assets/Settings/ 目录");
}
return s_settings;
}
}
static string ConfigAbsolutePath 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")] [MenuItem("Tools/OCES/Audio/Apply Audio Import Settings")]
@@ -19,7 +36,7 @@ namespace OCES.Audio
{ {
if (EditorUtility.DisplayDialog( if (EditorUtility.DisplayDialog(
"Apply Audio Import Settings", "Apply Audio Import Settings",
$"将对 {AudioExtendSettings.Instance.FullAudioResourcePath} 下所有文件重新应用导入设置,确认继续?", $"将对 {Settings.FullAudioResourcePath} 下所有文件重新应用导入设置,确认继续?",
"确认", "取消")) "确认", "取消"))
{ {
Run(); Run();
@@ -43,10 +60,10 @@ namespace OCES.Audio
{ {
// 1. 加载配置表 // 1. 加载配置表
var audioObjectConfig = var audioObjectConfig =
AudioConfigLoader.Load<AudioObjectConfig>(AudioExtendSettings.Instance.FullAudioConfigPath, AudioConfigLoader.Load<AudioObjectConfig>(Settings.FullAudioConfigPath,
"AudioObject.bytes"); "AudioObject.bytes");
var musicSegmentConfig = var musicSegmentConfig =
AudioConfigLoader.Load<MusicSegmentConfig>(AudioExtendSettings.Instance.FullAudioConfigPath, AudioConfigLoader.Load<MusicSegmentConfig>(Settings.FullAudioConfigPath,
"MusicSegment.bytes"); "MusicSegment.bytes");
if (audioObjectConfig == null || musicSegmentConfig == null) if (audioObjectConfig == null || musicSegmentConfig == null)
{ {
@@ -56,7 +73,7 @@ namespace OCES.Audio
// 2. 扫描文件 // 2. 扫描文件
List<string> supportedExtensions = new() { ".wav", ".ogg" }; List<string> 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(); FileInfo[] files = dir.GetFiles().Where(f => supportedExtensions.Contains(f.Extension.ToLower())).ToArray();
int total = files.Length, processed = 0, failed = 0; int total = files.Length, processed = 0, failed = 0;
@@ -116,20 +133,20 @@ namespace OCES.Audio
importer.ClearSampleSettingOverride("iOS"); importer.ClearSampleSettingOverride("iOS");
AudioImporterSampleSettings settings = importer.defaultSampleSettings; AudioImporterSampleSettings settings = importer.defaultSampleSettings;
settings.compressionFormat = AudioExtendSettings.Instance.compressionFormat; settings.compressionFormat = Settings.compressionFormat;
settings.sampleRateSetting = AudioSampleRateSetting.OverrideSampleRate; settings.sampleRateSetting = AudioSampleRateSetting.OverrideSampleRate;
settings.preloadAudioData = audioObject?.Haptic != 0; settings.preloadAudioData = audioObject?.Haptic != 0;
switch (category) switch (category)
{ {
case AudioCategory.Music: case AudioCategory.Music:
settings.sampleRateOverride = AudioExtendSettings.Instance.musicSampleRate; settings.sampleRateOverride = Settings.musicSampleRate;
settings.quality = AudioExtendSettings.Instance.musicQuality; settings.quality = Settings.musicQuality;
if (duration <= AudioExtendSettings.Instance.decompressThreshold) if (duration <= Settings.decompressThreshold)
{ {
settings.loadType = AudioClipLoadType.DecompressOnLoad; settings.loadType = AudioClipLoadType.DecompressOnLoad;
}else if (duration >= AudioExtendSettings.Instance.streamingThreshold) }else if (duration >= Settings.streamingThreshold)
{ {
settings.loadType = AudioClipLoadType.Streaming; settings.loadType = AudioClipLoadType.Streaming;
} }
@@ -141,10 +158,10 @@ namespace OCES.Audio
case AudioCategory.Voice: case AudioCategory.Voice:
case AudioCategory.SFX: case AudioCategory.SFX:
default: default:
settings.sampleRateOverride = AudioExtendSettings.Instance.sfxSampleRate; // 音效2022.3.62f3没有32kHz这一档,要是有的话这一档其实最合适 settings.sampleRateOverride = Settings.sfxSampleRate; // 音效2022.3.62f3没有32kHz这一档,要是有的话这一档其实最合适
settings.quality = AudioExtendSettings.Instance.sfxQuality; settings.quality = Settings.sfxQuality;
settings.loadType = duration >= AudioExtendSettings.Instance.streamingThreshold settings.loadType = duration >= Settings.streamingThreshold
? AudioClipLoadType.Streaming ? AudioClipLoadType.Streaming
: AudioClipLoadType.DecompressOnLoad; : AudioClipLoadType.DecompressOnLoad;
break; break;