Files
2024-11-20 15:21:28 +01:00

73 lines
1.7 KiB
C#

// (c) Copyright HutongGames, LLC 2010-2013. All rights reserved.
using UnityEngine;
using System.Collections.Generic;
namespace HutongGames.PlayMaker.Actions
{
[ActionCategory(ActionCategory.StateMachine)]
[Tooltip("Sends a Random State Event after an optional delay. Use this to transition to a random state from the current state.")]
public class RandomEvent : FsmStateAction
{
[HasFloatSlider(0, 10)]
[Tooltip("Delay before sending the event.")]
public FsmFloat delay;
[Tooltip("Don't repeat the same event twice in a row.")]
public FsmBool noRepeat;
private DelayedEvent delayedEvent;
private int randomEventIndex;
private int lastEventIndex = -1;
public override void Reset()
{
delay = null;
noRepeat = false;
}
public override void OnEnter()
{
if (State.Transitions.Length == 0)
{
return;
}
if (lastEventIndex == -1)
{
lastEventIndex = Random.Range(0, State.Transitions.Length);
}
if (delay.Value < 0.001f)
{
Fsm.Event(GetRandomEvent());
Finish();
}
else
{
delayedEvent = Fsm.DelayedEvent(GetRandomEvent(), delay.Value);
}
}
public override void OnUpdate()
{
if (DelayedEvent.WasSent(delayedEvent))
{
Finish();
}
}
FsmEvent GetRandomEvent()
{
do
{
randomEventIndex = Random.Range(0, State.Transitions.Length);
} while (noRepeat.Value && State.Transitions.Length > 1 && randomEventIndex == lastEventIndex);
lastEventIndex = randomEventIndex;
return State.Transitions[randomEventIndex].FsmEvent;
}
}
}