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

View File

@@ -2,28 +2,81 @@ using System.Collections;
using System.Collections.Generic;
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
{
void Play(AudioClip audioClip,float volume, System.Action onComplete, float delay);
void Play(AudioData audioData);
void Stop();
void Stop(float delay);
void EndOperation(System.Action onComplete, float delay);
void Set3DPosition(Vector3 vector3);
void Stop(AudioData audioData);
}
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);
public abstract void EndOperation(System.Action onComplete, float delay);
public abstract void Set3DPosition(Vector3 vector3);
/// <summary>
/// 音频数据初始化
/// </summary>
/// <param name="audioData"></param>
/// <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 UnityEngine;
public class MusicPlayer
public class MusicPlayer : AbstractAudio
{
private AudioSourcePool audioSourcePool;
private AudioSource audioSource1;
@@ -16,30 +16,29 @@ public class MusicPlayer
/// <summary>
/// 播放背景音乐
/// </summary>
/// <param name="clip">音频</param>
/// <param name="volume">音量</param>
/// <param name="fadeDuration">自然过渡时间</param>
public void Play(AudioClip clip, float volume, float fadeDuration)
/// <param name="audioData">{[clip:音频], [volume:音量], [fadeDuration:自然过渡时间]}</param>
public override void Play(AudioData audioData)
{
audioData = AudioDataInitialize(audioData);
if (audioSource1 == null)
{
audioSource1 = audioSourcePool.GetAudioSource("Music");
audioSource1.clip = clip;
audioSource1.volume = volume;
audioSource1.clip = audioData.clip;
audioSource1.volume = audioData.volume;
currentAudioSource = audioSource1;
currentAudioSource.Play();
CoroutineHelper.StartCoroutine(FadeMusic(audioSource1, fadeDuration, audioSource2));
CoroutineHelper.StartCoroutine(FadeMusic(audioSource1, audioData.fadeDuration, audioSource2));
}
else
{
if (audioSource2 == null)
{
audioSource2 = audioSourcePool.GetAudioSource("Music");
audioSource2.clip = clip;
audioSource2.volume = volume;
audioSource2.clip = audioData.clip;
audioSource2.volume = audioData.volume;
currentAudioSource = audioSource2;
currentAudioSource.Play();
CoroutineHelper.StartCoroutine(FadeMusic(audioSource2, fadeDuration, audioSource1));
CoroutineHelper.StartCoroutine(FadeMusic(audioSource2, audioData.fadeDuration, audioSource1));
}
else
{
@@ -52,10 +51,11 @@ public class MusicPlayer
/// <summary>
/// 关闭背景音乐
/// </summary>
/// <param name="fadeDuration">关闭时的自然过渡时间</param>
public void Stop(float fadeDuration)
/// <param name="audioData">{[fadeDuration:自然过渡时间]}</param>
public override void Stop(AudioData audioData)
{
CoroutineHelper.StartCoroutine(FadeOutMusic(currentAudioSource, fadeDuration));
audioData = AudioDataInitialize(audioData);
CoroutineHelper.StartCoroutine(FadeOutMusic(currentAudioSource, audioData.fadeDuration));
}
/// <summary>

View File

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

View File

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

View File

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