Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / manager / SoundManager.cs
@小李xl 小李xl on 11 Feb 2023 4 KB ai还原
  1. using System;
  2. using System.Collections.Generic;
  3. using Godot;
  4.  
  5. /// <summary>
  6. /// 音频总线 区分不同的声音 添加声音效果 目前只有背景音乐 和音效 两个bus
  7. /// </summary>
  8. public enum BUS
  9. {
  10. BGM = 0,
  11. SFX = 1
  12. }
  13.  
  14. /// <summary>
  15. /// 声音管理 背景音乐管理 音效
  16. /// </summary>
  17. public partial class SoundManager
  18. {
  19. private static Stack<AudioPlayer2D> _streamPlayer2DStack = new Stack<AudioPlayer2D>();
  20. private static Stack<AudioPlayer> _streamPlayerStack = new Stack<AudioPlayer>();
  21.  
  22. /// <summary>
  23. /// 2D音频播放节点
  24. /// </summary>
  25. private partial class AudioPlayer2D : AudioStreamPlayer2D
  26. {
  27. public override void _Ready()
  28. {
  29. Finished += OnPlayFinish;
  30. }
  31.  
  32. public void OnPlayFinish()
  33. {
  34. RecycleAudioPlayer2D(this);
  35. }
  36. }
  37.  
  38. /// <summary>
  39. /// 音频播放节点
  40. /// </summary>
  41. private partial class AudioPlayer : AudioStreamPlayer
  42. {
  43. public override void _Ready()
  44. {
  45. Finished += OnPlayFinish;
  46. }
  47.  
  48. public void OnPlayFinish()
  49. {
  50. GetParent().RemoveChild(this);
  51. Stream = null;
  52. Playing = false;
  53. RecycleAudioPlayer(this);
  54. }
  55. }
  56.  
  57. /// <summary>
  58. /// 播放声音 用于bgm
  59. /// </summary>
  60. /// <param name="soundName">bgm路径</param>
  61. /// <param name="volume">音量</param>
  62. public static AudioStreamPlayer PlayMusic(string soundName, float volume = 0.5f)
  63. {
  64. var sound = ResourceManager.Load<AudioStream>(soundName);
  65. var soundNode = GetAudioPlayerInstance();
  66. GameApplication.Instance.GlobalNodeRoot.AddChild(soundNode);
  67. soundNode.Stream = sound;
  68. soundNode.Bus = Enum.GetName(typeof(BUS), 0);
  69. soundNode.VolumeDb = volume;
  70. soundNode.Play();
  71. return soundNode;
  72. }
  73.  
  74. /// <summary>
  75. /// 添加并播放音效 用于音效
  76. /// </summary>
  77. /// <param name="soundName">音效文件路径</param>
  78. /// <param name="volume">音量</param>
  79. public static AudioStreamPlayer PlaySoundEffect(string soundName, float volume = 0.5f)
  80. {
  81. var sound = ResourceManager.Load<AudioStream>(soundName);
  82. var soundNode = GetAudioPlayerInstance();
  83. GameApplication.Instance.GlobalNodeRoot.AddChild(soundNode);
  84. soundNode.Stream = sound;
  85. soundNode.Bus = Enum.GetName(typeof(BUS), 1);
  86. soundNode.VolumeDb = volume;
  87. soundNode.Play();
  88. return soundNode;
  89. }
  90.  
  91. /// <summary>
  92. /// 在指定的节点下播放音效 用于音效
  93. /// </summary>
  94. /// <param name="soundName">音效文件路径</param>
  95. /// <param name="pos">发声节点所在全局坐标</param>
  96. /// <param name="volume">音量</param>
  97. /// <param name="target">挂载节点, 为null则挂载到房间根节点下</param>
  98. public static AudioStreamPlayer2D PlaySoundEffectPosition(string soundName, Vector2 pos, float volume = 0.5f, Node2D target = null)
  99. {
  100. var sound = ResourceManager.Load<AudioStream>(soundName);
  101. var soundNode = GetAudioPlayer2DInstance();
  102. if (target != null)
  103. {
  104. target.AddChild(soundNode);
  105. }
  106. else
  107. {
  108. GameApplication.Instance.GlobalNodeRoot.AddChild(soundNode);
  109. }
  110. soundNode.GlobalPosition = pos;
  111. soundNode.Stream = sound;
  112. soundNode.Bus = Enum.GetName(typeof(BUS), 1);
  113. soundNode.VolumeDb = volume;
  114. soundNode.Play();
  115. return soundNode;
  116. }
  117.  
  118. /// <summary>
  119. /// 获取2D音频播放节点
  120. /// </summary>
  121. private static AudioPlayer2D GetAudioPlayer2DInstance()
  122. {
  123. if (_streamPlayer2DStack.Count > 0)
  124. {
  125. return _streamPlayer2DStack.Pop();
  126. }
  127.  
  128. var inst = new AudioPlayer2D();
  129. inst.AreaMask = 0;
  130. return inst;
  131. }
  132.  
  133. /// <summary>
  134. /// 获取音频播放节点
  135. /// </summary>
  136. private static AudioPlayer GetAudioPlayerInstance()
  137. {
  138. if (_streamPlayerStack.Count > 0)
  139. {
  140. return _streamPlayerStack.Pop();
  141. }
  142.  
  143. return new AudioPlayer();
  144. }
  145.  
  146. /// <summary>
  147. /// 回收2D音频播放节点
  148. /// </summary>
  149. private static void RecycleAudioPlayer2D(AudioPlayer2D inst)
  150. {
  151. var parent = inst.GetParent();
  152. if (parent != null)
  153. {
  154. parent.RemoveChild(inst);
  155. }
  156.  
  157. inst.Stream = null;
  158. _streamPlayer2DStack.Push(inst);
  159. }
  160.  
  161. /// <summary>
  162. /// 回收音频播放节点
  163. /// </summary>
  164. private static void RecycleAudioPlayer(AudioPlayer inst)
  165. {
  166. _streamPlayerStack.Push(inst);
  167. }
  168. }