using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
namespace Stary.Evo.AudioCore
{
///
/// Audio数据
///
public struct AudioData
{
///
/// 延迟播放时间
///
public float delayTime;
///
/// 资源包名
///
public string packageName;
///
/// 资源名
///
public string assetName;
///
/// 音频
///
public AudioClip clip;
///
/// 音量
///
public float volume;
///
/// 回调行为
///
public System.Action onComplete;
///
/// 延迟回调执行的时间
///
public float delayOnCompleteTime;
///
/// 自然过渡时间
///
public float fadeDuration;
///
/// 是否不打断上一段对话
///
public bool isNotOverVoice;
///
/// 是否是3D音频
///
public bool is3DAudio;
///
/// 3D声音位置
///
public Vector3 audio3DPosition;
///
/// 3D声音最大距离
///
public float audio3DMaxDistance;
}
public interface IAudio
{
IResources Resources { get; set; }
AudioSourcePool AudioSourcePool { get; set; }
AudioData Initialize(AudioData audioData);
void Play(AudioData audioData);
UniTask PlayAsync(AudioData audioData);
UniTask FadeInMusic(AudioSource source, float fadeDuration);
UniTask FadeOutMusic(AudioSource source, float fadeDuration);
void Stop();
void StopAll();
}
public abstract class AbstractAudio : IAudio
{
public IResources Resources { get; set; }
public AudioSourcePool AudioSourcePool { get; set; }
public abstract void Play(AudioData audioData);
public abstract UniTask PlayAsync(AudioData audioData);
public abstract void StopAll();
public virtual void Stop()
{
}
protected AbstractAudio(IResources resources)
{
Resources = resources;
if (!GetType().Name.Contains("Music"))
{
AudioSourcePool = new AudioSourcePool(GetType().Name, -1);
AudioSourcePool.Creation();
}
}
///
/// 音频数据初始化
///
///
///
public virtual AudioData Initialize(AudioData audioData)
{
if (audioData.volume == 0)
{
audioData.volume = 1f;
}
if (audioData.fadeDuration == 0)
{
audioData.fadeDuration = 1f;
}
return audioData;
}
///
/// 音频淡入
///
///
///
///
public async UniTask FadeInMusic(AudioSource source, float fadeDuration)
{
float targetVolume = source.volume;
source.volume = 0;
while (source.volume < targetVolume)
{
source.volume += targetVolume * Time.deltaTime / fadeDuration;
await UniTask.Yield();
}
}
///
/// 音频淡出
///
///
///
///
public async UniTask FadeOutMusic(AudioSource source, float fadeDuration)
{
if (source != null)
{
float startVolume = source.volume;
while (source.volume > 0)
{
source.volume -= startVolume * Time.deltaTime / fadeDuration;
await UniTask.Yield();
}
source.Stop();
}
}
///
/// 播放音效的协程
///
///
///
///
///
public async UniTask PlayAudioAWait(AudioSourceToken audioSourceToken, float delay, System.Action onComplete)
{
await PlayAudioAWait(audioSourceToken, delay);
onComplete?.Invoke();
}
///
/// 播放音效的协程
///
///
///
///
///
public async UniTask PlayAudioAWait(AudioSourceToken audioSourceToken, float delay)
{
Debug.Log($"PlayAudioAWait:{GetType().Name}");
if (!GetType().Name.Contains("Voice"))
{
await UniTask.Delay(TimeSpan.FromSeconds(audioSourceToken.source.clip.length - 2f),
cancellationToken: audioSourceToken.cancellationToken.Token);
await FadeOutMusic(audioSourceToken.source, 2f);
await UniTask.Delay(TimeSpan.FromSeconds(delay),
cancellationToken: audioSourceToken.cancellationToken.Token);
}
else
{
await UniTask.Delay(TimeSpan.FromSeconds(audioSourceToken.source.clip.length + delay),
cancellationToken: audioSourceToken.cancellationToken.Token);
}
AudioSourcePool.RecycleSpawn(audioSourceToken);
}
}
}