This commit is contained in:
zhangzheng
2025-12-31 15:56:05 +08:00
parent f154e98620
commit 189c5016be
15 changed files with 694 additions and 495 deletions

View File

@@ -1,6 +1,8 @@
using System.Collections;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
namespace Stary.Evo.AudioCore
@@ -15,6 +17,16 @@ namespace Stary.Evo.AudioCore
/// </summary>
public float delayTime;
/// <summary>
/// 资源包名
/// </summary>
public string packageName;
/// <summary>
/// 资源名
/// </summary>
public string assetName;
/// <summary>
/// 音频
/// </summary>
@@ -44,7 +56,7 @@ namespace Stary.Evo.AudioCore
/// 是否不打断上一段对话
/// </summary>
public bool isNotOverVoice;
/// <summary>
/// 是否是3D音频
/// </summary>
@@ -54,41 +66,60 @@ namespace Stary.Evo.AudioCore
/// 3D声音位置
/// </summary>
public Vector3 audio3DPosition;
/// <summary>
/// 3D声音最大距离
/// </summary>
public float audio3DMaxDistance;
/// <summary>
/// 异步取消令牌
/// </summary>
public CancellationToken cancellationToken;
public float audio3DMaxDistance;
}
public interface IAudio
{
IResources Resources { get; set; }
AudioSourcePool AudioSourcePool { get; set; }
AudioData Initialize(AudioData audioData);
void Play(AudioData audioData);
void Stop(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 virtual void Stop(AudioData audioData){}
public abstract UniTask PlayAsync(AudioData audioData);
public virtual void Stop(){}
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();
}
}
/// <summary>
/// 音频数据初始化
/// </summary>
/// <param name="audioData"></param>
/// <returns></returns>
public virtual AudioData AudioDataInitialize(AudioData audioData)
public virtual AudioData Initialize(AudioData audioData)
{
if (audioData.volume == 0)
{
@@ -99,7 +130,88 @@ namespace Stary.Evo.AudioCore
{
audioData.fadeDuration = 1f;
}
return audioData;
}
/// <summary>
/// 音频淡入
/// </summary>
/// <param name="source"></param>
/// <param name="fadeDuration"></param>
/// <returns></returns>
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();
}
}
/// <summary>
/// 音频淡出
/// </summary>
/// <param name="source"></param>
/// <param name="fadeDuration"></param>
/// <returns></returns>
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();
}
}
/// <summary>
/// 播放音效的协程
/// </summary>
/// <param name="source"></param>
/// <param name="delay"></param>
/// <param name="onComplete"></param>
/// <returns></returns>
public async UniTask PlayAudioAWait(AudioSourceToken audioSourceToken, float delay, System.Action onComplete)
{
await PlayAudioAWait(audioSourceToken, delay);
onComplete?.Invoke();
}
/// <summary>
/// 播放音效的协程
/// </summary>
/// <param name="source"></param>
/// <param name="delay"></param>
/// <param name="onComplete"></param>
/// <returns></returns>
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);
}
}
}
}

View File

@@ -0,0 +1,15 @@
using Cysharp.Threading.Tasks;
using UnityEngine;
namespace Stary.Evo.AudioCore
{
public interface IResources
{
/// <summary>
/// 加载音频资源
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
UniTask<T> LoadAssetAsync<T>(string packageName, string assetName) where T : Object;
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 376ffa6a0d374fe69c2c2e30f0f6d244
timeCreated: 1767163427