using System; using UnityEngine; namespace QFramework { internal class AudioAction : IAction { public System.Action OnFinished { get; set; } private AudioAction() { } private static readonly SimpleObjectPool mPool = new SimpleObjectPool(() => new AudioAction(), null, 10); public string path; public string audioType; bool loop = false; public bool waitFinished = true; bool isPlay = true; float volume; ResLoader loader; public static AudioAction Allocate(string path, string audioType, string loop, string waitFinished, string volume, string isPlay, System.Action OnFinished = null) { var retNode = mPool.Allocate(); retNode.ActionID = ActionKit.ID_GENERATOR++; retNode.Deinited = false; retNode.Reset(); retNode.path = path; retNode.audioType = audioType; bool.TryParse(loop, out retNode.loop); bool.TryParse(waitFinished, out retNode.waitFinished); retNode.OnFinished = OnFinished; bool.TryParse(isPlay, out retNode.isPlay); if (string.IsNullOrEmpty(volume)) { retNode.volume = AudioKit.Settings.MusicVolume.Value; } else { float.TryParse(volume, out retNode.volume); } return retNode; } public ulong ActionID { get; set; } public ActionStatus Status { get; set; } public void OnStart() { if (isPlay) { loader = ResLoader.Allocate(); string audioPath = Global.audioPath + path; loader.Add2Load(audioPath.ToLocalAudioResName(), (success, res) => { if (success) { AudioClip clip = res.Asset.As(); switch (audioType) { case "Music": if (waitFinished == false) { this.Finish(); AudioKit.PlayMusic(clip, loop: loop); } else { AudioKit.PlayMusic(clip, loop: loop, onEndCallback: OnPlayFinished); } break; case "Voice": if (waitFinished == false) { this.Finish(); AudioKit.PlayVoice(clip, loop: loop); } else { AudioKit.PlayVoice(clip, loop: loop, onEndedCallback: OnPlayFinished); } break; case "Sound": if (waitFinished == false) { this.Finish(); AudioKit.PlaySound(clip, loop: loop); } else { AudioKit.PlaySound(clip, loop: loop, callBack: OnSoundPlayFinished); } break; } } }); loader.LoadAsync(); } else { switch (audioType) { case "Music": AudioKit.StopMusic(); break; case "Voice": AudioKit.StopVoice(); break; case "Sound": AudioKit.StopAllSound(); break; } } } public void OnPlayFinished() { Debug.LogError("OnPlayFinished"); this.Finish(); } public void OnSoundPlayFinished(AudioPlayer player) { OnPlayFinished(); } public void OnExecute(float dt) { } public void OnFinish() { } public void Reset() { Status = ActionStatus.NotStart; Paused = false; } public bool Paused { get; set; } public void Deinit() { if (!Deinited) { OnFinished = null; Deinited = true; //loader.Recycle2Cache(); mPool.Recycle(this); } } public bool Deinited { get; set; } } }