mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-22 10:34:30 +08:00
refactor(assets): 将系统组件重构为工具组件以优化架构设计
- 重命名 AbstractAssetCatalogSystem 为 AbstractAssetCatalogUtility 并继承 AbstractContextUtility - 重命名 IAssetCatalogSystem 为 IAssetCatalogUtility 并继承 IContextUtility 接口 - 重命名 IResourceFactorySystem 为 IResourceFactoryUtility 并继承 IContextUtility 接口 - 重命名 AbstractResourceFactorySystem 为 AbstractResourceFactoryUtility 并调整依赖注入方式 - 重命名 IResourceLoadSystem 为 IResourceLoadUtility 并继承 IContextUtility 接口 - 重命名 ResourceLoadSystem 为 ResourceLoadUtility 并更新内部日志输出信息 - 移除 AbstractAudioManagerSystem 和 IAudioManagerSystem 相关代码 - 更新所有相关依赖注入和类型引用以匹配新的工具组件架构
This commit is contained in:
parent
38625b80db
commit
8c8555985d
@ -1,11 +1,12 @@
|
||||
using GFramework.Core.Abstractions.system;
|
||||
using GFramework.Core.Abstractions.utility;
|
||||
|
||||
namespace GFramework.Game.Abstractions.assets;
|
||||
|
||||
/// <summary>
|
||||
/// 资源目录系统接口,用于管理场景和资源的获取与查询
|
||||
/// 资产目录工具接口,提供对场景单元、场景页面和普通资产的管理功能
|
||||
/// 继承自IUtility接口,用于处理资产目录相关的操作
|
||||
/// </summary>
|
||||
public interface IAssetCatalogSystem : ISystem
|
||||
public interface IAssetCatalogUtility : IContextUtility
|
||||
{
|
||||
/// <summary>
|
||||
/// 根据指定的键获取场景单元标识符
|
||||
@ -1,12 +1,13 @@
|
||||
using System;
|
||||
using GFramework.Core.Abstractions.system;
|
||||
using GFramework.Core.Abstractions.utility;
|
||||
|
||||
namespace GFramework.Game.Abstractions.assets;
|
||||
|
||||
/// <summary>
|
||||
/// 资源工厂系统接口,用于获取指定类型的资源创建函数
|
||||
/// 资源工厂工具接口,提供根据键名或资产目录映射获取资源创建函数的功能
|
||||
/// 继承自IContextUtility接口,用于在游戏框架中管理资源创建工厂
|
||||
/// </summary>
|
||||
public interface IResourceFactorySystem : ISystem
|
||||
public interface IResourceFactoryUtility : IContextUtility
|
||||
{
|
||||
/// <summary>
|
||||
/// 根据指定键名获取指定类型T的资源创建函数
|
||||
@ -1,4 +1,4 @@
|
||||
using GFramework.Core.system;
|
||||
using GFramework.Core.utility;
|
||||
using GFramework.Game.Abstractions.assets;
|
||||
|
||||
namespace GFramework.Game.assets;
|
||||
@ -8,7 +8,7 @@ namespace GFramework.Game.assets;
|
||||
/// 提供了统一的接口来注册和查询不同类型的资产(如游戏单元、模板、普通资源)。
|
||||
/// 子类需要实现 <see cref="RegisterAssets" /> 方法以完成具体资产的注册逻辑。
|
||||
/// </summary>
|
||||
public abstract class AbstractAssetCatalogSystem : AbstractSystem, IAssetCatalogSystem
|
||||
public abstract class AbstractAssetCatalogUtility : AbstractContextUtility, IAssetCatalogUtility
|
||||
{
|
||||
private readonly Dictionary<string, AssetCatalog.AssetId> _assets = new();
|
||||
private readonly Dictionary<string, AssetCatalog.ScenePageId> _scenePages = new();
|
||||
@ -1,6 +1,5 @@
|
||||
using GFramework.Core.Abstractions.enums;
|
||||
using GFramework.Core.extensions;
|
||||
using GFramework.Core.system;
|
||||
using GFramework.Core.utility;
|
||||
using GFramework.Game.Abstractions.assets;
|
||||
using Godot;
|
||||
|
||||
@ -10,27 +9,11 @@ namespace GFramework.Godot.assets;
|
||||
/// 资源工厂系统抽象基类,用于统一管理各类资源的创建与预加载逻辑。
|
||||
/// 提供注册场景和资源的方法,并通过依赖的资源加载系统和资产目录系统完成实际资源的获取与构造。
|
||||
/// </summary>
|
||||
public abstract class AbstractResourceFactorySystem : AbstractSystem, IResourceFactorySystem
|
||||
public abstract class AbstractResourceFactoryUtility : AbstractContextUtility, IResourceFactoryUtility
|
||||
{
|
||||
private IAssetCatalogSystem? _assetCatalogSystem;
|
||||
private IAssetCatalogUtility? _assetCatalogUtility;
|
||||
private ResourceFactory.Registry? _registry;
|
||||
private IResourceLoadSystem? _resourceLoadSystem;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 在架构阶段发生变化时执行相应的处理逻辑。
|
||||
/// </summary>
|
||||
/// <param name="phase">当前的架构阶段</param>
|
||||
public override void OnArchitecturePhase(ArchitecturePhase phase)
|
||||
{
|
||||
if (phase == ArchitecturePhase.Ready)
|
||||
{
|
||||
// 在架构准备就绪阶段注册资源并预加载所有资源
|
||||
RegisterResources();
|
||||
_registry!.PreloadAll();
|
||||
}
|
||||
}
|
||||
|
||||
private IResourceLoadUtility? _resourceLoadUtility;
|
||||
|
||||
/// <summary>
|
||||
/// 根据指定的键获取资源工厂函数。
|
||||
@ -63,8 +46,10 @@ public abstract class AbstractResourceFactorySystem : AbstractSystem, IResourceF
|
||||
protected override void OnInit()
|
||||
{
|
||||
_registry = new ResourceFactory.Registry();
|
||||
_resourceLoadSystem = this.GetSystem<IResourceLoadSystem>();
|
||||
_assetCatalogSystem = this.GetSystem<IAssetCatalogSystem>();
|
||||
_resourceLoadUtility = this.GetUtility<IResourceLoadUtility>();
|
||||
_assetCatalogUtility = this.GetUtility<IAssetCatalogUtility>();
|
||||
RegisterResources();
|
||||
_registry!.PreloadAll();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -86,11 +71,11 @@ public abstract class AbstractResourceFactorySystem : AbstractSystem, IResourceF
|
||||
bool preload = false)
|
||||
where T : Node
|
||||
{
|
||||
var id = _assetCatalogSystem!.GetSceneUnit(sceneUnitKey);
|
||||
var id = _assetCatalogUtility!.GetSceneUnit(sceneUnitKey);
|
||||
|
||||
_registry!.Register(
|
||||
sceneUnitKey,
|
||||
_resourceLoadSystem!.GetOrRegisterGameUnitFactory<T>(id),
|
||||
_resourceLoadUtility!.GetOrRegisterGameUnitFactory<T>(id),
|
||||
preload
|
||||
);
|
||||
}
|
||||
@ -107,11 +92,11 @@ public abstract class AbstractResourceFactorySystem : AbstractSystem, IResourceF
|
||||
bool preload = false)
|
||||
where T : Node
|
||||
{
|
||||
var id = _assetCatalogSystem!.GetScenePage(scenePageKey);
|
||||
var id = _assetCatalogUtility!.GetScenePage(scenePageKey);
|
||||
|
||||
_registry!.Register(
|
||||
scenePageKey,
|
||||
_resourceLoadSystem!.GetOrRegisterTemplateFactory<T>(id),
|
||||
_resourceLoadUtility!.GetOrRegisterTemplateFactory<T>(id),
|
||||
preload
|
||||
);
|
||||
}
|
||||
@ -127,11 +112,11 @@ public abstract class AbstractResourceFactorySystem : AbstractSystem, IResourceF
|
||||
bool preload = false)
|
||||
where T : Resource
|
||||
{
|
||||
var id = _assetCatalogSystem!.GetAsset(assetKey);
|
||||
var id = _assetCatalogUtility!.GetAsset(assetKey);
|
||||
|
||||
_registry!.Register(
|
||||
assetKey,
|
||||
_resourceLoadSystem!.GetOrRegisterAssetFactory<T>(id),
|
||||
_resourceLoadUtility!.GetOrRegisterAssetFactory<T>(id),
|
||||
preload
|
||||
);
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
using GFramework.Core.Abstractions.system;
|
||||
using GFramework.Core.Abstractions.utility;
|
||||
using GFramework.Game.Abstractions.assets;
|
||||
using Godot;
|
||||
|
||||
@ -7,7 +7,7 @@ namespace GFramework.Godot.assets;
|
||||
/// <summary>
|
||||
/// 资源加载系统接口,提供资源和场景的加载、实例化、预加载等功能
|
||||
/// </summary>
|
||||
public interface IResourceLoadSystem : ISystem
|
||||
public interface IResourceLoadUtility : IContextUtility
|
||||
{
|
||||
/// <summary>
|
||||
/// 加载指定路径的资源
|
||||
@ -1,4 +1,4 @@
|
||||
using GFramework.Core.system;
|
||||
using GFramework.Core.utility;
|
||||
using GFramework.Game.Abstractions.assets;
|
||||
using Godot;
|
||||
|
||||
@ -8,7 +8,7 @@ namespace GFramework.Godot.assets;
|
||||
/// 资源加载系统,用于统一管理和缓存Godot资源(如场景、纹理等)的加载与实例化。
|
||||
/// 提供基础加载、场景实例化、资源工厂注册以及缓存管理功能。
|
||||
/// </summary>
|
||||
public class ResourceLoadSystem : AbstractSystem, IResourceLoadSystem
|
||||
public class ResourceLoadUtility : AbstractContextUtility, IResourceLoadUtility
|
||||
{
|
||||
/// <summary>
|
||||
/// 已加载的资源缓存字典,键为资源路径,值为已加载的Resource对象。
|
||||
@ -129,7 +129,7 @@ public class ResourceLoadSystem : AbstractSystem, IResourceLoadSystem
|
||||
var res = GD.Load<T>(path);
|
||||
if (res == null)
|
||||
{
|
||||
GD.PrintErr($"[ResourceLoadSystem] Load failed: {path}");
|
||||
GD.PrintErr($"[ResourceLoadUtility] Load failed: {path}");
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -1,548 +0,0 @@
|
||||
using GFramework.Core.extensions;
|
||||
using GFramework.Core.system;
|
||||
using GFramework.Game.Abstractions.assets;
|
||||
using GFramework.Godot.assets;
|
||||
using Godot;
|
||||
|
||||
namespace GFramework.Godot.system;
|
||||
|
||||
/// <summary>
|
||||
/// 音频管理器抽象基类,提供音频播放的基础实现
|
||||
/// </summary>
|
||||
public abstract class AbstractAudioManagerSystem : AbstractSystem, IAudioManagerSystem
|
||||
{
|
||||
/// <summary>
|
||||
/// 最大同时播放的音效数量
|
||||
/// </summary>
|
||||
protected const int MaxSoundPlayers = 10;
|
||||
|
||||
/// <summary>
|
||||
/// 最大同时播放的3D音效数量
|
||||
/// </summary>
|
||||
protected const int MaxSound3DPlayers = 5;
|
||||
|
||||
/// <summary>
|
||||
/// 可用3D音效播放器队列
|
||||
/// </summary>
|
||||
protected readonly Queue<AudioStreamPlayer3D> AvailableSound3DPlayers = new();
|
||||
|
||||
/// <summary>
|
||||
/// 可用音效播放器队列
|
||||
/// </summary>
|
||||
protected readonly Queue<AudioStreamPlayer> AvailableSoundPlayers = new();
|
||||
|
||||
/// <summary>
|
||||
/// 3D音效播放器列表
|
||||
/// </summary>
|
||||
protected readonly List<AudioStreamPlayer3D> Sound3DPlayers = [];
|
||||
|
||||
/// <summary>
|
||||
/// 音效播放器列表
|
||||
/// </summary>
|
||||
protected readonly List<AudioStreamPlayer> SoundPlayers = [];
|
||||
|
||||
/// <summary>
|
||||
/// 环境音量
|
||||
/// </summary>
|
||||
protected float AmbientVolume = 1.0f;
|
||||
|
||||
/// <summary>
|
||||
/// 资源目录系统依赖
|
||||
/// </summary>
|
||||
protected IAssetCatalogSystem? AssetCatalogSystem;
|
||||
|
||||
/// <summary>
|
||||
/// 主音量
|
||||
/// </summary>
|
||||
protected float MasterVolume = 1.0f;
|
||||
|
||||
/// <summary>
|
||||
/// 音乐淡入淡出动画
|
||||
/// </summary>
|
||||
protected Tween? MusicFadeTween;
|
||||
|
||||
/// <summary>
|
||||
/// 背景音乐播放器
|
||||
/// </summary>
|
||||
protected AudioStreamPlayer? MusicPlayer;
|
||||
|
||||
/// <summary>
|
||||
/// 背景音乐音量
|
||||
/// </summary>
|
||||
protected float MusicVolume = 1.0f;
|
||||
|
||||
/// <summary>
|
||||
/// 资源工厂系统依赖
|
||||
/// </summary>
|
||||
protected IResourceFactorySystem? ResourceFactorySystem;
|
||||
|
||||
/// <summary>
|
||||
/// 音频资源加载系统依赖
|
||||
/// </summary>
|
||||
protected IResourceLoadSystem? ResourceLoadSystem;
|
||||
|
||||
/// <summary>
|
||||
/// 特效音量
|
||||
/// </summary>
|
||||
protected float SfxVolume = 1.0f;
|
||||
|
||||
/// <summary>
|
||||
/// 音效音量
|
||||
/// </summary>
|
||||
protected float SoundVolume = 1.0f;
|
||||
|
||||
/// <summary>
|
||||
/// 语音音量
|
||||
/// </summary>
|
||||
protected float VoiceVolume = 1.0f;
|
||||
|
||||
/// <summary>
|
||||
/// 所有者节点的抽象属性
|
||||
/// </summary>
|
||||
protected abstract Node Owner { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 播放背景音乐
|
||||
/// </summary>
|
||||
/// <param name="audioPath">音频文件路径</param>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
/// <param name="loop">是否循环播放</param>
|
||||
public virtual void PlayMusic(string audioPath, float volume = 1.0f, bool loop = true)
|
||||
{
|
||||
var audioStream = ResourceLoadSystem?.LoadResource<AudioStream>(audioPath);
|
||||
if (audioStream == null || MusicPlayer == null) return;
|
||||
|
||||
// 停止当前正在进行的淡入淡出效果
|
||||
MusicFadeTween?.Kill();
|
||||
|
||||
MusicPlayer.Stream = audioStream;
|
||||
MusicPlayer.VolumeDb = LinearToDb(volume * MusicVolume * MasterVolume);
|
||||
MusicPlayer.Play();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 播放音效
|
||||
/// </summary>
|
||||
/// <param name="audioPath">音频文件路径</param>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
/// <param name="pitch">音调调整</param>
|
||||
public virtual void PlaySound(string audioPath, float volume = 1.0f, float pitch = 1.0f)
|
||||
{
|
||||
if (AvailableSoundPlayers.Count == 0) return;
|
||||
|
||||
var audioStream = ResourceLoadSystem?.LoadResource<AudioStream>(audioPath);
|
||||
if (audioStream == null) return;
|
||||
|
||||
var player = AvailableSoundPlayers.Dequeue();
|
||||
player.Stream = audioStream;
|
||||
player.VolumeDb = LinearToDb(volume * SoundVolume * MasterVolume);
|
||||
player.Play();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 播放特效音效
|
||||
/// </summary>
|
||||
/// <param name="audioPath">音频文件路径</param>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
/// <param name="pitch">音调调整</param>
|
||||
public virtual void PlaySfx(string audioPath, float volume = 1.0f, float pitch = 1.0f)
|
||||
{
|
||||
if (AvailableSoundPlayers.Count == 0) return;
|
||||
|
||||
var audioStream = ResourceLoadSystem?.LoadResource<AudioStream>(audioPath);
|
||||
if (audioStream == null) return;
|
||||
|
||||
var player = AvailableSoundPlayers.Dequeue();
|
||||
player.Stream = audioStream;
|
||||
player.VolumeDb = LinearToDb(volume * SfxVolume * MasterVolume);
|
||||
player.Play();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 播放语音
|
||||
/// </summary>
|
||||
/// <param name="audioPath">音频文件路径</param>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
/// <param name="pitch">音调调整</param>
|
||||
public virtual void PlayVoice(string audioPath, float volume = 1.0f, float pitch = 1.0f)
|
||||
{
|
||||
if (AvailableSoundPlayers.Count == 0) return;
|
||||
|
||||
var audioStream = ResourceLoadSystem?.LoadResource<AudioStream>(audioPath);
|
||||
if (audioStream == null) return;
|
||||
|
||||
var player = AvailableSoundPlayers.Dequeue();
|
||||
player.Stream = audioStream;
|
||||
player.VolumeDb = LinearToDb(volume * VoiceVolume * MasterVolume);
|
||||
player.Play();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 播放环境音效
|
||||
/// </summary>
|
||||
/// <param name="audioPath">音频文件路径</param>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
/// <param name="pitch">音调调整</param>
|
||||
public virtual void PlayAmbient(string audioPath, float volume = 1.0f, float pitch = 1.0f)
|
||||
{
|
||||
if (AvailableSoundPlayers.Count == 0) return;
|
||||
|
||||
var audioStream = ResourceLoadSystem?.LoadResource<AudioStream>(audioPath);
|
||||
if (audioStream == null) return;
|
||||
|
||||
var player = AvailableSoundPlayers.Dequeue();
|
||||
player.Stream = audioStream;
|
||||
player.VolumeDb = LinearToDb(volume * AmbientVolume * MasterVolume);
|
||||
player.Play();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 停止背景音乐
|
||||
/// </summary>
|
||||
public virtual void StopMusic()
|
||||
{
|
||||
MusicFadeTween?.Kill();
|
||||
MusicPlayer?.Stop();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 暂停背景音乐
|
||||
/// </summary>
|
||||
public virtual void PauseMusic()
|
||||
{
|
||||
MusicFadeTween?.Kill();
|
||||
// todo 需要记录音乐播放位置,以便恢复播放时从正确位置开始
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 恢复背景音乐播放
|
||||
/// </summary>
|
||||
public virtual void ResumeMusic()
|
||||
{
|
||||
MusicPlayer?.Play();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置背景音乐音量
|
||||
/// </summary>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
public virtual void SetMusicVolume(float volume)
|
||||
{
|
||||
MusicVolume = volume;
|
||||
if (MusicPlayer != null) MusicPlayer.VolumeDb = LinearToDb(MusicVolume * MasterVolume);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取背景音乐音量
|
||||
/// </summary>
|
||||
/// <returns>音量大小,范围0-1</returns>
|
||||
public virtual float GetMusicVolume()
|
||||
{
|
||||
return MusicVolume;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置音效音量
|
||||
/// </summary>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
public virtual void SetSoundVolume(float volume)
|
||||
{
|
||||
SoundVolume = volume;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取音效音量
|
||||
/// </summary>
|
||||
/// <returns>音量大小,范围0-1</returns>
|
||||
public virtual float GetSoundVolume()
|
||||
{
|
||||
return SoundVolume;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置主音量
|
||||
/// </summary>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
public virtual void SetMasterVolume(float volume)
|
||||
{
|
||||
MasterVolume = volume;
|
||||
|
||||
// 更新音乐音量
|
||||
if (MusicPlayer != null) MusicPlayer.VolumeDb = LinearToDb(MusicVolume * MasterVolume);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取主音量
|
||||
/// </summary>
|
||||
/// <returns>音量大小,范围0-1</returns>
|
||||
public virtual float GetMasterVolume()
|
||||
{
|
||||
return MasterVolume;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置SFX音量
|
||||
/// </summary>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
public virtual void SetSfxVolume(float volume)
|
||||
{
|
||||
SfxVolume = volume;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取SFX音量
|
||||
/// </summary>
|
||||
/// <returns>音量大小,范围0-1</returns>
|
||||
public virtual float GetSfxVolume()
|
||||
{
|
||||
return SfxVolume;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置语音音量
|
||||
/// </summary>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
public virtual void SetVoiceVolume(float volume)
|
||||
{
|
||||
VoiceVolume = volume;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取语音音量
|
||||
/// </summary>
|
||||
/// <returns>音量大小,范围0-1</returns>
|
||||
public virtual float GetVoiceVolume()
|
||||
{
|
||||
return VoiceVolume;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置环境音量
|
||||
/// </summary>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
public virtual void SetAmbientVolume(float volume)
|
||||
{
|
||||
AmbientVolume = volume;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取环境音量
|
||||
/// </summary>
|
||||
/// <returns>音量大小,范围0-1</returns>
|
||||
public virtual float GetAmbientVolume()
|
||||
{
|
||||
return AmbientVolume;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查背景音乐是否正在播放
|
||||
/// </summary>
|
||||
/// <returns>正在播放返回true,否则返回false</returns>
|
||||
public virtual bool IsMusicPlaying()
|
||||
{
|
||||
return MusicPlayer?.Playing ?? false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 淡入背景音乐
|
||||
/// </summary>
|
||||
/// <param name="audioPath">音频文件路径</param>
|
||||
/// <param name="duration">淡入持续时间(秒)</param>
|
||||
/// <param name="volume">目标音量</param>
|
||||
public virtual void FadeInMusic(string audioPath, float duration, float volume = 1.0f)
|
||||
{
|
||||
var audioStream = ResourceLoadSystem?.LoadResource<AudioStream>(audioPath);
|
||||
if (audioStream == null || MusicPlayer == null) return;
|
||||
|
||||
// 停止当前正在进行的淡入淡出效果
|
||||
MusicFadeTween?.Kill();
|
||||
|
||||
MusicPlayer.Stream = audioStream;
|
||||
MusicPlayer.VolumeDb = LinearToDb(0.0f); // 初始音量为0
|
||||
MusicPlayer.Play();
|
||||
|
||||
// 创建淡入动画
|
||||
MusicFadeTween = Owner.CreateTween();
|
||||
MusicFadeTween.TweenProperty(MusicPlayer, "volume_db", LinearToDb(volume * MusicVolume * MasterVolume),
|
||||
duration);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 淡出背景音乐
|
||||
/// </summary>
|
||||
/// <param name="duration">淡出持续时间(秒)</param>
|
||||
public virtual void FadeOutMusic(float duration)
|
||||
{
|
||||
if (MusicPlayer == null) return;
|
||||
|
||||
// 停止当前正在进行的淡入淡出效果
|
||||
MusicFadeTween?.Kill();
|
||||
|
||||
// 创建淡出动画
|
||||
MusicFadeTween = Owner.CreateTween();
|
||||
MusicFadeTween.TweenProperty(MusicPlayer, "volume_db", LinearToDb(0.0f), duration);
|
||||
MusicFadeTween.TweenCallback(Callable.From(() => MusicPlayer.Stop()));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置低通滤波器强度
|
||||
/// </summary>
|
||||
/// <param name="amount">滤波器强度,范围0-1</param>
|
||||
public virtual void SetLowPassFilter(float amount)
|
||||
{
|
||||
// TODO: 实现低通滤波器效果
|
||||
// 可以通过AudioEffectLowPassFilter实现
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置音频混响效果
|
||||
/// </summary>
|
||||
/// <param name="roomSize">房间大小</param>
|
||||
/// <param name="damping">阻尼</param>
|
||||
/// <param name="wetLevel">湿声级别</param>
|
||||
public virtual void SetReverb(float roomSize, float damping, float wetLevel)
|
||||
{
|
||||
// TODO: 实现音频混响效果
|
||||
// 可以通过AudioEffectReverb实现
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 播放3D音效
|
||||
/// </summary>
|
||||
/// <param name="audioPath">音频文件路径</param>
|
||||
/// <param name="position">3D空间中的位置</param>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
public virtual void PlaySound3D(string audioPath, Vector3 position, float volume = 1.0f)
|
||||
{
|
||||
if (AvailableSound3DPlayers.Count == 0) return;
|
||||
|
||||
var audioStream = ResourceLoadSystem?.LoadResource<AudioStream>(audioPath);
|
||||
if (audioStream == null) return;
|
||||
|
||||
var player = AvailableSound3DPlayers.Dequeue();
|
||||
player.Stream = audioStream;
|
||||
player.VolumeDb = LinearToDb(volume * SoundVolume * MasterVolume);
|
||||
player.Position = position;
|
||||
player.Play();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 系统初始化方法
|
||||
/// </summary>
|
||||
protected override void OnInit()
|
||||
{
|
||||
// 获取依赖的系统
|
||||
ResourceLoadSystem = this.GetSystem<IResourceLoadSystem>();
|
||||
AssetCatalogSystem = this.GetSystem<IAssetCatalogSystem>();
|
||||
ResourceFactorySystem = this.GetSystem<IResourceFactorySystem>();
|
||||
|
||||
// 初始化背景音乐播放器
|
||||
MusicPlayer = new AudioStreamPlayer();
|
||||
Owner.AddChild(MusicPlayer);
|
||||
|
||||
// 预创建音效播放器池
|
||||
for (var i = 0; i < MaxSoundPlayers; i++)
|
||||
{
|
||||
var soundPlayer = new AudioStreamPlayer();
|
||||
Owner.AddChild(soundPlayer);
|
||||
soundPlayer.Finished += () => OnSoundFinished(soundPlayer);
|
||||
SoundPlayers.Add(soundPlayer);
|
||||
AvailableSoundPlayers.Enqueue(soundPlayer);
|
||||
}
|
||||
|
||||
// 预创建3D音效播放器池
|
||||
for (var i = 0; i < MaxSound3DPlayers; i++)
|
||||
{
|
||||
var sound3DPlayer = new AudioStreamPlayer3D();
|
||||
Owner.AddChild(sound3DPlayer);
|
||||
sound3DPlayer.Finished += () => OnSound3DFinished(sound3DPlayer);
|
||||
Sound3DPlayers.Add(sound3DPlayer);
|
||||
AvailableSound3DPlayers.Enqueue(sound3DPlayer);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 当音效播放完成时的回调
|
||||
/// </summary>
|
||||
/// <param name="player">完成播放的音频播放器</param>
|
||||
private void OnSoundFinished(AudioStreamPlayer player)
|
||||
{
|
||||
// 将播放器放回可用队列
|
||||
AvailableSoundPlayers.Enqueue(player);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 当3D音效播放完成时的回调
|
||||
/// </summary>
|
||||
/// <param name="player">完成播放的3D音频播放器</param>
|
||||
private void OnSound3DFinished(AudioStreamPlayer3D player)
|
||||
{
|
||||
// 将播放器放回可用队列
|
||||
AvailableSound3DPlayers.Enqueue(player);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 通过资源ID播放背景音乐
|
||||
/// </summary>
|
||||
/// <param name="musicId">音乐资源ID</param>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
/// <param name="loop">是否循环播放</param>
|
||||
public virtual void PlayMusic(AssetCatalog.AssetId musicId, float volume = 1.0f, bool loop = true)
|
||||
{
|
||||
PlayMusic(musicId.Path, volume, loop);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 通过资源ID播放音效
|
||||
/// </summary>
|
||||
/// <param name="soundId">音效资源ID</param>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
/// <param name="pitch">音调调整</param>
|
||||
public virtual void PlaySound(AssetCatalog.AssetId soundId, float volume = 1.0f, float pitch = 1.0f)
|
||||
{
|
||||
PlaySound(soundId.Path, volume, pitch);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将线性音量值转换为分贝值
|
||||
/// </summary>
|
||||
/// <param name="linear">线性音量值(0-1)</param>
|
||||
/// <returns>分贝值</returns>
|
||||
protected static float LinearToDb(float linear)
|
||||
{
|
||||
return linear > 0 ? 20 * Mathf.Log(linear) : -100;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将分贝值转换为线性音量值
|
||||
/// </summary>
|
||||
/// <param name="db">分贝值</param>
|
||||
/// <returns>线性音量值(0-1)</returns>
|
||||
protected static float DbToLinear(float db)
|
||||
{
|
||||
return db > -100 ? Mathf.Exp(db / 20) : 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 系统销毁时清理资源
|
||||
/// </summary>
|
||||
protected override void OnDestroy()
|
||||
{
|
||||
// 停止并清理淡入淡出动画
|
||||
MusicFadeTween?.Kill();
|
||||
|
||||
// 清理音乐播放器
|
||||
MusicPlayer?.QueueFree();
|
||||
|
||||
// 清理音效播放器池
|
||||
foreach (var player in SoundPlayers) player.QueueFree();
|
||||
|
||||
// 清理3D音效播放器池
|
||||
foreach (var player in Sound3DPlayers) player.QueueFree();
|
||||
|
||||
SoundPlayers.Clear();
|
||||
AvailableSoundPlayers.Clear();
|
||||
Sound3DPlayers.Clear();
|
||||
AvailableSound3DPlayers.Clear();
|
||||
}
|
||||
}
|
||||
@ -1,179 +0,0 @@
|
||||
using GFramework.Core.Abstractions.system;
|
||||
using Godot;
|
||||
|
||||
namespace GFramework.Godot.system;
|
||||
|
||||
/// <summary>
|
||||
/// 音频管理器系统接口,用于统一管理背景音乐和音效的播放
|
||||
/// </summary>
|
||||
public interface IAudioManagerSystem : ISystem
|
||||
{
|
||||
/// <summary>
|
||||
/// 播放背景音乐
|
||||
/// </summary>
|
||||
/// <param name="audioPath">音频文件路径</param>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
/// <param name="loop">是否循环播放</param>
|
||||
void PlayMusic(string audioPath, float volume = 1.0f, bool loop = true);
|
||||
|
||||
/// <summary>
|
||||
/// 播放音效
|
||||
/// </summary>
|
||||
/// <param name="audioPath">音频文件路径</param>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
/// <param name="pitch">音调调整</param>
|
||||
void PlaySound(string audioPath, float volume = 1.0f, float pitch = 1.0f);
|
||||
|
||||
/// <summary>
|
||||
/// 播放特效音效
|
||||
/// </summary>
|
||||
/// <param name="audioPath">音频文件路径</param>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
/// <param name="pitch">音调调整</param>
|
||||
void PlaySfx(string audioPath, float volume = 1.0f, float pitch = 1.0f);
|
||||
|
||||
/// <summary>
|
||||
/// 播放语音
|
||||
/// </summary>
|
||||
/// <param name="audioPath">音频文件路径</param>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
/// <param name="pitch">音调调整</param>
|
||||
void PlayVoice(string audioPath, float volume = 1.0f, float pitch = 1.0f);
|
||||
|
||||
/// <summary>
|
||||
/// 播放环境音效
|
||||
/// </summary>
|
||||
/// <param name="audioPath">音频文件路径</param>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
/// <param name="pitch">音调调整</param>
|
||||
void PlayAmbient(string audioPath, float volume = 1.0f, float pitch = 1.0f);
|
||||
|
||||
/// <summary>
|
||||
/// 停止背景音乐
|
||||
/// </summary>
|
||||
void StopMusic();
|
||||
|
||||
/// <summary>
|
||||
/// 暂停背景音乐
|
||||
/// </summary>
|
||||
void PauseMusic();
|
||||
|
||||
/// <summary>
|
||||
/// 恢复背景音乐播放
|
||||
/// </summary>
|
||||
void ResumeMusic();
|
||||
|
||||
/// <summary>
|
||||
/// 设置背景音乐音量
|
||||
/// </summary>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
void SetMusicVolume(float volume);
|
||||
|
||||
/// <summary>
|
||||
/// 获取背景音乐音量
|
||||
/// </summary>
|
||||
/// <returns>音量大小,范围0-1</returns>
|
||||
float GetMusicVolume();
|
||||
|
||||
/// <summary>
|
||||
/// 设置音效音量
|
||||
/// </summary>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
void SetSoundVolume(float volume);
|
||||
|
||||
/// <summary>
|
||||
/// 获取音效音量
|
||||
/// </summary>
|
||||
/// <returns>音量大小,范围0-1</returns>
|
||||
float GetSoundVolume();
|
||||
|
||||
/// <summary>
|
||||
/// 设置特效音量
|
||||
/// </summary>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
void SetSfxVolume(float volume);
|
||||
|
||||
/// <summary>
|
||||
/// 获取特效音量
|
||||
/// </summary>
|
||||
/// <returns>音量大小,范围0-1</returns>
|
||||
float GetSfxVolume();
|
||||
|
||||
/// <summary>
|
||||
/// 设置语音音量
|
||||
/// </summary>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
void SetVoiceVolume(float volume);
|
||||
|
||||
/// <summary>
|
||||
/// 获取语音音量
|
||||
/// </summary>
|
||||
/// <returns>音量大小,范围0-1</returns>
|
||||
float GetVoiceVolume();
|
||||
|
||||
/// <summary>
|
||||
/// 设置环境音量
|
||||
/// </summary>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
void SetAmbientVolume(float volume);
|
||||
|
||||
/// <summary>
|
||||
/// 获取环境音量
|
||||
/// </summary>
|
||||
/// <returns>音量大小,范围0-1</returns>
|
||||
float GetAmbientVolume();
|
||||
|
||||
/// <summary>
|
||||
/// 设置主音量
|
||||
/// </summary>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
void SetMasterVolume(float volume);
|
||||
|
||||
/// <summary>
|
||||
/// 获取主音量
|
||||
/// </summary>
|
||||
/// <returns>音量大小,范围0-1</returns>
|
||||
float GetMasterVolume();
|
||||
|
||||
/// <summary>
|
||||
/// 检查背景音乐是否正在播放
|
||||
/// </summary>
|
||||
/// <returns>正在播放返回true,否则返回false</returns>
|
||||
bool IsMusicPlaying();
|
||||
|
||||
/// <summary>
|
||||
/// 淡入背景音乐
|
||||
/// </summary>
|
||||
/// <param name="audioPath">音频文件路径</param>
|
||||
/// <param name="duration">淡入持续时间(秒)</param>
|
||||
/// <param name="volume">目标音量</param>
|
||||
void FadeInMusic(string audioPath, float duration, float volume = 1.0f);
|
||||
|
||||
/// <summary>
|
||||
/// 淡出背景音乐
|
||||
/// </summary>
|
||||
/// <param name="duration">淡出持续时间(秒)</param>
|
||||
void FadeOutMusic(float duration);
|
||||
|
||||
/// <summary>
|
||||
/// 播放3D音效
|
||||
/// </summary>
|
||||
/// <param name="audioPath">音频文件路径</param>
|
||||
/// <param name="position">3D空间中的位置</param>
|
||||
/// <param name="volume">音量大小,范围0-1</param>
|
||||
void PlaySound3D(string audioPath, Vector3 position, float volume = 1.0f);
|
||||
|
||||
/// <summary>
|
||||
/// 设置低通滤波器强度
|
||||
/// </summary>
|
||||
/// <param name="amount">滤波器强度,范围0-1</param>
|
||||
void SetLowPassFilter(float amount);
|
||||
|
||||
/// <summary>
|
||||
/// 设置音频混响效果
|
||||
/// </summary>
|
||||
/// <param name="roomSize">房间大小</param>
|
||||
/// <param name="damping">阻尼</param>
|
||||
/// <param name="wetLevel">湿声级别</param>
|
||||
void SetReverb(float roomSize, float damping, float wetLevel);
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user