// (c) Copyright HutongGames, LLC 2010-2018. All rights reserved. namespace HutongGames.PlayMaker.Actions { [ActionCategory(ActionCategory.Logic)] [Tooltip("Tests if 2 Array Variables have the same values.")] public class ArrayCompare : FsmStateAction { [RequiredField] [UIHint(UIHint.Variable)] [Tooltip("The first Array Variable to test.")] public FsmArray array1; [RequiredField] [UIHint(UIHint.Variable)] [Tooltip("The second Array Variable to test.")] public FsmArray array2; [Tooltip("Event to send if the 2 arrays have the same values.")] public FsmEvent SequenceEqual; [Tooltip("Event to send if the 2 arrays have different values.")] public FsmEvent SequenceNotEqual; [UIHint(UIHint.Variable)] [Tooltip("Store the result in a Bool variable.")] public FsmBool storeResult; [Tooltip("Repeat every frame.")] public bool everyFrame; public override void Reset() { array1 = null; array2 = null; SequenceEqual = null; SequenceNotEqual = null; } public override void OnEnter() { DoSequenceEqual(); if (!everyFrame) { Finish(); } } private void DoSequenceEqual() { if (array1.Values == null || array2.Values == null) return; // Try to avoid Linq in runtime code. Editor is fine. //storeResult.Value = array1.Values.SequenceEqual(array2.Values); storeResult.Value = TestSequenceEqual(array1.Values, array2.Values); Fsm.Event(storeResult.Value ? SequenceEqual : SequenceNotEqual); } // NOTE: replaces Linq SequenceEqual. Trying to avoid Linq in runtime code. private bool TestSequenceEqual(object[] _array1, object[] _array2) { if (_array1.Length != _array2.Length) return false; for (var i = 0; i < array1.Length; i++) { if (!_array1[i].Equals(_array2[i])) return false; } return true; } } }