167 lines
5.0 KiB
C#

using System;
using UnityEngine;
namespace QFramework
{
internal class AudioAction : IAction
{
public System.Action OnFinished { get; set; }
private AudioAction()
{
}
private static readonly SimpleObjectPool<AudioAction> mPool =
new SimpleObjectPool<AudioAction>(() => 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<AudioClip>();
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; }
}
}