// (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(); 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 } }