【Audio】接口移入 phxh sdk

main
马远征 2025-11-14 18:21:45 +08:00
parent 2eb6005ddb
commit 708ed62756
7 changed files with 134 additions and 277 deletions

View File

@ -275,7 +275,7 @@ public class AudioManager: Singlenton<AudioManager>, IStart, IInitable, IUpdatab
return _audioMgrObj.GetAudioByID(audioType, id);
}
public AudioPlayer GetStoryAudioInst(AudioBase.AudioType audioType = AudioBase.AudioType.Sound)
public AudioPlayer GetStoryAudioInst(PhxhSDK.AudioType audioType = PhxhSDK.AudioType.Sound)
{
return _audioMgrObj.GetStoryAudioInst(audioType);
}

View File

@ -6,9 +6,10 @@ using UnityEngine.Networking;
/// <summary>
/// 音频播放器
/// 实现 IAudioPlayer核心功能、IAudioSpatial3D音效、IAudioFade淡入淡出接口
/// 继承 AudioBase自动实现 IAudioPlayer
/// 实现 IAudioSpatial3D音效、IAudioFade淡入淡出接口
/// </summary>
public class AudioPlayer: AudioBase, IAudioPlayer, IAudioSpatial, IAudioFade
public class AudioPlayer: AudioBase, IAudioSpatial, IAudioFade
{
private float _normalizeVolume = 1f;
@ -27,7 +28,7 @@ public class AudioPlayer: AudioBase, IAudioPlayer, IAudioSpatial, IAudioFade
public bool IsSpeak => _isSpeak;
public float Volume => _audioSource.volume;
public float Volume => _audioSource?.volume ?? 0f;
// 淡入淡出效果(使用独立的效果类)
private AudioFadeEffect _fadeEffect;
@ -35,25 +36,22 @@ public class AudioPlayer: AudioBase, IAudioPlayer, IAudioSpatial, IAudioFade
// 空间音效控制器(使用独立的控制器类)
private AudioSpatialController _spatialController;
private bool _isPlayEnd
/// <summary>
/// 判断播放是否已结束
/// </summary>
private bool IsPlayEnd()
{
get
{
if (!_audioSource || !_clip)
{
return false;
}
if (_audioSource == null || _clip == null)
return false;
if (_audioSource.isPlaying)
return _audioSource.time > _clip.length;
else
return true;
}
return _audioSource.isPlaying
? _audioSource.time > _clip.length
: true;
}
#region Construct
public AudioPlayer(AudioType audioType, GameObject rootGo, GameObject posGo, AudioInfo audioInfo,
public AudioPlayer(PhxhSDK.AudioType audioType, GameObject rootGo, GameObject posGo, AudioInfo audioInfo,
bool loop = false, bool is3D = false)
{
this.audioType = audioType;
@ -119,7 +117,7 @@ public class AudioPlayer: AudioBase, IAudioPlayer, IAudioSpatial, IAudioFade
// 更新播放状态
// 检查是否应该停止(播放结束或淡出完成)
if (_isPlayEnd || shouldStop || playState == PlayState.Stopped)
if (IsPlayEnd() || shouldStop || playState == PlayState.Stopped)
{
if (playState == PlayState.Loading)
return;
@ -146,9 +144,7 @@ public class AudioPlayer: AudioBase, IAudioPlayer, IAudioSpatial, IAudioFade
_fadeEffect.Stop(); // 停止任何淡入淡出效果
targetVolume = 1f;
_audioSource.Play();
_playID = _GenPlayID();
_playTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
AudioManager.Instance.AudioMgrObj.Add2Playing(audioType, audioID, _isSpeak);
UpdatePlayInfo(); // 使用统一的更新方法
}
public void PlayWithFade(float volume = 1f)
@ -164,7 +160,7 @@ public class AudioPlayer: AudioBase, IAudioPlayer, IAudioSpatial, IAudioFade
_fadeEffect.Stop(); // 停止淡入淡出效果
AudioManager.Instance.AudioMgrObj.RemovePlaying(audioType, audioID);
if (_isPlayEnd)
if (IsPlayEnd())
{
playState = PlayState.Stopped;
return;
@ -212,8 +208,8 @@ public class AudioPlayer: AudioBase, IAudioPlayer, IAudioSpatial, IAudioFade
// 根据音频类型和是否为语音选择对应的音量系数
float typeVolume = audioType switch
{
AudioType.Music => settings.MusicVolume,
AudioType.Sound => _isSpeak ? settings.SpeakVolume : settings.SoundVolume,
PhxhSDK.AudioType.Music => settings.MusicVolume,
PhxhSDK.AudioType.Sound => _isSpeak ? settings.SpeakVolume : settings.SoundVolume,
_ => 1f
};
@ -229,72 +225,91 @@ public class AudioPlayer: AudioBase, IAudioPlayer, IAudioSpatial, IAudioFade
targetVolume = 1f;
_fadeEffect.Stop(); // 停止任何淡入淡出效果
playState = PlayState.Playing;
_playID = _GenPlayID();
AudioManager.Instance.AudioMgrObj.Add2Playing(audioType, audioID, _isSpeak);
UpdatePlayInfo(); // 使用统一的更新方法
}
/// <summary>
/// 异步加载并播放音频(不带淡入淡出)
/// </summary>
public void Play(string path)
{
playState = PlayState.Loading;
PlayAsync(path);
LoadAndPlayInternal(path, useFade: false);
}
private async void PlayAsync(string path)
/// <summary>
/// 异步加载并播放音频(带淡入淡出)
/// </summary>
public void PlayWithFade(string path, float fadeInTime = 4f, float fadeOutTime = 4f)
{
playState = PlayState.Loading;
LoadAndPlayInternal(path, useFade: true, fadeInTime, fadeOutTime);
}
/// <summary>
/// 统一的异步加载和播放逻辑(消除重复代码)
/// </summary>
private async void LoadAndPlayInternal(string path, bool useFade, float fadeInTime = 4f, float fadeOutTime = 4f)
{
// 1. 异步加载音频资源
_clip = await AssetManager.Instance.LoadAssetAsync<AudioClip>(path, null, true);
if (_loadedAssetPaths.ContainsKey(path))
{
++_loadedAssetPaths[path];
}
else
{
_loadedAssetPaths.TryAdd(path, 1);
}
if (!_clip)
// 2. 跟踪已加载的资源(用于后续卸载)
TrackLoadedAsset(path);
// 3. 加载失败处理
if (_clip == null)
{
playState = PlayState.Stopped;
return;
}
// 4. 设置AudioSource
_audioSource.clip = _clip;
_fadeEffect.Stop(); // 停止任何淡入淡出效果
targetVolume = 1f;
_playID = _GenPlayID();
AudioManager.Instance.AudioMgrObj.Add2Playing(audioType, audioID, _isSpeak);
_audioSource.Play();
playState = PlayState.Playing;
}
public async void PlayWithFade(string path, float fadeInTime = 4f, float fadeOutTime = 4f)
{
_clip = await AssetManager.Instance.LoadAssetAsync<AudioClip>(path, null, true);
if (_loadedAssetPaths.ContainsKey(path))
// 5. 根据是否需要淡入淡出设置音量
if (useFade)
{
++_loadedAssetPaths[path];
// 淡入模式从0音量开始逐渐增加
_fadeEffect.FadeInDuration = fadeInTime;
_fadeEffect.FadeOutDuration = fadeOutTime;
_fadeEffect.StartFadeIn();
_audioSource.volume = 0f;
}
else
{
_loadedAssetPaths.TryAdd(path, 1);
// 正常模式:停止淡入淡出效果
_fadeEffect.Stop();
}
if (!_clip)
{
return;
}
_audioSource.clip = _clip;
// 设置淡入淡出时长并启动淡入
_fadeEffect.FadeInDuration = fadeInTime;
_fadeEffect.FadeOutDuration = fadeOutTime;
_fadeEffect.StartFadeIn();
targetVolume = 1f;
_audioSource.volume = 0f;
playState = PlayState.Playing;
_playID = _GenPlayID();
AudioManager.Instance.AudioMgrObj.Add2Playing(audioType, audioID, _isSpeak);
// 6. 开始播放
_audioSource.Play();
playState = PlayState.Playing;
// 7. 更新播放信息并通知Manager
UpdatePlayInfo();
}
/// <summary>
/// 跟踪已加载的资源(用于引用计数)
/// </summary>
private void TrackLoadedAsset(string path)
{
if (_loadedAssetPaths.ContainsKey(path))
++_loadedAssetPaths[path];
else
_loadedAssetPaths.TryAdd(path, 1);
}
/// <summary>
/// 更新播放信息生成PlayID、时间戳、通知Manager
/// </summary>
private void UpdatePlayInfo()
{
_playID = _GenPlayID();
_playTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
AudioManager.Instance.AudioMgrObj.Add2Playing(audioType, audioID, _isSpeak);
}
/// <summary>
@ -381,54 +396,24 @@ public class AudioPlayer: AudioBase, IAudioPlayer, IAudioSpatial, IAudioFade
}
#endregion
#region Interface Implementation - Public直接实现
#region Interface Implementation
// ========================================
// 接口属性实现IAudioPlayer
// IAudioPlayer 接口实现(已在 AudioBase 中实现)
// AudioId, State, IsPlaying, Play/Pause/Resume/Stop 继承自 AudioBase
// ========================================
/// <summary>
/// IAudioPlayer.AudioId - 实例ID
/// AudioBase.SetClip 抽象方法实现IAudioPlayer 要求)
/// </summary>
public int AudioId => audioID;
/// <summary>
/// IAudioPlayer.State - 播放状态
/// </summary>
public AudioBase.PlayState State => playState;
// 注IsPlaying 继承自 AudioBase
// 注Pause/Resume/Stop 继承自 AudioBase
// ========================================
// 接口方法实现直接public无需显式实现
// ========================================
/// <summary>
/// IAudioPlayer.Play - 无参数播放调用Play(1f)
/// </summary>
public void Play() => Play(1f);
/// <summary>
/// IAudioPlayer.SetClip - 设置音频片段
/// </summary>
public void SetClip(AudioClip clip)
public override void SetClip(AudioClip clip)
{
_clip = clip;
if (_audioSource != null)
_audioSource.clip = clip;
}
/// <summary>
/// IAudioPlayer.SetVolume - 设置音量
/// </summary>
public void SetVolume(float volume) => SetTargetVolume(volume);
/// <summary>
/// IAudioPlayer.SetLoop - 设置循环
/// </summary>
public void SetLoop(bool loop) => SetIsLoop(loop);
// 注SetVolume 和 SetLoop 已在 AudioBase 中实现,无需重写
// 注IAudioSpatial 的 SetPosition 和 SetFollowTarget 已在 API 区域实现
// ========================================
@ -452,9 +437,7 @@ public class AudioPlayer: AudioBase, IAudioPlayer, IAudioSpatial, IAudioFade
playState = PlayState.Playing;
_audioSource.volume = 0f;
_audioSource.Play();
_playID = _GenPlayID();
_playTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
AudioManager.Instance.AudioMgrObj.Add2Playing(audioType, audioID, _isSpeak);
UpdatePlayInfo(); // 使用统一的更新方法
}
/// <summary>

View File

@ -227,7 +227,7 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
/// </summary>
/// <param name="audioType"></param>
/// <returns></returns>
private AudioPlayer _GetUsableAudio(AudioBase.AudioType audioType, bool isLoop, bool isSpeak = false)
private AudioPlayer _GetUsableAudio(PhxhSDK.AudioType audioType, bool isLoop, bool isSpeak = false)
{
try
{
@ -249,7 +249,7 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
return null;
}
private AudioPlayer _GetOldAudio(AudioBase.AudioType audioType, bool isLoop, bool isSpeak)
private AudioPlayer _GetOldAudio(PhxhSDK.AudioType audioType, bool isLoop, bool isSpeak)
{
var playingList = _playingLDic[GetPlayType(audioType, isSpeak)];
if (playingList.Count > 0)
@ -260,19 +260,19 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
return _CreateNewAudio(audioType, isLoop);
}
private int _GetLimit(AudioBase.AudioType audioType, bool isSpeak)
private int _GetLimit(PhxhSDK.AudioType audioType, bool isSpeak)
{
if (isSpeak)
{
return SpeakPoolLimit;
}
if (audioType == AudioBase.AudioType.Music)
if (audioType == PhxhSDK.AudioType.Music)
{
return MusicPoolLimit;
}
if (audioType == AudioBase.AudioType.Sound)
if (audioType == PhxhSDK.AudioType.Sound)
{
return SoundPoolLimit;
}
@ -280,15 +280,15 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
return -1;
}
private AudioPlayType GetPlayType(AudioBase.AudioType audioType, bool isSpeak)
private AudioPlayType GetPlayType(PhxhSDK.AudioType audioType, bool isSpeak)
{
if (isSpeak)
return AudioPlayType.Speak;
if (audioType == AudioBase.AudioType.Music)
if (audioType == PhxhSDK.AudioType.Music)
return AudioPlayType.Music;
return AudioPlayType.Sound;
}
private bool _CheckIsAudioLimited(AudioBase.AudioType audioType, bool isSpeak)
private bool _CheckIsAudioLimited(PhxhSDK.AudioType audioType, bool isSpeak)
{
var limit = _GetLimit(audioType, isSpeak);
var playingList = _playingLDic[GetPlayType(audioType, isSpeak)];
@ -300,13 +300,13 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
return false;
}
private Dictionary<int, AudioPlayer> _GetAudioDic(AudioBase.AudioType audioType, bool isLoop)
private Dictionary<int, AudioPlayer> _GetAudioDic(PhxhSDK.AudioType audioType, bool isLoop)
{
switch (audioType)
{
case AudioBase.AudioType.Music:
case PhxhSDK.AudioType.Music:
return isLoop? _musicAudioLoopDic : _musicAudioDic;
case AudioBase.AudioType.Sound:
case PhxhSDK.AudioType.Sound:
return isLoop? _soundAudioLoopDic : _soundAudioDic;
default:
{
@ -316,7 +316,7 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
}
}
private AudioPlayer _GetFreeAudio(AudioBase.AudioType audioType, bool isLoop)
private AudioPlayer _GetFreeAudio(PhxhSDK.AudioType audioType, bool isLoop)
{
var dic = _GetAudioDic(audioType, isLoop);
if (dic != null)
@ -334,7 +334,7 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
return null;
}
private AudioPlayer _CreateStoryAudio(GameObject posGo = null, AudioBase.AudioType audioType = AudioBase.AudioType.Sound)
private AudioPlayer _CreateStoryAudio(GameObject posGo = null, PhxhSDK.AudioType audioType = PhxhSDK.AudioType.Sound)
{
var rootGo = new GameObject()
{
@ -348,7 +348,7 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
return audio;
}
private AudioPlayer _CreateNewAudio(AudioBase.AudioType audioType, bool isLoop)
private AudioPlayer _CreateNewAudio(PhxhSDK.AudioType audioType, bool isLoop)
{
var rootGo = new GameObject()
{
@ -357,7 +357,7 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
rootGo.transform.SetParent(AudioRoot.transform);
var audio = new AudioPlayer(audioType, rootGo, null, new AudioInfo(), false, false);
if (audioType == AudioBase.AudioType.Music)
if (audioType == PhxhSDK.AudioType.Music)
{
rootGo.name = "music";
rootGo.name += audio.audioID;
@ -371,7 +371,7 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
_musicAudioDic.TryAdd(audio.audioID, audio);
}
}
if (audioType == AudioBase.AudioType.Sound)
if (audioType == PhxhSDK.AudioType.Sound)
{
rootGo.name = "Sound";
rootGo.name += audio.audioID;
@ -501,7 +501,7 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
var path = GetFullPath(key);
if (!isFade)
{
var audio = _GetUsableAudio(AudioBase.AudioType.Music, isLoop);
var audio = _GetUsableAudio(PhxhSDK.AudioType.Music, isLoop);
//错误打印,保护
if (audio == null)
@ -514,7 +514,7 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
audio.SetNormalizeVolume(norVol);
audio.SetFollowTarget(posObj);
audio.SetIsSpeak(false);
audio.SetTargetVolume(volume * norVol);
audio.SetVolume(volume * norVol);
audio.SetIsLoop(isLoop);
audio.Play(path);
audio.SetIsLoop(isLoop);
@ -522,11 +522,11 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
}
else
{
var audio = _GetUsableAudio(AudioBase.AudioType.Music, isLoop);
var audio = _GetUsableAudio(PhxhSDK.AudioType.Music, isLoop);
audio.SetFollowTarget(posObj);
audio.SetIsSpeak(false);
audio.Stop();
audio.SetTargetVolume(0);
audio.SetVolume(0);
audio.PlayWithFade(path, fadeTime);
audio.SetIsLoop(isLoop);
return audio.audioID;
@ -535,7 +535,7 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
private int _PlayMusic(string key, Vector3 pos, bool isLoop, bool isFade = false, float fadeTime = 0f, float volume = 1f)
{
var audio = _GetUsableAudio(AudioBase.AudioType.Music, isLoop);
var audio = _GetUsableAudio(PhxhSDK.AudioType.Music, isLoop);
var path = GetFullPath(key);
//错误打印,保护
@ -555,8 +555,8 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
audio.Stop();
if (isFade)
{
audio.SetTargetVolume(0);
audio.SetTargetVolume(volume);
audio.SetVolume(0);
audio.SetVolume(volume);
audio.PlayWithFade(path, fadeTime);
}
else
@ -595,7 +595,7 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
}
}
var audio = _GetUsableAudio(AudioBase.AudioType.Sound, isLoop);
var audio = _GetUsableAudio(PhxhSDK.AudioType.Sound, isLoop);
//错误打印,保护
if (audio == null)
@ -619,12 +619,12 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
if (isFade)
{
audio.SetTargetVolume(0);
audio.SetVolume(0);
audio.PlayWithFade(path);
}
else
{
audio.SetTargetVolume(volume * norVol);
audio.SetVolume(volume * norVol);
audio.Play(path);
}
@ -659,7 +659,7 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
}
}
var audio = _GetUsableAudio(AudioBase.AudioType.Sound, isLoop);
var audio = _GetUsableAudio(PhxhSDK.AudioType.Sound, isLoop);
//错误打印,保护
if (audio == null)
@ -680,12 +680,12 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
audio.SetIs3D(true);
if (isFade)
{
audio.SetTargetVolume(0);
audio.SetVolume(0);
audio.PlayWithFade(path, fadeTime);
}
else
{
audio.SetTargetVolume(volume * norVol);
audio.SetVolume(volume * norVol);
audio.Play(path);
}
@ -700,7 +700,7 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
return -1;
}
var audio = _GetUsableAudio(AudioBase.AudioType.Sound, false);
var audio = _GetUsableAudio(PhxhSDK.AudioType.Sound, false);
//错误打印,保护
if (audio == null)
@ -718,12 +718,12 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
if (isFade)
{
audio.SetTargetVolume(0);
audio.SetVolume(0);
audio.PlayWithFade(path, fadeTime);
}
else
{
audio.SetTargetVolume(volume * norVol);
audio.SetVolume(volume * norVol);
audio.Play(path);
}
audio.SetIsLoop(false);
@ -733,7 +733,7 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
private int _PlaySpeakSound(string key, Vector3 pos, bool isFade = false, float fadeTime = 0f, float volume = 1f)
{
var audio = _GetUsableAudio(AudioBase.AudioType.Sound, false);
var audio = _GetUsableAudio(PhxhSDK.AudioType.Sound, false);
var path = GetFullPath(key, true);
var norVol = _GetNormalizeVolume(key);
audio.SetNormalizeVolume(norVol);
@ -741,12 +741,12 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
audio.SetIsSpeak(true);
if (isFade)
{
audio.SetTargetVolume(0);
audio.SetVolume(0);
audio.PlayWithFade(path, fadeTime);
}
else
{
audio.SetTargetVolume(volume * norVol);
audio.SetVolume(volume * norVol);
audio.Play(path);
}
audio.SetIsLoop(false);
@ -1062,7 +1062,7 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
}
}
public AudioPlayer GetStoryAudioInst(AudioBase.AudioType audioType)
public AudioPlayer GetStoryAudioInst(PhxhSDK.AudioType audioType)
{
return _CreateStoryAudio(null, audioType);
}
@ -1100,7 +1100,7 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
if (_allAudioDic.TryGetValue(audioID, out var audio))
{
var fullPath = GetFullPath(key);
audio.SetTargetVolume(targetVolume);
audio.SetVolume(targetVolume);
audio.PlayWithFade(fullPath, fadeInTime);
}
}
@ -1179,10 +1179,10 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
AudioPlayer.ReleaseLoadedAssets();
}
public void Add2Playing(AudioBase.AudioType audioType, int id, bool isSpeak = false)
public void Add2Playing(PhxhSDK.AudioType audioType, int id, bool isSpeak = false)
{
AudioPlayType type;
if (audioType == AudioBase.AudioType.Music)
if (audioType == PhxhSDK.AudioType.Music)
{
type = AudioPlayType.Music;
}
@ -1202,10 +1202,10 @@ public class AudioUnityManager: Singlenton<AudioUnityManager>, IStart, IInitable
}
}
public void RemovePlaying(AudioBase.AudioType audioType, int id, bool isSpeak = false)
public void RemovePlaying(PhxhSDK.AudioType audioType, int id, bool isSpeak = false)
{
AudioPlayType type;
if (audioType == AudioBase.AudioType.Music)
if (audioType == PhxhSDK.AudioType.Music)
{
type = AudioPlayType.Music;
}

View File

@ -1,115 +0,0 @@
using UnityEngine;
using PhxhSDK;
/// <summary>
/// 音频播放器核心接口(简化版)
/// 包含最常用的功能约占80%的使用场景
/// 职责:播放控制、状态查询、音量和循环设置
/// </summary>
public interface IAudioPlayer
{
#region Identity
/// <summary>
/// AudioPlayer实例ID标识对象池中的实例
/// </summary>
int AudioId { get; }
#endregion
#region Playback Control
/// <summary>
/// 播放音频需要先SetClip
/// </summary>
void Play();
/// <summary>
/// 暂停播放
/// </summary>
void Pause();
/// <summary>
/// 恢复播放
/// </summary>
void Resume();
/// <summary>
/// 停止播放
/// </summary>
void Stop();
#endregion
#region State Queries
/// <summary>
/// 是否正在播放
/// </summary>
bool IsPlaying { get; }
/// <summary>
/// 当前播放状态用于switch判断
/// </summary>
AudioBase.PlayState State { get; }
#endregion
#region Basic Configuration
/// <summary>
/// 设置音频片段
/// </summary>
void SetClip(AudioClip clip);
/// <summary>
/// 设置音量0-1
/// </summary>
void SetVolume(float volume);
/// <summary>
/// 设置是否循环播放
/// </summary>
void SetLoop(bool loop);
#endregion
}
/// <summary>
/// 3D空间音效接口可选功能
/// 用于需要空间定位的音效,如脚步声、枪声、环境音等
/// </summary>
public interface IAudioSpatial
{
/// <summary>
/// 设置静态位置自动启用3D
/// </summary>
/// <param name="position">世界坐标位置</param>
void SetPosition(Vector3 position);
/// <summary>
/// 设置跟随目标自动启用3D传null停止跟随并禁用3D
/// </summary>
/// <param name="target">跟随的GameObject</param>
void SetFollowTarget(GameObject target);
}
/// <summary>
/// 淡入淡出效果接口(可选功能)
/// 用于需要平滑音量过渡的BGM、环境音等
/// </summary>
public interface IAudioFade
{
/// <summary>
/// 淡入播放会自动调用Play
/// </summary>
/// <param name="duration">淡入时长(秒)</param>
void PlayWithFadeIn(float duration);
/// <summary>
/// 淡出停止淡出完成后自动调用Stop
/// </summary>
/// <param name="duration">淡出时长(秒)</param>
void StopWithFadeOut(float duration);
}

View File

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: d389c62d6c7a4423c84546dcd2acfd6b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

@ -1 +1 @@
Subproject commit 0ae2bb713f4d0548deee9c8e6b0111467b142b31
Subproject commit 25e73caa9903fb5efe32a1ab1f6fcd5058679764