【m】 修改淡入淡出

This commit is contained in:
zhangzheng
2025-12-31 18:10:58 +08:00
parent 189c5016be
commit 2d23b1e12f
7 changed files with 91 additions and 28 deletions

View File

@@ -84,9 +84,10 @@ namespace Stary.Evo.AudioCore
UniTask FadeInMusic(AudioSource source, float fadeDuration); UniTask FadeInMusic(AudioSource source, float fadeDuration);
UniTask FadeOutMusic(AudioSource source, float fadeDuration); UniTask FadeOutMusic(AudioSource source, float fadeDuration);
void Stop(); void Stop();
void StopAll(); void StopAll();
AudioSource GetAudioSource();
} }
public abstract class AbstractAudio : IAudio public abstract class AbstractAudio : IAudio
@@ -99,6 +100,13 @@ namespace Stary.Evo.AudioCore
public abstract UniTask PlayAsync(AudioData audioData); public abstract UniTask PlayAsync(AudioData audioData);
public abstract void StopAll(); public abstract void StopAll();
public abstract AudioSource GetAudioSource();
public virtual UniTask FadeOutVoice(float fadeDuration)
{
return UniTask.CompletedTask;
}
public virtual void Stop() public virtual void Stop()
@@ -114,6 +122,7 @@ namespace Stary.Evo.AudioCore
AudioSourcePool.Creation(); AudioSourcePool.Creation();
} }
} }
/// <summary> /// <summary>
/// 音频数据初始化 /// 音频数据初始化
/// </summary> /// </summary>
@@ -126,10 +135,14 @@ namespace Stary.Evo.AudioCore
audioData.volume = 1f; audioData.volume = 1f;
} }
if (!GetType().Name.Contains("Voice"))
{
if (audioData.fadeDuration == 0) if (audioData.fadeDuration == 0)
{ {
audioData.fadeDuration = 1f; audioData.fadeDuration = 1f;
} }
}
return audioData; return audioData;
} }
@@ -181,9 +194,10 @@ namespace Stary.Evo.AudioCore
/// <param name="delay"></param> /// <param name="delay"></param>
/// <param name="onComplete"></param> /// <param name="onComplete"></param>
/// <returns></returns> /// <returns></returns>
public async UniTask PlayAudioAWait(AudioSourceToken audioSourceToken, float delay, System.Action onComplete) public async UniTask PlayAudioAWait(AudioSourceToken audioSourceToken, float delay,
System.Action onComplete, float fadeDuration = 1f)
{ {
await PlayAudioAWait(audioSourceToken, delay); await PlayAudioAWait(audioSourceToken, delay, fadeDuration);
onComplete?.Invoke(); onComplete?.Invoke();
} }
@@ -194,14 +208,14 @@ namespace Stary.Evo.AudioCore
/// <param name="delay"></param> /// <param name="delay"></param>
/// <param name="onComplete"></param> /// <param name="onComplete"></param>
/// <returns></returns> /// <returns></returns>
public async UniTask PlayAudioAWait(AudioSourceToken audioSourceToken, float delay) public async UniTask PlayAudioAWait(AudioSourceToken audioSourceToken, float delay, float fadeDuration = 1f)
{ {
Debug.Log($"PlayAudioAWait:{GetType().Name}"); Debug.Log($"PlayAudioAWait:{GetType().Name}");
if (!GetType().Name.Contains("Voice")) if (GetType().Name.Contains("Voice"))
{ {
await UniTask.Delay(TimeSpan.FromSeconds(audioSourceToken.source.clip.length - 2f), await UniTask.Delay(TimeSpan.FromSeconds(audioSourceToken.source.clip.length - fadeDuration),
cancellationToken: audioSourceToken.cancellationToken.Token); cancellationToken: audioSourceToken.cancellationToken.Token);
await FadeOutMusic(audioSourceToken.source, 2f); await FadeOutMusic(audioSourceToken.source, fadeDuration);
await UniTask.Delay(TimeSpan.FromSeconds(delay), await UniTask.Delay(TimeSpan.FromSeconds(delay),
cancellationToken: audioSourceToken.cancellationToken.Token); cancellationToken: audioSourceToken.cancellationToken.Token);
} }

View File

@@ -43,7 +43,7 @@ namespace Stary.Evo.AudioCore
public class AudioSourcePool : IAudioSourcePool public class AudioSourcePool : IAudioSourcePool
{ {
private GameObject poolObject; private Transform active;
/// <summary> /// <summary>
/// 回收对象的父物体 /// 回收对象的父物体
@@ -70,18 +70,26 @@ namespace Stary.Evo.AudioCore
public AudioSourcePool(string poolName, int poolSize) public AudioSourcePool(string poolName, int poolSize)
{ {
this.poolSize = poolSize; this.poolSize = poolSize;
poolObject = GameObject.Find(poolName); var poolObject = GameObject.Find(poolName);
if (poolObject == null) if (poolObject == null)
{ {
// 如果不存在,创建一个新对象 // 如果不存在,创建一个新对象
poolObject = new GameObject(poolName); active = new GameObject(poolName).transform;
}
else
{
active = poolObject.transform;
} }
poolObject = GameObject.Find($"recycle_{poolName}"); var recycleObject = GameObject.Find($"recycle_{poolName}");
if (poolObject == null) if (recycle == null)
{ {
// 如果不存在,创建一个新对象 // 如果不存在,创建一个新对象
poolObject = new GameObject($"recycle_{poolName}"); recycle = new GameObject($"recycle_{poolName}").transform;
}
else
{
recycle = recycleObject.transform;
} }
} }
@@ -94,7 +102,7 @@ namespace Stary.Evo.AudioCore
AudioSource source = CreatAudioSource(); AudioSource source = CreatAudioSource();
if (source == null) if (source == null)
{ {
Debug.LogErrorFormat("对象池【{0}】已达最大数量【{1}】,无法创建新对象", poolObject.name, poolSize); Debug.LogErrorFormat("对象池【{0}】已达最大数量【{1}】,无法创建新对象", active.name, poolSize);
return; return;
} }
@@ -118,7 +126,7 @@ namespace Stary.Evo.AudioCore
if (noRecycleCount > 0) if (noRecycleCount > 0)
{ {
audioSourceToken = inactivepool.Dequeue(); audioSourceToken = inactivepool.Dequeue();
audioSourceToken.source.transform.SetParent(poolObject.gameObject.transform); audioSourceToken.source.transform.parent = active;
noRecycleCount--; noRecycleCount--;
if (audioSourceToken.source == null) if (audioSourceToken.source == null)
Debug.LogErrorFormat("对象池中不存在此对象【{0}】请排查代码", audioSourceToken.source); Debug.LogErrorFormat("对象池中不存在此对象【{0}】请排查代码", audioSourceToken.source);
@@ -129,7 +137,7 @@ namespace Stary.Evo.AudioCore
var source = CreatAudioSource(); var source = CreatAudioSource();
if (source == null) if (source == null)
{ {
Debug.LogErrorFormat("对象池【{0}】已达最大数量【{1}】,无法创建新对象", poolObject.name, poolSize); Debug.LogErrorFormat("对象池【{0}】已达最大数量【{1}】,无法创建新对象", active.name, poolSize);
return null; return null;
} }
@@ -184,7 +192,7 @@ namespace Stary.Evo.AudioCore
{ {
noRecycleCount = 0; noRecycleCount = 0;
poolCount = 0; poolCount = 0;
GameObject.Destroy(poolObject); GameObject.Destroy(active.gameObject);
inactivepool.Clear(); inactivepool.Clear();
GameObject.Destroy(recycle.gameObject); GameObject.Destroy(recycle.gameObject);
for (int i = 0; i < activepool.Count; i++) for (int i = 0; i < activepool.Count; i++)
@@ -204,9 +212,9 @@ namespace Stary.Evo.AudioCore
if (poolCount >= poolSize && poolSize > 0) if (poolCount >= poolSize && poolSize > 0)
return null; return null;
poolCount++; poolCount++;
AudioSource source = new GameObject($"{poolObject.name}_{poolCount}").AddComponent<AudioSource>(); AudioSource source = new GameObject($"{active.name}_{poolCount}").AddComponent<AudioSource>();
source.gameObject.transform.SetParent(recycle); source.gameObject.transform.SetParent(recycle);
source.transform.SetParent(poolObject.transform); // 将新对象作为当前对象的子对象 source.transform.SetParent(active.transform); // 将新对象作为当前对象的子对象
source.playOnAwake = false; // 添加 AudioSource 组件并禁用自动播放 source.playOnAwake = false; // 添加 AudioSource 组件并禁用自动播放
return source; return source;
} }
@@ -228,6 +236,12 @@ namespace Stary.Evo.AudioCore
this.cancellationToken = cancellationToken; this.cancellationToken = cancellationToken;
} }
public AudioSourceToken(AudioSourceToken sourceToken)
{
this.source = sourceToken.source;
this.cancellationToken = sourceToken.cancellationToken;
}
// 添加释放方法 // 添加释放方法
public void Dispose() public void Dispose()
{ {

View File

@@ -145,6 +145,11 @@ namespace Stary.Evo.AudioCore
FadeAllMusic(); FadeAllMusic();
} }
public override AudioSource GetAudioSource()
{
return currentAudioSource;
}
/// <summary> /// <summary>
/// 关闭背景音乐 /// 关闭背景音乐
/// </summary> /// </summary>

View File

@@ -22,8 +22,7 @@ namespace Stary.Evo.AudioCore
{ {
AudioSourceToken audioSourceToken = await PlayAudio(audioData); AudioSourceToken audioSourceToken = await PlayAudio(audioData);
// 使用协程处理延迟和回调 // 使用协程处理延迟和回调
PlayAudioAWait(audioSourceToken, audioData.delayOnCompleteTime, PlayAudioAWait(audioSourceToken, audioData.delayOnCompleteTime, audioData.onComplete);
audioData.onComplete);
} }
public override async UniTask PlayAsync(AudioData audioData) public override async UniTask PlayAsync(AudioData audioData)
@@ -113,6 +112,12 @@ namespace Stary.Evo.AudioCore
AudioSourcePool.RecycleAll(); AudioSourcePool.RecycleAll();
} }
public override AudioSource GetAudioSource()
{
Debug.LogWarning("SFXPlayer: GetAudioSource is not implemented.");
return null;
}
public void Dispose() public void Dispose()
{ {
AudioSourcePool.RecycleAll(); AudioSourcePool.RecycleAll();

View File

@@ -27,7 +27,7 @@ namespace Stary.Evo.AudioCore
AudioSourceToken audioSourceToken = await PlayAudio(audioData); AudioSourceToken audioSourceToken = await PlayAudio(audioData);
// 使用协程处理延迟和回调 // 使用协程处理延迟和回调
PlayAudioAWait(audioSourceToken, PlayAudioAWait(audioSourceToken,
audioData.delayOnCompleteTime, audioData.onComplete); audioData.delayOnCompleteTime, audioData.onComplete, audioData.fadeDuration);
} }
/// <summary> /// <summary>
@@ -41,7 +41,7 @@ namespace Stary.Evo.AudioCore
public override async UniTask PlayAsync(AudioData audioData) public override async UniTask PlayAsync(AudioData audioData)
{ {
AudioSourceToken audioSourceToken = await PlayAudio(audioData); AudioSourceToken audioSourceToken = await PlayAudio(audioData);
await PlayAudioAWait(audioSourceToken, audioData.delayOnCompleteTime); await PlayAudioAWait(audioSourceToken, audioData.delayOnCompleteTime, audioData.fadeDuration);
} }
@@ -113,7 +113,7 @@ namespace Stary.Evo.AudioCore
} }
currentSource.source.Play(); currentSource.source.Play();
FadeInMusic(currentSource.source, audioData.fadeDuration);
return audioSourceToken; return audioSourceToken;
} }
@@ -137,6 +137,11 @@ namespace Stary.Evo.AudioCore
AudioSourcePool.RecycleAll(); AudioSourcePool.RecycleAll();
} }
public override AudioSource GetAudioSource()
{
return currentSource.source;
}
public void Dispose() public void Dispose()
{ {
AudioSourcePool.RecycleAll(); AudioSourcePool.RecycleAll();

View File

@@ -20,7 +20,6 @@ namespace Stary.Evo.AudioCore
Voice = new VoicePlayer(Resources); Voice = new VoicePlayer(Resources);
SFX = new SFXPlayer(Resources); SFX = new SFXPlayer(Resources);
Music = new MusicPlayer(Resources); Music = new MusicPlayer(Resources);
} }
#region #region
@@ -39,6 +38,7 @@ namespace Stary.Evo.AudioCore
Debug.LogError("AudioCoreManager: Voice is null, please initialize it first."); Debug.LogError("AudioCoreManager: Voice is null, please initialize it first.");
return; return;
} }
Voice?.Play(audioData); Voice?.Play(audioData);
} }
@@ -58,6 +58,7 @@ namespace Stary.Evo.AudioCore
Debug.LogError("AudioCoreManager: Voice is null, please initialize it first."); Debug.LogError("AudioCoreManager: Voice is null, please initialize it first.");
return UniTask.CompletedTask; return UniTask.CompletedTask;
} }
return Voice.PlayAsync(audioData); return Voice.PlayAsync(audioData);
} }
@@ -71,6 +72,20 @@ namespace Stary.Evo.AudioCore
Debug.LogError("AudioCoreManager: Voice is null, please initialize it first."); Debug.LogError("AudioCoreManager: Voice is null, please initialize it first.");
return; return;
} }
Voice.Stop();
}
/// <summary>
/// 停止当前的语音
/// </summary>
public static async UniTask FadeOutVoice(float fadeDuration)
{
if (Voice == null)
{
Debug.LogError("AudioCoreManager: Voice is null, please initialize it first.");
}
await Voice.FadeOutMusic(Voice.GetAudioSource(), fadeDuration);
Voice.Stop(); Voice.Stop();
} }
@@ -92,6 +107,7 @@ namespace Stary.Evo.AudioCore
Debug.LogError("AudioCoreManager: SFX is null, please initialize it first."); Debug.LogError("AudioCoreManager: SFX is null, please initialize it first.");
return; return;
} }
SFX.Play(audioData); SFX.Play(audioData);
} }
@@ -105,6 +121,7 @@ namespace Stary.Evo.AudioCore
Debug.LogError("AudioCoreManager: SFX is null, please initialize it first."); Debug.LogError("AudioCoreManager: SFX is null, please initialize it first.");
return; return;
} }
AudioData audioData = new AudioData(); AudioData audioData = new AudioData();
SFX.Stop(); SFX.Stop();
} }
@@ -126,6 +143,7 @@ namespace Stary.Evo.AudioCore
Debug.LogError("AudioCoreManager: Music is null, please initialize it first."); Debug.LogError("AudioCoreManager: Music is null, please initialize it first.");
return; return;
} }
Music.Play(audioData); Music.Play(audioData);
} }
@@ -142,6 +160,7 @@ namespace Stary.Evo.AudioCore
Debug.LogError("AudioCoreManager: Music is null, please initialize it first."); Debug.LogError("AudioCoreManager: Music is null, please initialize it first.");
return; return;
} }
Music.SetMusicVolume(fadeDuration, targetVolume); Music.SetMusicVolume(fadeDuration, targetVolume);
} }
@@ -157,6 +176,7 @@ namespace Stary.Evo.AudioCore
Debug.LogError("AudioCoreManager: Music is null, please initialize it first."); Debug.LogError("AudioCoreManager: Music is null, please initialize it first.");
return; return;
} }
Music.Stop(); Music.Stop();
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "com.staryevo.audiocore", "name": "com.staryevo.audiocore",
"version": "1.1.0", "version": "1.1.1",
"displayName": "04.AudioCore", "displayName": "04.AudioCore",
"description": "音频播放工具", "description": "音频播放工具",
"unity": "2021.3", "unity": "2021.3",