49 lines
1.7 KiB
C#
49 lines
1.7 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class PlayOneShotBehaviour : StateMachineBehaviour
|
|
{
|
|
public AudioClip soundToPlay;
|
|
public float volume = 1f;
|
|
public bool playOnEnter = true, playOnExit = false, playAfterDelay = true;
|
|
|
|
// Delayed sound timer
|
|
public float playDelay = 0.25f;
|
|
private float timeSinceEntered = 0;
|
|
private bool hasDelayedSoundPlayed = false;
|
|
|
|
// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
|
|
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
|
|
{
|
|
if (playOnEnter)
|
|
{
|
|
AudioSource.PlayClipAtPoint(soundToPlay, animator.gameObject.transform.position, volume);
|
|
}
|
|
}
|
|
|
|
// OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
|
|
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
|
|
{
|
|
if (playAfterDelay && !hasDelayedSoundPlayed)
|
|
{
|
|
timeSinceEntered += Time.deltaTime;
|
|
|
|
if (timeSinceEntered > playDelay)
|
|
{
|
|
AudioSource.PlayClipAtPoint(soundToPlay, animator.gameObject.transform.position, volume);
|
|
hasDelayedSoundPlayed = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// OnStateExit is called when a transition ends and the state machine finishes evaluating this state
|
|
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
|
|
{
|
|
if (playOnExit)
|
|
{
|
|
AudioSource.PlayClipAtPoint(soundToPlay, animator.gameObject.transform.position, volume);
|
|
}
|
|
}
|
|
}
|