169 lines
5.0 KiB
C#
169 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;
|
|
}
|
|
this.Finish();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
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; }
|
|
}
|
|
|
|
|
|
} |