using GFramework.Game.Abstractions.setting; using GFramework.Game.Abstractions.setting.data; using GFramework.Godot.setting.data; using Godot; namespace GFramework.Godot.setting; /// /// Godot音频设置实现类,用于应用音频配置到Godot音频系统 /// /// 设置模型对象,提供音频设置数据访问 /// 音频总线映射对象,定义了不同音频类型的总线名称 public class GodotAudioSettings(ISettingsModel model, AudioBusMap audioBusMap) : IResetApplyAbleSettings { /// /// 应用音频设置到Godot音频系统 /// /// 表示异步操作的任务 public Task Apply() { var settings = model.GetData(); SetBus(audioBusMap.Master, settings.MasterVolume); SetBus(audioBusMap.Bgm, settings.BgmVolume); SetBus(audioBusMap.Sfx, settings.SfxVolume); return Task.CompletedTask; } /// /// 重置音频设置为默认值 /// public void Reset() { model.GetData().Reset(); } public ISettingsData Data { get; } = model.GetData(); public Type DataType { get; } = typeof(AudioSettings); /// /// 设置指定音频总线的音量 /// /// 音频总线名称 /// 线性音量值(0-1之间) private static void SetBus(string busName, float linear) { // 获取音频总线索引 var idx = AudioServer.GetBusIndex(busName); if (idx < 0) { GD.PushWarning($"Audio bus not found: {busName}"); return; } // 将线性音量转换为分贝并设置到音频总线 AudioServer.SetBusVolumeDb( idx, Mathf.LinearToDb(Mathf.Clamp(linear, 0.0001f, 1f)) ); } }