添加struct管理AudioData

This commit is contained in:
Han
2025-03-07 17:52:50 +08:00
parent 186a9da66c
commit 63b6601fbe
6 changed files with 131 additions and 101 deletions

View File

@@ -22,24 +22,11 @@ public static class AudioCoreManager
/// <summary> /// <summary>
/// 播放语音 /// 播放语音
/// </summary> /// </summary>
/// <param name="clip">音频</param> /// <param name="audioData">{[clip:音频], [volume:音量],
/// <param name="onComplete">结束行为</param> /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]}</param>
/// <param name="delay">结束行为延迟执行时间</param> public static void PlayVoice(AudioData audioData)
public static void PlayVoice(AudioClip clip, System.Action onComplete, float delay = 0f)
{ {
Voice.Play(clip, 1f, onComplete, delay); Voice.Play(audioData);
}
/// <summary>
/// 播放语音
/// </summary>
/// <param name="clip">音频</param>
/// <param name="volume">音量</param>
/// <param name="onComplete">结束行为</param>
/// <param name="delay">结束行为延迟执行时间</param>
public static void PlayVoice(AudioClip clip, float volume = 1f, System.Action onComplete = null, float delay = 0f)
{
Voice.Play(clip, volume, onComplete, delay);
} }
/// <summary> /// <summary>
@@ -47,7 +34,8 @@ public static class AudioCoreManager
/// </summary> /// </summary>
public static void StopVoice() public static void StopVoice()
{ {
Voice.Stop(); AudioData audioData = new AudioData();
Voice.Stop(audioData);
} }
#endregion #endregion
@@ -57,24 +45,11 @@ public static class AudioCoreManager
/// <summary> /// <summary>
/// 播放音效 /// 播放音效
/// </summary> /// </summary>
/// <param name="clip">音频</param> /// <param name="audioData">{[clip:音频], [volume:音量],
/// <param name="onComplete">结束行为</param> /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]}</param>
/// <param name="delay">结束行为延迟执行时间</param> public static void PlaySFX(AudioData audioData)
public static void PlaySFX(AudioClip clip, System.Action onComplete, float delay = 0f)
{ {
SFX.Play(clip, 1f, onComplete, delay); SFX.Play(audioData);
}
/// <summary>
/// 播放音效
/// </summary>
/// <param name="clip">音频</param>
/// <param name="volume">音量</param>
/// <param name="onComplete">结束行为</param>
/// <param name="delay">结束行为延迟执行时间</param>
public static void PlaySFX(AudioClip clip, float volume = 1f, System.Action onComplete = null, float delay = 0f)
{
SFX.Play(clip, volume, onComplete, delay);
} }
/// <summary> /// <summary>
@@ -82,7 +57,8 @@ public static class AudioCoreManager
/// </summary> /// </summary>
public static void StopAllSFX() public static void StopAllSFX()
{ {
SFX.Stop(); AudioData audioData = new AudioData();
SFX.Stop(audioData);
} }
#endregion #endregion
@@ -92,21 +68,21 @@ public static class AudioCoreManager
/// <summary> /// <summary>
/// 播放背景音乐 /// 播放背景音乐
/// </summary> /// </summary>
/// <param name="clip">音频</param> /// <param name="audioData">{[clip:音频], [volume:音量], [fadeDuration:自然过渡时间]}</param>
/// <param name="volume">音量</param> public static void PlayMusic(AudioData audioData)
/// <param name="fadeDuration">自然过渡时间</param>
public static void PlayMusic(AudioClip clip, float volume = 1f, float fadeDuration = 1f)
{ {
Music.Play(clip, volume, fadeDuration); Music.Play(audioData);
} }
/// <summary> /// <summary>
/// 停止播放背景音乐 /// 停止播放背景音乐
/// </summary> /// </summary>
/// <param name="fadeDuration">自然过渡时间</param> /// <param name="fadeDuration">自然过渡时间</param>
public static void StopMusic(float fadeDuration = 1f) public static void StopMusic(float fadeDuration = 1f)
{ {
Music.Stop(fadeDuration); AudioData audioData = new AudioData();
audioData.fadeDuration = fadeDuration;
Music.Stop(audioData);
} }
#endregion #endregion

View File

@@ -2,28 +2,81 @@ using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
/// <summary>
/// Audio数据
/// </summary>
public struct AudioData
{
/// <summary>
/// 延迟播放时间
/// </summary>
public float delayTime;
/// <summary>
/// 音频
/// </summary>
public AudioClip clip;
/// <summary>
/// 音量
/// </summary>
public float volume;
/// <summary>
/// 回调行为
/// </summary>
public System.Action onComplete;
/// <summary>
/// 延迟回调执行的时间
/// </summary>
public float delayOnCompleteTime;
/// <summary>
/// 自然过渡时间
/// </summary>
public float fadeDuration;
/// <summary>
/// 是否不打断上一段对话
/// </summary>
public bool isNotOverVoice;
/// <summary>
/// 是否是3D声音
/// </summary>
public bool is3D;
/// <summary>
/// 3D声音载体
/// </summary>
public GameObject soundObject;
}
public interface IAudio public interface IAudio
{ {
void Play(AudioClip audioClip,float volume, System.Action onComplete, float delay); void Play(AudioData audioData);
void Stop(); void Stop(AudioData audioData);
void Stop(float delay);
void EndOperation(System.Action onComplete, float delay);
void Set3DPosition(Vector3 vector3);
} }
public abstract class AbstractAudio : IAudio public abstract class AbstractAudio : IAudio
{ {
public abstract void Play(AudioClip audioClip, float volume, System.Action onComplete, float delay); public abstract void Play(AudioData audioData);
public abstract void Stop(); public abstract void Stop(AudioData audioData);
public abstract void Stop(float delay); /// <summary>
/// 音频数据初始化
public abstract void EndOperation(System.Action onComplete, float delay); /// </summary>
/// <param name="audioData"></param>
public abstract void Set3DPosition(Vector3 vector3); /// <returns></returns>
public virtual AudioData AudioDataInitialize(AudioData audioData)
{
if(audioData.volume == 0)
{
audioData.volume = 1f;
}
return audioData;
}
} }

View File

@@ -1,7 +1,7 @@
using System.Collections; using System.Collections;
using UnityEngine; using UnityEngine;
public class MusicPlayer public class MusicPlayer : AbstractAudio
{ {
private AudioSourcePool audioSourcePool; private AudioSourcePool audioSourcePool;
private AudioSource audioSource1; private AudioSource audioSource1;
@@ -16,30 +16,29 @@ public class MusicPlayer
/// <summary> /// <summary>
/// 播放背景音乐 /// 播放背景音乐
/// </summary> /// </summary>
/// <param name="clip">音频</param> /// <param name="audioData">{[clip:音频], [volume:音量], [fadeDuration:自然过渡时间]}</param>
/// <param name="volume">音量</param> public override void Play(AudioData audioData)
/// <param name="fadeDuration">自然过渡时间</param>
public void Play(AudioClip clip, float volume, float fadeDuration)
{ {
if(audioSource1 == null) audioData = AudioDataInitialize(audioData);
if (audioSource1 == null)
{ {
audioSource1 = audioSourcePool.GetAudioSource("Music"); audioSource1 = audioSourcePool.GetAudioSource("Music");
audioSource1.clip = clip; audioSource1.clip = audioData.clip;
audioSource1.volume = volume; audioSource1.volume = audioData.volume;
currentAudioSource = audioSource1; currentAudioSource = audioSource1;
currentAudioSource.Play(); currentAudioSource.Play();
CoroutineHelper.StartCoroutine(FadeMusic(audioSource1, fadeDuration, audioSource2)); CoroutineHelper.StartCoroutine(FadeMusic(audioSource1, audioData.fadeDuration, audioSource2));
} }
else else
{ {
if (audioSource2 == null) if (audioSource2 == null)
{ {
audioSource2 = audioSourcePool.GetAudioSource("Music"); audioSource2 = audioSourcePool.GetAudioSource("Music");
audioSource2.clip = clip; audioSource2.clip = audioData.clip;
audioSource2.volume = volume; audioSource2.volume = audioData.volume;
currentAudioSource = audioSource2; currentAudioSource = audioSource2;
currentAudioSource.Play(); currentAudioSource.Play();
CoroutineHelper.StartCoroutine(FadeMusic(audioSource2, fadeDuration, audioSource1)); CoroutineHelper.StartCoroutine(FadeMusic(audioSource2, audioData.fadeDuration, audioSource1));
} }
else else
{ {
@@ -52,10 +51,11 @@ public class MusicPlayer
/// <summary> /// <summary>
/// 关闭背景音乐 /// 关闭背景音乐
/// </summary> /// </summary>
/// <param name="fadeDuration">关闭时的自然过渡时间</param> /// <param name="audioData">{[fadeDuration:自然过渡时间]}</param>
public void Stop(float fadeDuration) public override void Stop(AudioData audioData)
{ {
CoroutineHelper.StartCoroutine(FadeOutMusic(currentAudioSource, fadeDuration)); audioData = AudioDataInitialize(audioData);
CoroutineHelper.StartCoroutine(FadeOutMusic(currentAudioSource, audioData.fadeDuration));
} }
/// <summary> /// <summary>

View File

@@ -2,7 +2,7 @@ using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
public class SFXPlayer public class SFXPlayer : AbstractAudio
{ {
private AudioSourcePool audioSourcePool; private AudioSourcePool audioSourcePool;
private List<AudioSource> activeSources = new List<AudioSource>(); // 正在播放的 AudioSource 列表 private List<AudioSource> activeSources = new List<AudioSource>(); // 正在播放的 AudioSource 列表
@@ -15,30 +15,29 @@ public class SFXPlayer
/// <summary> /// <summary>
/// 播放音效 /// 播放音效
/// </summary> /// </summary>
/// <param name="clip">音频</param> /// <param name="audioData">{[clip:音频], [volume:音量],
/// <param name="volume">音量</param> /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]}</param>
/// <param name="onComplete">结束行为</param> public override void Play(AudioData audioData)
/// <param name="delay">延迟结束行为时间</param>
public void Play(AudioClip clip, float volume = 1f, System.Action onComplete = null, float delay = 0f)
{ {
AudioSource source = audioSourcePool.GetAudioSource("SFX"); AudioSource source = audioSourcePool.GetAudioSource("SFX");
if (source == null) return; if (source == null) return;
source.clip = clip; source.clip = audioData.clip;
source.volume = volume; source.volume = audioData.volume;
source.Play(); source.Play();
// 将 AudioSource 加入活动列表 // 将 AudioSource 加入活动列表
activeSources.Add(source); activeSources.Add(source);
// 使用协程处理延迟和回调 // 使用协程处理延迟和回调
CoroutineHelper.StartCoroutine(PlaySFXCoroutine(source, delay, onComplete)); CoroutineHelper.StartCoroutine(PlaySFXCoroutine(source, audioData.delayOnCompleteTime, audioData.onComplete));
} }
/// <summary> /// <summary>
/// 停止所有音效 /// 停止所有音效
/// </summary> /// </summary>
public void Stop() /// <param name="audioData">{[无可使用变量]}</param>
public override void Stop(AudioData audioData)
{ {
foreach (var source in activeSources) foreach (var source in activeSources)
{ {

View File

@@ -21,27 +21,27 @@ public class Test : MonoBehaviour
{ {
if (Input.GetKeyDown(KeyCode.A)) if (Input.GetKeyDown(KeyCode.A))
{ {
AudioCoreManager.PlayVoice(clip1); AudioCoreManager.PlayVoice(new AudioData { clip = clip1 });
} }
if (Input.GetKeyDown(KeyCode.S)) if (Input.GetKeyDown(KeyCode.S))
{ {
AudioCoreManager.PlayVoice(clip2); AudioCoreManager.PlayVoice(new AudioData { clip = clip2 });
} }
if (Input.GetKeyDown(KeyCode.D)) if (Input.GetKeyDown(KeyCode.D))
{ {
AudioCoreManager.PlaySFX(clip21); AudioCoreManager.PlaySFX(new AudioData { clip = clip21 });
} }
if (Input.GetKeyDown(KeyCode.F)) if (Input.GetKeyDown(KeyCode.F))
{ {
AudioCoreManager.PlaySFX(clip22); AudioCoreManager.PlaySFX(new AudioData { clip = clip22 });
} }
if (Input.GetKeyDown(KeyCode.G)) if (Input.GetKeyDown(KeyCode.G))
{ {
AudioCoreManager.PlayMusic(clip31); AudioCoreManager.PlayMusic(new AudioData { clip = clip31 });
} }
if (Input.GetKeyDown(KeyCode.H)) if (Input.GetKeyDown(KeyCode.H))
{ {
AudioCoreManager.PlayMusic(clip32); AudioCoreManager.PlayMusic(new AudioData { clip = clip32 });
} }
if (Input.GetKeyDown(KeyCode.Z)) if (Input.GetKeyDown(KeyCode.Z))
{ {

View File

@@ -1,7 +1,7 @@
using System.Collections; using System.Collections;
using UnityEngine; using UnityEngine;
public class VoicePlayer public class VoicePlayer : AbstractAudio
{ {
private AudioSourcePool audioSourcePool; private AudioSourcePool audioSourcePool;
private AudioSource currentSource; private AudioSource currentSource;
@@ -15,15 +15,16 @@ public class VoicePlayer
/// <summary> /// <summary>
/// 播放语音 /// 播放语音
/// </summary> /// </summary>
/// <param name="clip">音频</param> /// <param name="audioData">{[clip:音频], [volume:音量],
/// <param name="volume">音量</param> /// [onComplete:回调行为], [delayOnCompleteTime:延迟回调执行的时间]}</param>
/// <param name="onComplete">结束行为</param> public override void Play(AudioData audioData)
/// <param name="delayOnComplete">延迟结束行为时间</param>
public void Play(AudioClip clip, float volume = 1f, System.Action onComplete = null, float delayOnComplete = 0f)
{ {
// 停止当前正在播放的语音与旧协程 // 停止当前正在播放的语音与旧协程
Stop(); Stop(new AudioData { });
if(myCoroutine!= null)
audioData = AudioDataInitialize(audioData);
if (myCoroutine!= null)
{ {
CoroutineHelper.StopCoroutine(myCoroutine); CoroutineHelper.StopCoroutine(myCoroutine);
myCoroutine = null; myCoroutine = null;
@@ -31,18 +32,19 @@ public class VoicePlayer
currentSource = audioSourcePool.GetAudioSource("Voice"); currentSource = audioSourcePool.GetAudioSource("Voice");
if (currentSource == null) return; if (currentSource == null) return;
currentSource.clip = clip; currentSource.clip = audioData.clip;
currentSource.volume = volume; currentSource.volume = audioData.volume;
currentSource.Play(); currentSource.Play();
// 使用协程处理延迟和回调 // 使用协程处理延迟和回调
myCoroutine = CoroutineHelper.StartCoroutine(PlayVoiceCoroutine(currentSource, delayOnComplete, onComplete)); myCoroutine = CoroutineHelper.StartCoroutine(PlayVoiceCoroutine(currentSource, audioData.delayOnCompleteTime, audioData.onComplete));
} }
/// <summary> /// <summary>
/// 停止语音 /// 停止语音
/// </summary> /// </summary>
public void Stop() /// /// <param name="audioData">{[无可使用变量]}</param>
public override void Stop(AudioData audioData)
{ {
if (currentSource != null && currentSource.isPlaying) if (currentSource != null && currentSource.isPlaying)
{ {