89 lines
1.9 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |