2023-10-24 18:53:34 +08:00
|
|
|
|
using System;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
using Framework;
|
|
|
|
|
|
using System.Collections.Generic;
|
2023-10-19 15:00:19 +08:00
|
|
|
|
using CriWare;
|
|
|
|
|
|
using CriWare.Assets;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
using Cysharp.Threading.Tasks;
|
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
using UnityEngine.SceneManagement;
|
|
|
|
|
|
using Object = UnityEngine.Object;
|
|
|
|
|
|
|
|
|
|
|
|
public enum AudioType
|
|
|
|
|
|
{
|
|
|
|
|
|
MUSIC,
|
|
|
|
|
|
SOUND
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-21 11:55:23 +08:00
|
|
|
|
namespace PhxhSDK
|
|
|
|
|
|
{
|
|
|
|
|
|
public class AudioManager : Singlenton<AudioManager>, IStart, IInitable, IUpdatable
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
|
|
|
|
|
public GameObject initGameObject;
|
2023-10-21 11:55:23 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public enum ClipType
|
|
|
|
|
|
{
|
|
|
|
|
|
AudioClip,
|
|
|
|
|
|
CriwareClip
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public ClipType curClipType;
|
|
|
|
|
|
|
|
|
|
|
|
protected float vol = 1f;
|
|
|
|
|
|
protected float musicVol = 1f;
|
|
|
|
|
|
protected float soundsVol = 1f;
|
|
|
|
|
|
|
|
|
|
|
|
protected Dictionary<int, Audio> musicAudio;
|
|
|
|
|
|
protected Dictionary<int, Audio> soundsAudio;
|
2023-10-19 15:00:19 +08:00
|
|
|
|
protected Dictionary<string, int> loadingAcb;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
protected static int SOUNDS_POOL_MAX_NUM = 50;
|
|
|
|
|
|
protected static int MUSIC_POOL_MAX_NUM = 10;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
|
|
|
|
|
protected bool banMusic = false;
|
|
|
|
|
|
protected bool banSound = false;
|
|
|
|
|
|
|
|
|
|
|
|
protected bool initialized = false;
|
|
|
|
|
|
|
|
|
|
|
|
protected List<int> _toBeRemoved = new List<int>();
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
private GameObject _criError;
|
|
|
|
|
|
private GameObject _criAtomGo;
|
|
|
|
|
|
|
|
|
|
|
|
private static Queue<Audio> _freeMusicAudio;
|
|
|
|
|
|
private static Queue<Audio> _freeSoundsAudio;
|
2023-10-24 18:53:34 +08:00
|
|
|
|
|
|
|
|
|
|
public CriAtomExOutputAnalyzer analyzer=null;
|
|
|
|
|
|
public bool IsAnalyzer = false;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public void Start()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (initGameObject == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
// Need to create a new GameObject to attach the singleton to.
|
2023-10-19 15:00:19 +08:00
|
|
|
|
curClipType = ClipType.CriwareClip;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
|
|
|
|
|
initGameObject = new GameObject();
|
|
|
|
|
|
initGameObject.name = "Audio(Singleton)";
|
2023-10-19 15:00:19 +08:00
|
|
|
|
//initGameObject.hideFlags = HideFlags.HideInHierarchy;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
// Make instance persistent.
|
|
|
|
|
|
Object.DontDestroyOnLoad(initGameObject);
|
2023-10-19 15:00:19 +08:00
|
|
|
|
Object.DontDestroyOnLoad(GameObject.Find("CriWareLibraryInitializer"));
|
|
|
|
|
|
//#if UNITY_EDITOR
|
|
|
|
|
|
if (curClipType == ClipType.CriwareClip)
|
|
|
|
|
|
{
|
|
|
|
|
|
_criError = new GameObject();
|
|
|
|
|
|
_criError.name = "CriwareError";
|
|
|
|
|
|
_criError.AddComponent<CriWareErrorHandler>();
|
|
|
|
|
|
Object.DontDestroyOnLoad(_criError);
|
|
|
|
|
|
}
|
|
|
|
|
|
//#endif
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// When set to true, new Audios that have the same audio clip as any other Audio, will be ignored
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool IgnoreDuplicateMusic { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// When set to true, new Audios that have the same audio clip as any other Audio, will be ignored
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public bool IgnoreDuplicateSounds { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public float GlobalVolume
|
|
|
|
|
|
{
|
|
|
|
|
|
get { return vol; }
|
|
|
|
|
|
set { vol = value; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public float GlobalMusicVolume
|
|
|
|
|
|
{
|
|
|
|
|
|
get { return musicVol; }
|
|
|
|
|
|
set { musicVol = value; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public float GlobalSoundsVolume
|
|
|
|
|
|
{
|
|
|
|
|
|
get { return soundsVol; }
|
|
|
|
|
|
set { soundsVol = value; }
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void Init()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!initialized)
|
|
|
|
|
|
{
|
|
|
|
|
|
musicAudio = new Dictionary<int, Audio>();
|
|
|
|
|
|
soundsAudio = new Dictionary<int, Audio>();
|
2023-10-19 15:00:19 +08:00
|
|
|
|
loadingAcb = new Dictionary<string, int>();
|
|
|
|
|
|
_freeMusicAudio = new Queue<Audio>();
|
|
|
|
|
|
_freeSoundsAudio = new Queue<Audio>();
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
|
|
|
|
|
IgnoreDuplicateMusic = false;
|
|
|
|
|
|
IgnoreDuplicateSounds = false;
|
|
|
|
|
|
|
|
|
|
|
|
initialized = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SceneManager.sceneLoaded += OnSceneLoaded;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void Release()
|
|
|
|
|
|
{
|
|
|
|
|
|
SceneManager.sceneLoaded -= OnSceneLoaded;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public void RemoveAudio(GameObject go)
|
|
|
|
|
|
{
|
|
|
|
|
|
var source = go.GetComponent<CriAtomSourceForAsset>();
|
|
|
|
|
|
if (source)
|
|
|
|
|
|
{
|
|
|
|
|
|
using var e = soundsAudio.GetEnumerator();
|
|
|
|
|
|
while (e.MoveNext())
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = e.Current.Value;
|
|
|
|
|
|
if (audio.audioSource == source)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
_toBeRemoved.Add(e.Current.Key);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
public void PauseAll()
|
|
|
|
|
|
{
|
|
|
|
|
|
PauseAllMusic();
|
|
|
|
|
|
PauseAllSounds();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void PauseAllMusic()
|
|
|
|
|
|
{
|
|
|
|
|
|
List<int> keys = new List<int>(musicAudio.Keys);
|
|
|
|
|
|
foreach (int key in keys)
|
|
|
|
|
|
{
|
|
|
|
|
|
Audio audio = musicAudio[key];
|
|
|
|
|
|
audio.Pause();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void PauseAllSounds()
|
|
|
|
|
|
{
|
|
|
|
|
|
List<int> keys = new List<int>(soundsAudio.Keys);
|
|
|
|
|
|
foreach (int key in keys)
|
|
|
|
|
|
{
|
|
|
|
|
|
Audio audio = soundsAudio[key];
|
|
|
|
|
|
audio.Pause();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void ResumeAll()
|
|
|
|
|
|
{
|
|
|
|
|
|
ResumeAllMusic();
|
|
|
|
|
|
ResumeAllSounds();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void ResumeAllMusic()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (banMusic)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
List<int> keys = new List<int>(musicAudio.Keys);
|
|
|
|
|
|
foreach (int key in keys)
|
|
|
|
|
|
{
|
|
|
|
|
|
Audio audio = musicAudio[key];
|
|
|
|
|
|
audio.Resume();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void ResumeAllSounds()
|
|
|
|
|
|
{
|
|
|
|
|
|
List<int> keys = new List<int>(soundsAudio.Keys);
|
|
|
|
|
|
foreach (int key in keys)
|
|
|
|
|
|
{
|
|
|
|
|
|
Audio audio = soundsAudio[key];
|
|
|
|
|
|
audio.Resume();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void StopAll(float fadeOutSeconds = -1.0f)
|
|
|
|
|
|
{
|
|
|
|
|
|
StopAllMusic(fadeOutSeconds);
|
|
|
|
|
|
StopAllSounds();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void StopAllMusic(float fadeOutSeconds = -1.0f)
|
|
|
|
|
|
{
|
|
|
|
|
|
List<int> keys = new List<int>(musicAudio.Keys);
|
|
|
|
|
|
foreach (int key in keys)
|
|
|
|
|
|
{
|
|
|
|
|
|
Audio audio = musicAudio[key];
|
|
|
|
|
|
if (fadeOutSeconds > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.fadeOutSeconds = fadeOutSeconds;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void StopAllSounds()
|
|
|
|
|
|
{
|
|
|
|
|
|
List<int> keys = new List<int>(soundsAudio.Keys);
|
|
|
|
|
|
foreach (int key in keys)
|
|
|
|
|
|
{
|
|
|
|
|
|
Audio audio = soundsAudio[key];
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void StopSoundById(int soundId)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (soundId >= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
List<int> keys = new List<int>(soundsAudio.Keys);
|
|
|
|
|
|
foreach (int key in keys)
|
|
|
|
|
|
{
|
|
|
|
|
|
Audio audio = soundsAudio[key];
|
|
|
|
|
|
if (audio.audioID == soundId)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void StopMusicById(int soundId)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (soundId >= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
List<int> keys = new List<int>(musicAudio.Keys);
|
|
|
|
|
|
foreach (int key in keys)
|
|
|
|
|
|
{
|
|
|
|
|
|
Audio audio = musicAudio[key];
|
|
|
|
|
|
if (audio.audioID == soundId)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.Stop();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public async UniTask<int> PlayMusicCommon(string musicName, string cueName = "", bool loop = true)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
CriAtomAcbAsset au;
|
|
|
|
|
|
await CheckIsLoading(musicName);
|
|
|
|
|
|
if (AssetManager.Instance.IsAssetPreLoaded(musicName + ".acb"))
|
|
|
|
|
|
{
|
|
|
|
|
|
au = LoadAudio(AudioType.MUSIC, musicName);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
au = await LoadAudioAsync(AudioType.MUSIC, musicName);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
|
|
|
|
|
if (au != null)
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
Audio.AudioInfo audioInfo = new Audio.AudioInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
persist = true,
|
|
|
|
|
|
volume = 1,
|
|
|
|
|
|
fadeInValue = 0.3f,
|
|
|
|
|
|
fadeOutValue = 0.3f,
|
|
|
|
|
|
};
|
|
|
|
|
|
return PlayMusic(au, loop, null, false, cueName, audioInfo);
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
|
|
|
|
|
|
return -1;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void Update(float deltaTime)
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
using (var e = musicAudio.GetEnumerator())
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
while (e.MoveNext())
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
var music = e.Current.Value;
|
|
|
|
|
|
music.Update();
|
|
|
|
|
|
if (!music.audioSource)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
_toBeRemoved.Add(e.Current.Key);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!music.IsPlaying && !music.IsPaused && !music.IsLoading)
|
|
|
|
|
|
{
|
|
|
|
|
|
_toBeRemoved.Add(e.Current.Key);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (_toBeRemoved.Count > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i < _toBeRemoved.Count; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
var audio = musicAudio[_toBeRemoved[i]];
|
|
|
|
|
|
if (!GetIsArrivePoolLimit(AudioType.MUSIC))
|
|
|
|
|
|
{
|
|
|
|
|
|
_freeMusicAudio.Enqueue(audio);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (curClipType)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
case ClipType.AudioClip:
|
|
|
|
|
|
{
|
|
|
|
|
|
Object.Destroy(audio.audioSource);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case ClipType.CriwareClip:
|
|
|
|
|
|
{
|
|
|
|
|
|
if (audio.RootGo && audio.RootGo != initGameObject)
|
|
|
|
|
|
{
|
|
|
|
|
|
Object.Destroy(audio.RootGo);
|
|
|
|
|
|
}
|
|
|
|
|
|
Object.Destroy(audio.audioSource);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
musicAudio.Remove(_toBeRemoved[i]);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_toBeRemoved.Clear();
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
|
|
|
|
|
|
using (var e1 = soundsAudio.GetEnumerator())
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
// Update sound fx
|
|
|
|
|
|
while (e1.MoveNext())
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
var sound = e1.Current.Value;
|
|
|
|
|
|
sound.Update();
|
|
|
|
|
|
if (!sound.audioSource)
|
|
|
|
|
|
{
|
|
|
|
|
|
_toBeRemoved.Add(e1.Current.Key);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!sound.IsPlaying && !sound.IsPaused && !sound.IsLoading)
|
|
|
|
|
|
{
|
|
|
|
|
|
_toBeRemoved.Add(e1.Current.Key);
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
if (_toBeRemoved.Count > 0)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
for (int i = 0; i < _toBeRemoved.Count; i++)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
var audio = soundsAudio[_toBeRemoved[i]];
|
|
|
|
|
|
|
|
|
|
|
|
if (!GetIsArrivePoolLimit(AudioType.SOUND))
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
_freeSoundsAudio.Enqueue(audio);
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
else
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
switch (curClipType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case ClipType.AudioClip:
|
|
|
|
|
|
{
|
|
|
|
|
|
Object.Destroy(audio.audioSource);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case ClipType.CriwareClip:
|
|
|
|
|
|
{
|
|
|
|
|
|
Object.Destroy(audio.audioSource);
|
|
|
|
|
|
|
|
|
|
|
|
if (audio.RootGo && audio.RootGo != initGameObject)
|
|
|
|
|
|
{
|
|
|
|
|
|
Object.Destroy(audio.RootGo);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
|
|
|
|
|
|
soundsAudio.Remove(_toBeRemoved[i]);
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
|
|
|
|
|
|
_toBeRemoved.Clear();
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
private bool GetIsArrivePoolLimit(AudioType audioType)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (audioType == AudioType.MUSIC)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
return musicAudio.Count + _freeMusicAudio.Count >= MUSIC_POOL_MAX_NUM;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
return soundsAudio.Count + _freeSoundsAudio.Count >= SOUNDS_POOL_MAX_NUM;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public async UniTask<int> PlaySoundCommon(string soundName, string cueName = "")
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
await CheckIsLoading(soundName);
|
2023-08-22 19:08:45 +08:00
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (curClipType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case ClipType.AudioClip:
|
|
|
|
|
|
{
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case ClipType.CriwareClip:
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
CriAtomAcbAsset acb;
|
|
|
|
|
|
if (AssetManager.Instance.IsAssetPreLoaded(soundName + ".acb"))
|
|
|
|
|
|
{
|
|
|
|
|
|
acb = LoadAudio(AudioType.SOUND, soundName);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
acb = await LoadAudioAsync(AudioType.SOUND, soundName);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (acb != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return PlaySound(acb, GlobalVolume, false, null, false, cueName);
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DebugUtil.LogError("==== audio null!!! ====");
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
DebugUtil.LogError("{0}.PlaySound:{1} error:{2}", GetType(), soundName, e.Message);
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void SetMusicEnable(bool isEnable)
|
|
|
|
|
|
{
|
|
|
|
|
|
GlobalMusicVolume = isEnable ? 1 : 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void SetSoundEnable(bool isEnable)
|
|
|
|
|
|
{
|
|
|
|
|
|
GlobalSoundsVolume = isEnable ? 1 : 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public async UniTask<int> PlayMusicCommon(string musicName, Transform trans =null, string cueName = "", bool loop = true)
|
|
|
|
|
|
{
|
|
|
|
|
|
CriAtomAcbAsset au;
|
|
|
|
|
|
await CheckIsLoading(musicName);
|
|
|
|
|
|
if (AssetManager.Instance.IsAssetPreLoaded(musicName + ".acb"))
|
|
|
|
|
|
{
|
|
|
|
|
|
au = await LoadAudioAsync(AudioType.MUSIC, musicName);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
au = LoadAudio(AudioType.MUSIC, musicName);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (au != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
Audio.AudioInfo audioInfo = new Audio.AudioInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
persist = true,
|
|
|
|
|
|
volume = 1,
|
|
|
|
|
|
fadeInValue = 0.3f,
|
|
|
|
|
|
fadeOutValue = 0.3f,
|
|
|
|
|
|
};
|
|
|
|
|
|
return PlayMusic(au, loop, trans, true, cueName, audioInfo);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public async UniTask<int> PlaySoundCommon(string soundName, Transform trans, string cueName, bool is3D = false, Vector3 pos = new Vector3())
|
|
|
|
|
|
{
|
|
|
|
|
|
await CheckIsLoading(soundName);
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (curClipType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case ClipType.AudioClip:
|
|
|
|
|
|
{
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case ClipType.CriwareClip:
|
|
|
|
|
|
{
|
|
|
|
|
|
CriAtomAcbAsset acb;
|
|
|
|
|
|
if (AssetManager.Instance.IsAssetPreLoaded(soundName + ".acb"))
|
|
|
|
|
|
{
|
|
|
|
|
|
acb = LoadAudio(AudioType.SOUND, soundName);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
acb = await LoadAudioAsync(AudioType.SOUND, soundName);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (acb != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
return PlaySound(acb, GlobalVolume, false, trans, is3D, cueName, pos);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
DebugUtil.LogError("==== audio null!!! ====");
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("{0}.PlaySound:{1} error:{2}", GetType(), soundName, e.Message);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private async UniTask CheckIsLoading(string audioName)
|
|
|
|
|
|
{
|
|
|
|
|
|
while (loadingAcb.ContainsKey(audioName))
|
|
|
|
|
|
{
|
|
|
|
|
|
await UniTask.NextFrame();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2023-10-19 15:00:19 +08:00
|
|
|
|
/// 播放音乐
|
2023-08-22 19:08:45 +08:00
|
|
|
|
/// </summary>
|
2023-10-19 15:00:19 +08:00
|
|
|
|
/// <param name="acbAsset"></param> acbAsset
|
|
|
|
|
|
/// <param name="loop"></param> 是否循环
|
|
|
|
|
|
/// <param name="sourceTransform"></param> 挂载的trans
|
|
|
|
|
|
/// <param name="is3D"></param> 是否3D音效
|
|
|
|
|
|
/// <param name="cueName"></param> 播放的Cue里面哪个音源
|
|
|
|
|
|
/// <param name="audioInfo"></param> 结构体,包含淡入淡出的时间
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
private int PlayMusic(CriAtomAcbAsset acbAsset, bool loop, Transform sourceTransform,
|
|
|
|
|
|
bool is3D, string cueName, Audio.AudioInfo audioInfo)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
if (acbAsset == null)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
DebugUtil.LogError("Sound Manager: Audio clip is null, cannot play music", acbAsset);
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
if (IgnoreDuplicateMusic)
|
|
|
|
|
|
{
|
|
|
|
|
|
List<int> keys = new List<int>(musicAudio.Keys);
|
|
|
|
|
|
foreach (int key in keys)
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
if (musicAudio[key].audioSource.Cue.AcbAsset.name == acbAsset.name)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
|
|
|
|
|
return musicAudio[key].audioID;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
// Stop all current music playing
|
2023-10-19 15:00:19 +08:00
|
|
|
|
//StopAllMusic(audioInfo.fadeOutValue);
|
|
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
// Create the audioSource
|
2023-10-19 15:00:19 +08:00
|
|
|
|
Audio audio;
|
|
|
|
|
|
if (_freeMusicAudio.Count > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio = _freeMusicAudio.Dequeue();
|
|
|
|
|
|
audio.Play(cueName, true);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
audio = new Audio(Audio.AudioType.Music, acbAsset, loop, sourceTransform, is3D, cueName, audioInfo);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
// Add it to music list
|
|
|
|
|
|
musicAudio.Add(audio.audioID, audio);
|
2023-10-19 15:00:19 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
if (banMusic)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio.Pause();
|
|
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
return audio.audioID;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
private int PlaySound(CriAtomAcbAsset acbAsset, float volume, bool loop, Transform sourceTransform,
|
|
|
|
|
|
bool is3D = false, string cueName = "", Vector3 pos = new Vector3(), float pitch = 1.0f)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
if (acbAsset == null)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("Sound Manager: Audio clip is null, cannot play music");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (banSound)
|
|
|
|
|
|
{
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (IgnoreDuplicateSounds)
|
|
|
|
|
|
{
|
|
|
|
|
|
List<int> keys = new List<int>(soundsAudio.Keys);
|
|
|
|
|
|
foreach (var key in keys)
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
if (soundsAudio.ContainsKey(key) && soundsAudio[key].audioSource.Cue.AcbAsset.name.Equals(acbAsset.name) )
|
2023-08-22 19:08:45 +08:00
|
|
|
|
return soundsAudio[key].audioID;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if UNITY_EDITOR || UNITY_IOS || UNITY_ANDROID
|
|
|
|
|
|
// Create the audioSource
|
2023-10-19 15:00:19 +08:00
|
|
|
|
Audio audio;
|
|
|
|
|
|
Audio.AudioInfo audioInfo = new Audio.AudioInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
persist = false,
|
|
|
|
|
|
volume = volume,
|
|
|
|
|
|
fadeInValue = 0f,
|
|
|
|
|
|
fadeOutValue = 0f,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
Vector3 newPos;
|
|
|
|
|
|
if (!is3D)
|
|
|
|
|
|
{
|
|
|
|
|
|
newPos = initGameObject.transform.position;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!sourceTransform)
|
|
|
|
|
|
{
|
|
|
|
|
|
newPos = pos;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
newPos = sourceTransform.transform.position;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GameObject go;
|
|
|
|
|
|
if (_freeSoundsAudio.Count > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
audio = _freeSoundsAudio.Dequeue();
|
|
|
|
|
|
go = audio.RootGo;
|
|
|
|
|
|
if (!go)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("==== _freeSoundsAudio null!!! ====");
|
|
|
|
|
|
}
|
|
|
|
|
|
audio.SetIs3D(is3D);
|
|
|
|
|
|
audio.Play(cueName);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
go = new GameObject();
|
|
|
|
|
|
go.name = "Audio";
|
|
|
|
|
|
audio = new Audio(AudioBase.AudioType.Sound, acbAsset, loop, go.transform, is3D, cueName, audioInfo);
|
|
|
|
|
|
#if UNITY_EDITOR
|
|
|
|
|
|
go.name += "_"+ audio.audioID;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
go.transform.SetParent(initGameObject.transform);
|
|
|
|
|
|
}
|
|
|
|
|
|
go.transform.position = newPos;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
audio.SetPitch(pitch);
|
|
|
|
|
|
// Add it to music list
|
|
|
|
|
|
soundsAudio.Add(audio.audioID, audio);
|
|
|
|
|
|
return audio.audioID;
|
2023-10-19 15:00:19 +08:00
|
|
|
|
|
2023-08-22 19:08:45 +08:00
|
|
|
|
#else
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
|
|
|
|
|
|
{
|
|
|
|
|
|
List<int> keys;
|
|
|
|
|
|
// Stop and remove all non-persistent music audio
|
|
|
|
|
|
keys = new List<int>(musicAudio.Keys);
|
|
|
|
|
|
|
|
|
|
|
|
switch (curClipType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case ClipType.AudioClip:
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var key in keys)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (musicAudio.ContainsKey(key))
|
|
|
|
|
|
{
|
|
|
|
|
|
var music = musicAudio[key];
|
|
|
|
|
|
if (!music.persist && music.activated)
|
|
|
|
|
|
{
|
|
|
|
|
|
Object.Destroy(music.audioSource);
|
|
|
|
|
|
musicAudio.Remove(key);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Stop sound fx
|
|
|
|
|
|
keys = new List<int>(soundsAudio.Keys);
|
|
|
|
|
|
foreach (var key in keys)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (soundsAudio.ContainsKey(key))
|
|
|
|
|
|
{
|
|
|
|
|
|
var sound = soundsAudio[key];
|
|
|
|
|
|
Object.Destroy(sound.audioSource);
|
|
|
|
|
|
soundsAudio.Remove(key);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case ClipType.CriwareClip:
|
|
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
foreach (var key in keys)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (musicAudio.ContainsKey(key))
|
|
|
|
|
|
{
|
|
|
|
|
|
var music = musicAudio[key];
|
|
|
|
|
|
if (!music.persist && music.activated)
|
|
|
|
|
|
{
|
|
|
|
|
|
Object.Destroy(music.audioSource);
|
|
|
|
|
|
musicAudio.Remove(key);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Stop sound fx
|
|
|
|
|
|
keys = new List<int>(soundsAudio.Keys);
|
|
|
|
|
|
foreach (var key in keys)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (soundsAudio.ContainsKey(key))
|
|
|
|
|
|
{
|
|
|
|
|
|
var sound = soundsAudio[key];
|
|
|
|
|
|
Object.Destroy(sound.audioSource);
|
|
|
|
|
|
soundsAudio.Remove(key);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
|
|
|
|
|
|
//异步加载音频
|
|
|
|
|
|
private async UniTask<CriAtomAcbAsset> LoadAudioAsync(AudioType type, string audioName, bool is3D = false)
|
|
|
|
|
|
{
|
|
|
|
|
|
string prefix = "BGM";
|
|
|
|
|
|
switch (type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case AudioType.MUSIC:
|
|
|
|
|
|
prefix = "BGM";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case AudioType.SOUND:
|
|
|
|
|
|
prefix = "Sound";
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
loadingAcb.Add(audioName, 1);
|
|
|
|
|
|
|
|
|
|
|
|
string acfName = audioName + ".acf";
|
|
|
|
|
|
await LoadAcfAsync(type, acfName);
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
string acbName = audioName + ".acb";
|
|
|
|
|
|
CriAtomAcbAsset acbAsset = await AssetManager.Instance.LoadAssetAsync<CriAtomAcbAsset>(acbName);
|
|
|
|
|
|
acbAsset.LoadImmediate();
|
|
|
|
|
|
loadingAcb.Remove(audioName);
|
|
|
|
|
|
|
|
|
|
|
|
return acbAsset;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//同步加载音频,需要已预加载资源
|
|
|
|
|
|
private CriAtomAcbAsset LoadAudio(AudioType type, string audioName, bool is3D = false)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
|
|
|
|
|
string prefix = "BGM";
|
|
|
|
|
|
switch (type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case AudioType.MUSIC:
|
|
|
|
|
|
prefix = "BGM";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case AudioType.SOUND:
|
|
|
|
|
|
prefix = "Sound";
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
// string acfName = audioName + ".acf";
|
|
|
|
|
|
// LoadAcf(type, acfName);
|
|
|
|
|
|
|
|
|
|
|
|
string acbName = audioName + ".acb";
|
|
|
|
|
|
CriAtomAcbAsset acbAsset = AssetManager.Instance.LoadAsset<CriAtomAcbAsset>(acbName);
|
|
|
|
|
|
return acbAsset;
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
private async UniTask<CriAtomAcfAsset> LoadAcfAsync(AudioType type, string audioName, bool is3D = false)
|
|
|
|
|
|
{
|
|
|
|
|
|
string prefix = "BGM";
|
|
|
|
|
|
switch (type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case AudioType.MUSIC:
|
|
|
|
|
|
prefix = "BGM";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case AudioType.SOUND:
|
|
|
|
|
|
prefix = "Sound";
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CriAtomAcfAsset acfAsset = await AssetManager.Instance.LoadAssetAsync<CriAtomAcfAsset>(audioName);
|
|
|
|
|
|
acfAsset.Register();
|
|
|
|
|
|
|
|
|
|
|
|
return acfAsset;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private CriAtomAcfAsset LoadAcf(AudioType type, string audioName, bool is3D = false)
|
|
|
|
|
|
{
|
|
|
|
|
|
CriAtomAcfAsset acfAsset = AssetManager.Instance.LoadAsset<CriAtomAcfAsset>(audioName);
|
|
|
|
|
|
acfAsset.Register();
|
|
|
|
|
|
|
|
|
|
|
|
return acfAsset;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
//外部接口
|
|
|
|
|
|
public async UniTask PlayAudio(string key, Transform trans = null)
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
//全局播放,挂到Audio物体上
|
|
|
|
|
|
var audioData = TableManager.Instance.Tables.Audios.GetByKey(key);
|
|
|
|
|
|
if (audioData == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("==== 播放的音频不存在!!!音频Key: {0}", key);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var audioName = Constants.AUDIO_MUSIC_PATH + audioData.Path;
|
|
|
|
|
|
|
|
|
|
|
|
if (!trans)
|
|
|
|
|
|
{
|
|
|
|
|
|
int audioID;
|
|
|
|
|
|
switch (audioData.Type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case (cfg.AudioCfg.AudioType.Sound):
|
|
|
|
|
|
{
|
|
|
|
|
|
audioID = await PlaySoundCommon(audioName, audioData.CueName);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case (cfg.AudioCfg.AudioType.Music):
|
|
|
|
|
|
{
|
|
|
|
|
|
audioID = await PlayMusicCommon(audioName, audioData.CueName);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//定点播放
|
|
|
|
|
|
switch (audioData.Type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case (cfg.AudioCfg.AudioType.Sound):
|
|
|
|
|
|
{
|
|
|
|
|
|
int audioID = await PlaySoundCommon(audioName, trans, audioData.CueName);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case (cfg.AudioCfg.AudioType.Music):
|
|
|
|
|
|
{
|
|
|
|
|
|
int audioID = await PlayMusicCommon(audioName, trans, audioData.CueName);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public async UniTask PlayAudio(string key, Vector3 pos)
|
|
|
|
|
|
{
|
|
|
|
|
|
//全局播放,挂到Audio物体上
|
|
|
|
|
|
var audioData = TableManager.Instance.Tables.Audios.GetByKey(key);
|
|
|
|
|
|
if (audioData == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("==== 播放的音频不存在!!!音频Key: {0}", key);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
var audioName = Constants.AUDIO_MUSIC_PATH + audioData.Path;
|
|
|
|
|
|
|
|
|
|
|
|
//定点播放
|
|
|
|
|
|
// var go = new GameObject();
|
|
|
|
|
|
// go.transform.position = pos;
|
|
|
|
|
|
switch (audioData.Type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case (cfg.AudioCfg.AudioType.Sound):
|
|
|
|
|
|
{
|
|
|
|
|
|
int audioID = await PlaySoundCommon(audioName, null, audioData.CueName, true, pos);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case (cfg.AudioCfg.AudioType.Music):
|
|
|
|
|
|
{
|
|
|
|
|
|
int audioID = await PlayMusicCommon(audioName, null, audioData.CueName, true);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public async UniTask PlayAudio(int ID, Vector3 pos)
|
|
|
|
|
|
{
|
|
|
|
|
|
//全局播放,挂到Audio物体上
|
|
|
|
|
|
var audioData = TableManager.Instance.Tables.Audios.GetByID(ID);
|
|
|
|
|
|
if (audioData == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("==== 播放的音频不存在!!!音频ID: {0}", ID);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
var audioName = Constants.AUDIO_MUSIC_PATH + audioData.Path;
|
|
|
|
|
|
|
|
|
|
|
|
//定点播放
|
|
|
|
|
|
switch (audioData.Type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case (cfg.AudioCfg.AudioType.Sound):
|
|
|
|
|
|
{
|
|
|
|
|
|
int audioID = await PlaySoundCommon(audioName, null, audioData.CueName, true, pos);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case (cfg.AudioCfg.AudioType.Music):
|
|
|
|
|
|
{
|
|
|
|
|
|
int audioID = await PlayMusicCommon(audioName, null, audioData.CueName, true);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
|
|
|
|
|
|
public async UniTask PlayAudio(int ID, Transform trans = null)
|
|
|
|
|
|
{
|
|
|
|
|
|
//全局播放,挂到Audio物体上
|
|
|
|
|
|
var audioData = TableManager.Instance.Tables.Audios.GetByID(ID);
|
|
|
|
|
|
if (audioData == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
DebugUtil.LogError("==== 播放的音频不存在!!!音频Key: {0}", ID);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
var audioName = Constants.AUDIO_MUSIC_PATH + audioData.Path;
|
|
|
|
|
|
|
|
|
|
|
|
if (!trans)
|
|
|
|
|
|
{
|
|
|
|
|
|
int audioID;
|
|
|
|
|
|
switch (audioData.Type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case (cfg.AudioCfg.AudioType.Sound):
|
|
|
|
|
|
{
|
|
|
|
|
|
audioID = await PlaySoundCommon(audioName, audioData.CueName);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case (cfg.AudioCfg.AudioType.Music):
|
|
|
|
|
|
{
|
|
|
|
|
|
audioID = await PlayMusicCommon(audioName, audioData.CueName);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//定点播放
|
|
|
|
|
|
var go = new GameObject();
|
|
|
|
|
|
go.transform.position = trans.position;
|
|
|
|
|
|
switch (audioData.Type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case (cfg.AudioCfg.AudioType.Sound):
|
|
|
|
|
|
{
|
|
|
|
|
|
int audioID = await PlaySoundCommon(audioName, trans, audioData.CueName);
|
|
|
|
|
|
go.name = "Audio_" + audioID;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case (cfg.AudioCfg.AudioType.Music):
|
|
|
|
|
|
{
|
|
|
|
|
|
int audioID = await PlayMusicCommon(audioName, trans, audioData.CueName);
|
|
|
|
|
|
go.name = "Audio_" + audioID;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
go.transform.SetParent(initGameObject.transform);
|
|
|
|
|
|
}
|
2023-10-24 18:53:34 +08:00
|
|
|
|
|
|
|
|
|
|
//在播放之前注册
|
|
|
|
|
|
public void RegisterAnalyzer(CriAtomExOutputAnalyzer s)
|
|
|
|
|
|
{
|
|
|
|
|
|
IsAnalyzer = true;
|
|
|
|
|
|
analyzer=s;
|
|
|
|
|
|
}
|
|
|
|
|
|
public void UnregisterAnalyzer(GameObject go, CriAtomExOutputAnalyzer s)
|
|
|
|
|
|
{
|
|
|
|
|
|
var source = go.GetComponent<CriAtomSourceForAsset>();
|
|
|
|
|
|
source.DetachFromAnalyzer( s);
|
|
|
|
|
|
IsAnalyzer = false;
|
|
|
|
|
|
analyzer = null;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-08-22 19:08:45 +08:00
|
|
|
|
|
2023-10-21 11:55:23 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public class Audio : AudioCriware
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
private static int _audioID;
|
|
|
|
|
|
|
|
|
|
|
|
public static void ReleaseAudioIDs()
|
2023-08-22 19:08:45 +08:00
|
|
|
|
{
|
2023-10-19 15:00:19 +08:00
|
|
|
|
_audioID = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public struct AudioInfo
|
|
|
|
|
|
{
|
|
|
|
|
|
public bool persist;
|
|
|
|
|
|
public float volume;
|
|
|
|
|
|
public float fadeInValue;
|
|
|
|
|
|
public float fadeOutValue;
|
2023-08-22 19:08:45 +08:00
|
|
|
|
}
|
2023-10-19 15:00:19 +08:00
|
|
|
|
public Audio(AudioType audioType, CriAtomAcbAsset acb, bool loop, Transform sourceTransform, bool is3D, string cueName, AudioInfo audioInfo):
|
|
|
|
|
|
base(acb, loop, sourceTransform, is3D, cueName, audioInfo)
|
|
|
|
|
|
{
|
|
|
|
|
|
audioID = ++_audioID;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|