86 lines
2.3 KiB
C#
86 lines
2.3 KiB
C#
// (c) Copyright HutongGames. All rights reserved.
|
|
|
|
using UnityEngine;
|
|
|
|
namespace HutongGames.PlayMaker.Actions
|
|
{
|
|
[ActionCategory(ActionCategory.Audio)]
|
|
[Tooltip("Plays a Random Audio Clip at a position defined by a Game Object or a Vector3. If a position is defined, it takes priority over the game object. You can set the relative weight of the clips to control how often they are selected.")]
|
|
public class PlayRandomSound : FsmStateAction
|
|
{
|
|
[Tooltip("The GameObject to play the sound.")]
|
|
public FsmOwnerDefault gameObject;
|
|
|
|
[Tooltip("Use world position instead of GameObject.")]
|
|
public FsmVector3 position;
|
|
|
|
[CompoundArray("Audio Clips", "Audio Clip", "Weight")]
|
|
[ObjectType(typeof(AudioClip))]
|
|
public FsmObject[] audioClips;
|
|
[HasFloatSlider(0, 1)]
|
|
public FsmFloat[] weights;
|
|
[HasFloatSlider(0, 1)]
|
|
public FsmFloat volume = 1f;
|
|
|
|
[Tooltip("Don't play the same sound twice in a row")]
|
|
public FsmBool noRepeat;
|
|
|
|
private int randomIndex;
|
|
private int lastIndex = -1;
|
|
|
|
public override void Reset()
|
|
{
|
|
gameObject = null;
|
|
position = new FsmVector3 { UseVariable = true };
|
|
audioClips = new FsmObject[3];
|
|
weights = new FsmFloat[] {1,1,1};
|
|
volume = 1;
|
|
noRepeat = false;
|
|
}
|
|
|
|
public override void OnEnter()
|
|
{
|
|
DoPlayRandomClip();
|
|
|
|
Finish();
|
|
}
|
|
|
|
void DoPlayRandomClip()
|
|
{
|
|
if (audioClips.Length == 0) return;
|
|
|
|
if (!noRepeat.Value || weights.Length == 1)
|
|
{
|
|
randomIndex = ActionHelpers.GetRandomWeightedIndex(weights);
|
|
}
|
|
else
|
|
{
|
|
do
|
|
{
|
|
randomIndex = ActionHelpers.GetRandomWeightedIndex(weights);
|
|
} while (randomIndex == lastIndex && randomIndex != -1);
|
|
|
|
lastIndex = randomIndex;
|
|
}
|
|
|
|
if (randomIndex != -1)
|
|
{
|
|
var clip = audioClips[randomIndex].Value as AudioClip;
|
|
if (clip != null)
|
|
{
|
|
if (!position.IsNone)
|
|
{
|
|
AudioSource.PlayClipAtPoint(clip, position.Value, volume.Value);
|
|
}
|
|
else
|
|
{
|
|
GameObject go = Fsm.GetOwnerDefaultTarget(gameObject);
|
|
if (go == null) return;
|
|
|
|
AudioSource.PlayClipAtPoint(clip, go.transform.position, volume.Value);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |