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

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