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

89 lines
1.9 KiB
C#

// (c) Copyright HutongGames, LLC 2010-2013. All rights reserved.
using UnityEngine;
namespace HutongGames.PlayMaker.Actions
{
[ActionCategory(ActionCategory.Logic)]
[ActionTarget(typeof(PlayMakerFSM), "gameObject,fsmName")]
[Tooltip("Sends Events based on the current State of an FSM.")]
public class FsmStateSwitch : FsmStateAction
{
[RequiredField]
[Tooltip("The GameObject that owns the FSM.")]
public FsmGameObject gameObject;
[UIHint(UIHint.FsmName)]
[Tooltip("Optional name of Fsm on GameObject. Useful if there is more than one FSM on the GameObject.")]
public FsmString fsmName;
[CompoundArray("State Switches", "Compare State", "Send Event")]
public FsmString[] compareTo;
public FsmEvent[] sendEvent;
[Tooltip("Repeat every frame. Useful if you're waiting for a particular result.")]
public bool everyFrame;
// store game object last frame so we know when it's changed
// and have to cache a new fsm
private GameObject previousGo;
// cache the fsm component since that's an expensive operation
private PlayMakerFSM fsm;
public override void Reset()
{
gameObject = null;
fsmName = null;
compareTo = new FsmString[1];
sendEvent = new FsmEvent[1];
everyFrame = false;
}
public override void OnEnter()
{
DoFsmStateSwitch();
if (!everyFrame)
{
Finish();
}
}
public override void OnUpdate()
{
DoFsmStateSwitch();
}
void DoFsmStateSwitch()
{
var go = gameObject.Value;
if (go == null)
{
return;
}
if (go != previousGo)
{
fsm = ActionHelpers.GetGameObjectFsm(go, fsmName.Value);
previousGo = go;
}
if (fsm == null)
{
return;
}
var activeStateName = fsm.ActiveStateName;
for (var i = 0; i < compareTo.Length; i++)
{
if (activeStateName == compareTo[i].Value)
{
Fsm.Event(sendEvent[i]);
return;
}
}
}
}
}