Hi,
Ok, following FsmBoolTest (
http://hutonggames.com/playmakerforum/index.php?topic=74.0 ),
Here is FsmGameObjectCompare test.
Based on GameObjectCompare
https://hutonggames.fogbugz.com/default.asp?W488Same thing but now you can select remote gameobject from other fsms.
It features a flag to prevent triggering a true comparison if both variable are null. While it is mathematically correct, this is unlikely what you want in practice. This easily solved like so and prevent more states and actions to check that both variable are null in case Equal is triggered.
// (c) Copyright HutongGames, LLC 2010-2011. All rights reserved.
using UnityEngine;
namespace HutongGames.PlayMaker.Actions
{
[ActionCategory(ActionCategory.Logic)]
[Tooltip("Compares 2 Game Objects from different fsms and sends Events based on the result.")]
public class FsmGameObjectCompare : FsmStateAction
{
[RequiredField]
public FsmOwnerDefault gameObject;
[UIHint(UIHint.FsmName)]
[Tooltip("Optional name of FSM on Game Object")]
public FsmString fsmName;
[RequiredField]
[UIHint(UIHint.FsmGameObject)]
public FsmString variableName;
[RequiredField]
public FsmOwnerDefault compareToGameObject;
[UIHint(UIHint.FsmName)]
[Tooltip("Optional name of FSM on Game Object")]
public FsmString compareToFsmName;
[RequiredField]
[UIHint(UIHint.FsmGameObject)]
public FsmString compareToVariableName;
[Tooltip("If both variable are null, do trigger NOT EQUAL.")]
public bool nullTriggerNotEqual;
public FsmEvent equalEvent;
public FsmEvent notEqualEvent;
[UIHint(UIHint.Variable)]
public FsmBool storeResult;
public bool everyFrame;
public override void Reset()
{
equalEvent = null;
notEqualEvent = null;
storeResult = null;
nullTriggerNotEqual = true;
everyFrame = false;
}
public override void OnEnter()
{
DoGameObjectCompare();
if (!everyFrame)
Finish();
}
public override void OnUpdate()
{
DoGameObjectCompare();
}
void DoGameObjectCompare()
{
if (gameObject == null || compareToGameObject == null) return;
if ( fsmName == null || compareToFsmName == null) return;
if ( variableName == null || compareToVariableName == null) return;
GameObject go = Fsm.GetOwnerDefaultTarget(gameObject);
if (go == null) return;
GameObject compareToGo = Fsm.GetOwnerDefaultTarget(compareToGameObject);
if (compareToGo == null) return;
// get the first value
PlayMakerFSM fsm = ActionHelpers.GetGameObjectFsm(go, fsmName.Value);
if (fsm == null) return;
FsmGameObject fsmGameObject = fsm.FsmVariables.GetFsmGameObject(variableName.Value);
if (fsmGameObject == null) return;
// get the compareTo value
PlayMakerFSM compareToFsm = ActionHelpers.GetGameObjectFsm(compareToGo, compareToFsmName.Value);
if (fsm == null) return;
FsmGameObject compareToFsmGameObject = compareToFsm.FsmVariables.GetFsmGameObject(compareToVariableName.Value);
if (compareToFsmGameObject == null) return;
bool equal = fsmGameObject.Value == compareToFsmGameObject.Value;
if (nullTriggerNotEqual && equal){
if (fsmGameObject.Value== null || compareToFsmGameObject.Value==null){
equal = false;
}
}
if (storeResult != null)
storeResult.Value = equal;
if (equal && equalEvent != null)
Fsm.Event(equalEvent);
else if (notEqualEvent != null)
Fsm.Event(notEqualEvent);
}
}
}