Files
beyond/Assets/ThirdParty/PlayMaker/Actions/Audio/AudioPlay.cs
2024-11-20 15:21:28 +01:00

122 lines
2.8 KiB
C#

// (c) Copyright HutongGames, LLC 2010-2013. All rights reserved.
using UnityEngine;
namespace HutongGames.PlayMaker.Actions
{
[ActionCategory(ActionCategory.Audio)]
[ActionTarget(typeof(AudioSource), "gameObject")]
[ActionTarget(typeof(AudioClip), "oneShotClip")]
[Tooltip("Plays the Audio Clip set with Set Audio Clip or in the Audio Source inspector on a Game Object. Optionally plays a one shot Audio Clip.")]
public class AudioPlay : FsmStateAction
{
[RequiredField]
[CheckForComponent(typeof(AudioSource))]
[Tooltip("The GameObject with an AudioSource component.")]
public FsmOwnerDefault gameObject;
[HasFloatSlider(0,1)]
[Tooltip("Set the volume.")]
public FsmFloat volume;
[ObjectType(typeof(AudioClip))]
[Tooltip("Optionally play a 'one shot' AudioClip. NOTE: Volume cannot be adjusted while playing a 'one shot' AudioClip.")]
public FsmObject oneShotClip;
[Tooltip("Wait until the end of the clip to send the Finish Event. Set to false to send the finish event immediately.")]
public FsmBool WaitForEndOfClip;
[Tooltip("Event to send when the action finishes.")]
public FsmEvent finishedEvent;
private AudioSource audio;
public override void Reset()
{
gameObject = null;
volume = 1f;
oneShotClip = null;
finishedEvent = null;
WaitForEndOfClip = true;
}
public override void OnEnter()
{
var go = Fsm.GetOwnerDefaultTarget(gameObject);
if (go != null)
{
// cache the AudioSource component
audio = go.GetComponent<AudioSource>();
if (audio != null)
{
var audioClip = oneShotClip.Value as AudioClip;
if (audioClip == null)
{
audio.Play();
if (!volume.IsNone)
{
audio.volume = volume.Value;
}
return;
}
if (!volume.IsNone)
{
audio.PlayOneShot(audioClip, volume.Value);
}
else
{
audio.PlayOneShot(audioClip);
}
if (WaitForEndOfClip.Value == false)
{
Fsm.Event(finishedEvent);
Finish();
}
return;
}
}
// Finish if failed to play sound
Finish();
}
public override void OnUpdate ()
{
if (audio == null)
{
Finish();
}
else
{
if (!audio.isPlaying)
{
Fsm.Event(finishedEvent);
Finish();
}
else if (!volume.IsNone && volume.Value != audio.volume)
{
audio.volume = volume.Value;
}
}
}
#if UNITY_EDITOR
public override string AutoName()
{
if (oneShotClip.Value != null && !oneShotClip.IsNone)
{
return ActionHelpers.AutoName(this, oneShotClip);
}
return null;
}
#endif
}
}