GFramework/GFramework.Godot/setting/GodotAudioSettings.cs
GeWuYou fd3a9ae9e0 feat(functional): 添加函数式编程扩展和Option类型支持
- 在FunctionExtensions中新增Map扩展方法用于对象映射
- 在PipeExtensions中新增On扩展方法用于值到函数的应用
- 移除Tap方法及相关测试以优化管道操作
- 新增NullableExtensions实现可空类型到Option的转换
- 新增Option结构体提供安全的可选值处理
- 新增OptionExtensions提供Map、Bind、Filter、Match等函数式操作
- 新增OptionValueExtensions提供GetOrElse和OrElse值提取方法
- 调整全局引用添加Concurrent集合支持
- 扩展IResetApplyAbleSettings接口添加Data属性
- 更新Godot设置类实现Data属性返回设置数据模型
2026-01-31 21:25:27 +08:00

60 lines
1.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using GFramework.Game.Abstractions.setting;
using GFramework.Game.Abstractions.setting.data;
using GFramework.Godot.setting.data;
using Godot;
namespace GFramework.Godot.setting;
/// <summary>
/// Godot音频设置实现类用于应用音频配置到Godot音频系统
/// </summary>
/// <param name="model">设置模型对象,提供音频设置数据访问</param>
/// <param name="audioBusMap">音频总线映射对象,定义了不同音频类型的总线名称</param>
public class GodotAudioSettings(ISettingsModel model, AudioBusMap audioBusMap)
: IResetApplyAbleSettings
{
/// <summary>
/// 应用音频设置到Godot音频系统
/// </summary>
/// <returns>表示异步操作的任务</returns>
public Task Apply()
{
var settings = model.GetData<AudioSettings>();
SetBus(audioBusMap.Master, settings.MasterVolume);
SetBus(audioBusMap.Bgm, settings.BgmVolume);
SetBus(audioBusMap.Sfx, settings.SfxVolume);
return Task.CompletedTask;
}
/// <summary>
/// 重置音频设置为默认值
/// </summary>
public void Reset()
{
model.GetData<AudioSettings>().Reset();
}
public ISettingsData Data { get; } = model.GetData<AudioSettings>();
/// <summary>
/// 设置指定音频总线的音量
/// </summary>
/// <param name="busName">音频总线名称</param>
/// <param name="linear">线性音量值0-1之间</param>
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))
);
}
}