/// <summary>
 /// Returns whether the current gameobject contains any transitions.
 /// </summary>
 /// <param name="gameObject"></param>
 /// <returns></returns>
 public static bool ContainsTransition(UnityEngine.GameObject gameObject)
 {
     var transitionBases = gameObject.GetComponents<TransitionBase>();
     return transitionBases.Length != 0;
 }
        static List<TransitionBase> TransitionOut(UnityEngine.GameObject gameObject, bool isRecursiveCall)
        {
            var transitionBases = gameObject.GetComponents<TransitionBase>();
            var transitionList = new List<TransitionBase>();
            var callRecursive = false;

            // transition out transition items.
            foreach (var transitionBase in transitionBases)
            {
                // if first invoked on this gameobject, or don't need to trigger direct transition direct.
                if (transitionBase.isActiveAndEnabled && (isRecursiveCall == false || !transitionBase.TransitionOutConfig.MustTriggerDirect))
                {
                    transitionBase.TransitionOut();
                    transitionList.Add(transitionBase);
                    // if we should transition children then set recursive flag
                    if (transitionBase.TransitionOutConfig.TransitionChildren)
                        callRecursive = true;
                }
            }

            // if no transition items, or recursive call then process all child gameobjects
            if (transitionBases.Length == 0 || callRecursive)
            {
                for (var i = 0; i < gameObject.transform.childCount; i++)
                {
                    var transform = gameObject.transform.GetChild(i);
                    transitionList.AddRange(TransitionOut(transform.gameObject, true));
                }
            }

            return transitionList;
        }