diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity
index 74ec645..6e78ddf 100644
--- a/Assets/Scenes/SampleScene.unity
+++ b/Assets/Scenes/SampleScene.unity
@@ -2883,6 +2883,7 @@ MonoBehaviour:
startWithMusic: 1
startMusicWith: 0
logLevel: 0
+ extendSettings: {fileID: 11400000, guid: de80878c933394e2da0966a1466fd793, type: 2}
--- !u!4 &2093584671
Transform:
m_ObjectHideFlags: 0
diff --git a/Assets/Scripts/OCES/Audio/HandWritten/AudioExtendSettings.cs b/Assets/Scripts/OCES/Audio/HandWritten/AudioExtendSettings.cs
new file mode 100644
index 0000000..1bc38f9
--- /dev/null
+++ b/Assets/Scripts/OCES/Audio/HandWritten/AudioExtendSettings.cs
@@ -0,0 +1,71 @@
+using UnityEngine;
+using System.IO;
+
+namespace OCES.Audio
+{
+ ///
+ /// 音频系统扩展配置,集中管理所有路径和可调参数。
+ /// 资产位置:Assets/Settings/AudioExtendSettings.asset
+ /// 编辑入口:Project Settings > Audio Extend
+ /// 运行时注入:AudioSystem.Awake() 将 Inspector 引用注入 _instance
+ ///
+ public class AudioExtendSettings : ScriptableObject
+ {
+ // ========== Resource Paths ==========
+ [Header("Resource Paths")]
+ [Tooltip("Resources 子目录:音频配置文件(.bytes)")]
+ public string audioConfigPath = "AudioData";
+
+ [Tooltip("Resources 子目录:音频资源文件(.wav/.ogg)")]
+ public string audioResourcePath = "Audios";
+
+ [Tooltip("Resources 路径:AudioMixer 资产")]
+ public string audioMixerPath = "Audios/Master";
+
+ // ========== AudioMixer Group Paths ==========
+ [Header("AudioMixer Groups")]
+ public string sfxGroupPath = "Master/Regular/SFX";
+ public string voiceGroupPath = "Master/Regular/Voice";
+ public string accentSfxGroupPath = "Master/SFX_Accent";
+ public string musicGroupPath = "Master/Regular/Music";
+ public string ambienceGroupPath = "Master/Regular/SFX/Ambience";
+
+ // ========== AudioMixer Parameters ==========
+ [Header("Lowpass Filter")]
+ public string lowpassParamName = "LowpassFreq";
+ public float lowpassEnabledCutoff = 440f;
+ public float lowpassDisabledCutoff = 22000f;
+ public float lowpassTweenDuration = 0.2f;
+
+ // ========== Audio Import ==========
+ [Header("Audio Import Settings")]
+ public AudioCompressionFormat compressionFormat = AudioCompressionFormat.Vorbis;
+ public uint sfxSampleRate = 22050;
+ public uint musicSampleRate = 44100;
+ public float musicQuality = 0.13f;
+ public float sfxQuality = 0.5f;
+
+ public float decompressThreshold = 5f; // ≤ 此值 → DecompressOnLoad
+ public float streamingThreshold = 15f; // ≥ 此值 → Streaming
+
+ // ========== Fade ==========
+ [Header("Fade")]
+ public DG.Tweening.Ease defaultFadeOutEase = DG.Tweening.Ease.InSine;
+ public DG.Tweening.Ease defaultFadeInEase = DG.Tweening.Ease.OutSine;
+
+ // ── Singleton ──
+
+ public static AudioExtendSettings Instance { get; internal set; }
+
+ // 便利属性:拼接完整路径
+ public string FullAudioResourcePath
+ {
+ get { return Path.Combine(Application.dataPath, "Resources", this.audioResourcePath); }
+ }
+
+ public string FullAudioConfigPath
+ {
+ get { return Path.Combine(Application.dataPath, "Resources", this.audioConfigPath); }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Scripts/OCES/Audio/HandWritten/AudioExtendSettings.cs.meta b/Assets/Scripts/OCES/Audio/HandWritten/AudioExtendSettings.cs.meta
new file mode 100644
index 0000000..facd11a
--- /dev/null
+++ b/Assets/Scripts/OCES/Audio/HandWritten/AudioExtendSettings.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 79becf8778e048058fe7cc1f3a5e021b
+timeCreated: 1778750086
\ No newline at end of file
diff --git a/Assets/Scripts/OCES/Audio/HandWritten/AudioSystem.cs b/Assets/Scripts/OCES/Audio/HandWritten/AudioSystem.cs
index 06bd585..d151888 100644
--- a/Assets/Scripts/OCES/Audio/HandWritten/AudioSystem.cs
+++ b/Assets/Scripts/OCES/Audio/HandWritten/AudioSystem.cs
@@ -19,9 +19,8 @@ namespace OCES.Audio
public enum ConsoleLogLevel { Off, Log, Warning, Error } //TODO 实现这个功能
internal ResourceLoader ResourceLoader;
-
- const string k_audioConfigPath = "AudioData";
- const string k_audioResourcePath = "Audios";
+
+ [SerializeField] AudioExtendSettings extendSettings;
SfxSystem m_sfxSystem;
MusicSystem m_musicSystem;
@@ -99,14 +98,16 @@ namespace OCES.Audio
public void SetLowpass(bool enable)
{
- float target = enable ? 440f : 22000f;
+ float target = enable
+ ? AudioExtendSettings.Instance.lowpassEnabledCutoff
+ : AudioExtendSettings.Instance.lowpassDisabledCutoff;
// Kill existing tween to avoid stacking
if (this.m_lowpassTween != null && this.m_lowpassTween.IsActive())
this.m_lowpassTween.Kill();
// Get current value as start
- if (!this.m_mixer.GetFloat("LowpassFreq", out float current))
+ if (!this.m_mixer.GetFloat(AudioExtendSettings.Instance.lowpassParamName, out float current))
current = target;
float startLog = Mathf.Log10(current);
@@ -118,10 +119,10 @@ namespace OCES.Audio
{
startLog = x;
float value = Mathf.Pow(10f, startLog);
- this.m_mixer.SetFloat("LowpassFreq", value);
+ this.m_mixer.SetFloat(AudioExtendSettings.Instance.lowpassParamName, value);
},
endLog,
- 0.2f // duration in seconds
+ AudioExtendSettings.Instance.lowpassTweenDuration // duration in seconds
).SetEase(Ease.OutCubic);
}
@@ -275,6 +276,8 @@ namespace OCES.Audio
void Awake()
{
+ AudioExtendSettings.Instance = this.extendSettings;
+
if ((bool)Instance && Instance != this)
{
Destroy(gameObject);
@@ -284,28 +287,30 @@ namespace OCES.Audio
DontDestroyOnLoad(gameObject);
this.ResourceLoader = gameObject.AddComponent();
+
+ string audioConfigPath = AudioExtendSettings.Instance.audioConfigPath;
- this.m_mixer = this.ResourceLoader.LoadSync("Audios/Master");
+ this.m_mixer = this.ResourceLoader.LoadSync(AudioExtendSettings.Instance.audioMixerPath);
// ── SFX 调度器 ──
// AudioSystem.cs 中
GameObject sfxPoolRoot = new("SfxSourcePool");
sfxPoolRoot.transform.SetParent(transform, false);
- AudioSourcePool sfxPool = new(sfxPoolRoot.transform); // 不传 mixer group,让 SfxSystem 自己设置
+ AudioSourcePool sfxPool = new(sfxPoolRoot.transform);
this.m_sfxSystem = gameObject.AddComponent();
- this.m_audioObjects = AudioConfigLoader.Load($"{k_audioConfigPath}/AudioObject");
+ this.m_audioObjects = AudioConfigLoader.Load($"{audioConfigPath}/AudioObject");
this.m_audioObjects.PreParseSwitchMappings();
- this.m_groups = AudioConfigLoader.Load($"{k_audioConfigPath}/AudioGroup");
- this.m_sfxSystem.Initialize(this.m_groups, this.m_mixer, sfxPool); // 传入 pool
+ this.m_groups = AudioConfigLoader.Load ($"{audioConfigPath}/AudioGroup");
+ this.m_sfxSystem.Initialize(this.m_groups, this.m_mixer, sfxPool);
// ── 音乐与环境音系统 ──
- var segments = AudioConfigLoader.Load($"{k_audioConfigPath}/MusicSegment");
- var containers = AudioConfigLoader.Load($"{k_audioConfigPath}/MusicContainer");
- var musicPaths = AudioConfigLoader.Load($"{k_audioConfigPath}/MusicPath");
- var ambiencePaths = AudioConfigLoader.Load($"{k_audioConfigPath}/AmbiencePath");
- var musicTransitions = AudioConfigLoader.Load($"{k_audioConfigPath}/MusicTransition");
- var ambienceTransitions = AudioConfigLoader.Load($"{k_audioConfigPath}/AmbienceTransition");
+ var segments = AudioConfigLoader.Load ($"{audioConfigPath}/MusicSegment");
+ var containers = AudioConfigLoader.Load ($"{audioConfigPath}/MusicContainer");
+ var musicPaths = AudioConfigLoader.Load ($"{audioConfigPath}/MusicPath");
+ var ambiencePaths = AudioConfigLoader.Load ($"{audioConfigPath}/AmbiencePath");
+ var musicTransitions = AudioConfigLoader.Load ($"{audioConfigPath}/MusicTransition");
+ var ambienceTransitions = AudioConfigLoader.Load ($"{audioConfigPath}/AmbienceTransition");
//运行时数据验证
segments.Validate();
@@ -317,12 +322,12 @@ namespace OCES.Audio
// AudioSourcePool 由 MusicSystem 独占一个子节点,与 SFX pool 隔离
GameObject musicPoolRoot = new("MusicSourcePool");
musicPoolRoot.transform.SetParent(transform, false);
- AudioMixerGroup musicGroup = this.m_mixer.FindMatchingGroups("Master/Regular/Music")[0];
+ AudioMixerGroup musicGroup = this.m_mixer.FindMatchingGroups(AudioExtendSettings.Instance.musicGroupPath)[0];
AudioSourcePool musicPool = new(musicPoolRoot.transform, musicGroup);
GameObject ambiencePoolRoot = new("AmbienceSourcePool");
ambiencePoolRoot.transform.SetParent(transform, false);
- AudioMixerGroup ambienceGroup = this.m_mixer.FindMatchingGroups("Master/Regular/SFX/Ambience")[0];
+ AudioMixerGroup ambienceGroup = this.m_mixer.FindMatchingGroups(AudioExtendSettings.Instance.ambienceGroupPath)[0];
AudioSourcePool ambiencePool = new(ambiencePoolRoot.transform, ambienceGroup);
this.m_musicSystem.Initialize(
@@ -429,4 +434,4 @@ namespace OCES.Audio
return default;
}
}
-}
+}
\ No newline at end of file
diff --git a/Assets/Scripts/OCES/Audio/HandWritten/Editor/AudioExtendSettingsProvider.cs b/Assets/Scripts/OCES/Audio/HandWritten/Editor/AudioExtendSettingsProvider.cs
new file mode 100644
index 0000000..d443605
--- /dev/null
+++ b/Assets/Scripts/OCES/Audio/HandWritten/Editor/AudioExtendSettingsProvider.cs
@@ -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(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();
+ AssetDatabase.CreateAsset(asset, k_assetPath);
+ AssetDatabase.SaveAssets();
+ Debug.Log($"[AudioExtend] 已创建默认配置:{k_assetPath}");
+ }
+ }
+}
+
diff --git a/Assets/Scripts/OCES/Audio/HandWritten/Editor/AudioExtendSettingsProvider.cs.meta b/Assets/Scripts/OCES/Audio/HandWritten/Editor/AudioExtendSettingsProvider.cs.meta
new file mode 100644
index 0000000..a63dc95
--- /dev/null
+++ b/Assets/Scripts/OCES/Audio/HandWritten/Editor/AudioExtendSettingsProvider.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 862f5cacec834b47a75da0d8ba2710f1
+timeCreated: 1778757352
\ No newline at end of file
diff --git a/Assets/Scripts/OCES/Audio/HandWritten/Editor/AudioImportTool.cs b/Assets/Scripts/OCES/Audio/HandWritten/Editor/AudioImportTool.cs
index 20a6b2a..1851699 100644
--- a/Assets/Scripts/OCES/Audio/HandWritten/Editor/AudioImportTool.cs
+++ b/Assets/Scripts/OCES/Audio/HandWritten/Editor/AudioImportTool.cs
@@ -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(ConfigAbsolutePath, "AudioObject.bytes");
- var musicSegmentConfig = AudioConfigLoader.Load(ConfigAbsolutePath, "MusicSegment.bytes");
+ var audioObjectConfig =
+ AudioConfigLoader.Load(AudioExtendSettings.Instance.FullAudioConfigPath,
+ "AudioObject.bytes");
+ var musicSegmentConfig =
+ AudioConfigLoader.Load(AudioExtendSettings.Instance.FullAudioConfigPath,
+ "MusicSegment.bytes");
if (audioObjectConfig == null || musicSegmentConfig == null)
{
Debug.LogError("[AudioImportTool] 配置表加载失败,终止");
@@ -59,7 +56,7 @@ namespace OCES.Audio
// 2. 扫描文件
List 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;
}
diff --git a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/ChannelFader.cs b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/ChannelFader.cs
index 12c7417..ae69510 100644
--- a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/ChannelFader.cs
+++ b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/ChannelFader.cs
@@ -194,7 +194,7 @@ namespace OCES.Audio
continue;
src.volume = fromVolume;
- src.DOFade(0f, duration - elapsed).SetEase(Ease.InSine); //TODO 支持读表
+ src.DOFade(0f, duration - elapsed).SetEase(AudioExtendSettings.Instance.defaultFadeOutEase); //TODO 支持读表
}
yield return null;
}
@@ -236,7 +236,7 @@ namespace OCES.Audio
if (DOTween.IsTweening(src))
continue;
src.volume = 0f;
- src.DOFade(1f, duration - elapsed).SetEase(Ease.OutSine); //TODO 支持读表
+ src.DOFade(1f, duration - elapsed).SetEase(AudioExtendSettings.Instance.defaultFadeInEase); //TODO 支持读表
}
yield return null;
diff --git a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/LongAudioContainerPlayer.cs b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/LongAudioContainerPlayer.cs
index 6285ec0..e9c34fc 100644
--- a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/LongAudioContainerPlayer.cs
+++ b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/LongAudioContainerPlayer.cs
@@ -342,7 +342,7 @@ namespace OCES.Audio
// AudioClip clip = Resources.Load($"Audios/{segment.Name}");
AudioClip clip = null;
- AudioSystem.Instance.ResourceLoader.LoadAsync($"Audios/{segment.Name}", loadedClip =>
+ AudioSystem.Instance.ResourceLoader.LoadAsync($"{AudioExtendSettings.Instance.audioResourcePath}/{segment.Name}", loadedClip =>
{
clip = loadedClip;
});
diff --git a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicSegment.cs b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicSegment.cs
index f86c810..3555cc2 100644
--- a/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicSegment.cs
+++ b/Assets/Scripts/OCES/Audio/HandWritten/LongAudio/MusicSegment.cs
@@ -16,7 +16,9 @@ namespace OCES.Audio
{
foreach (MusicSegment segment in this.m_musicSegmentInfos.Values)
{
- AudioClip clip = AudioSystem.Instance.ResourceLoader.LoadSync($"Audios/{segment.Name}");
+ AudioClip clip =
+ AudioSystem.Instance.ResourceLoader.LoadSync(
+ $"{AudioExtendSettings.Instance.audioResourcePath}/{segment.Name}");
if (!clip)
{
Debug.LogError($"[MusicSegmentConfig] 音频文件未找到: {segment.Name}, SegmentId: {segment.Id}");
diff --git a/Assets/Scripts/OCES/Audio/HandWritten/SfxSystem.cs b/Assets/Scripts/OCES/Audio/HandWritten/SfxSystem.cs
index 593afa7..cad34e7 100644
--- a/Assets/Scripts/OCES/Audio/HandWritten/SfxSystem.cs
+++ b/Assets/Scripts/OCES/Audio/HandWritten/SfxSystem.cs
@@ -14,9 +14,7 @@ namespace OCES.Audio
public class SfxSystem : MonoBehaviour
{
public UnityEngine.UI.Text audioSystemTextBox;
-
- const int k_maxGlobalConcurrent = 128;
-
+
//记录某个 AudioObject 最近一次触发播放的时刻,用于 MinInterval 节流判断,是"上次什么时候播过"。
readonly Dictionary m_lastPlayTime = new();
readonly Dictionary m_clipConcurrentCount = new();
@@ -78,11 +76,11 @@ namespace OCES.Audio
this.m_pitchStepResolver = new PitchStepResolver();
this.m_volumeStepResolver = new VolumeStepResolver();
- AudioMixerGroup[] sfx = Find("Master/Regular/SFX");
+ AudioMixerGroup[] sfx = Find(AudioExtendSettings.Instance.sfxGroupPath);
if (sfx.Length > 0) this.m_sfxGroup = sfx[0];
- AudioMixerGroup[] voice = Find("Master/Regular/Voice");
+ AudioMixerGroup[] voice = Find(AudioExtendSettings.Instance.voiceGroupPath);
if (voice.Length > 0) this.m_voiceGroup = voice[0];
- AudioMixerGroup[] accentSfx = Find("Master/SFX_Accent");
+ AudioMixerGroup[] accentSfx = Find(AudioExtendSettings.Instance.accentSfxGroupPath);
if (accentSfx.Length > 0) this.m_accentSfxGroup = accentSfx[0];
return;
@@ -224,7 +222,8 @@ namespace OCES.Audio
}
// 第四层:全局并发控制
- if (this.m_activeSounds.Count >= k_maxGlobalConcurrent)
+ //从Unity原生Audio Settings中读取最大发音数限制
+ if (this.m_activeSounds.Count >= AudioSettings.GetConfiguration().numVirtualVoices)
{
this.m_tempLowerPriority.Clear();
foreach (ActiveSound activeSound in this.m_activeSounds)
@@ -405,7 +404,9 @@ namespace OCES.Audio
bool SetupSource(AudioSource source, ActiveSound activeSound, int clipIndex = 0)
{
AudioObject audioObject = activeSound.AudioObject;
- AudioClip clip = AudioSystem.Instance.ResourceLoader.LoadSync($"Audios/{audioObject.Name[clipIndex]}");
+ AudioClip clip =
+ AudioSystem.Instance.ResourceLoader.LoadSync(
+ $"{AudioExtendSettings.Instance.audioResourcePath}/{audioObject.Name[clipIndex]}");
if (!clip)
{
Debug.LogError($"音频文件未找到:{audioObject.Name[clipIndex]}");
diff --git a/Assets/Settings/AudioExtendSettings.asset b/Assets/Settings/AudioExtendSettings.asset
new file mode 100644
index 0000000..110547a
--- /dev/null
+++ b/Assets/Settings/AudioExtendSettings.asset
@@ -0,0 +1,35 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!114 &11400000
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 79becf8778e048058fe7cc1f3a5e021b, type: 3}
+ m_Name: AudioExtendSettings
+ m_EditorClassIdentifier:
+ audioConfigPath: AudioData
+ audioResourcePath: Audios
+ audioMixerPath: Audios/Master
+ sfxGroupPath: Master/Regular/SFX
+ voiceGroupPath: Master/Regular/Voice
+ accentSfxGroupPath: Master/SFX_Accent
+ musicGroupPath: Master/Regular/Music
+ ambienceGroupPath: Master/Regular/SFX/Ambience
+ lowpassParamName: LowpassFreq
+ lowpassEnabledCutoff: 440
+ lowpassDisabledCutoff: 22000
+ lowpassTweenDuration: 0.2
+ compressionFormat: 1
+ sfxSampleRate: 22050
+ musicSampleRate: 44100
+ musicQuality: 0.13
+ sfxQuality: 0.5
+ decompressThreshold: 5
+ streamingThreshold: 15
+ defaultFadeOutEase: 2
+ defaultFadeInEase: 3
diff --git a/Assets/Settings/AudioExtendSettings.asset.meta b/Assets/Settings/AudioExtendSettings.asset.meta
new file mode 100644
index 0000000..f25606f
--- /dev/null
+++ b/Assets/Settings/AudioExtendSettings.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: de80878c933394e2da0966a1466fd793
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant: