private void StopRoutine(RoutineActivity transformation)
 {
     if (transformation.routine != null)
     {
         StopCoroutine(transformation.routine);
     }
     transformation.isActive = false;
 }
 private static void StopCoroutine(RoutineActivity routineActivity)
 {
     if (routineActivity.coroutine != null)
     {
         routineActivity.monoBehaviour.StopCoroutine(routineActivity.coroutine);
     }
     routineActivity.isActive = false;
 }
 private static IEnumerator ComposeRoutineWithCallback(MonoBehaviour mb, RoutineActivity activity, IEnumerator routine, System.Action onFinished)
 {
     activity.isActive = true;
     while (activity.isActive && routine.MoveNext())
     {
         yield return(routine.Current);
     }
     //yield return routine;
     activity.isActive = false;
     onFinished?.Invoke();
 }
        public void StartTransformation(IEnumerator routine, TransformationType type, System.Action onFinished = null)
        {
            RoutineActivity transformation = null;

            bool isTranslation = type.HasFlag(TransformationType.Translate);
            bool isRotation    = type.HasFlag(TransformationType.Rotate);
            bool isScaling     = type.HasFlag(TransformationType.Scale);

            // For readability: if need better perf, just move to the branches?
            if (isTranslation)
            {
                StopTranslation();
            }
            if (isRotation)
            {
                StopRotation();
            }
            if (isScaling)
            {
                StopScaling();
            }

            if (isTranslation)
            {
                StopTranslation();
                transformation = translation;
                if (isRotation)
                {
                    rotation = transformation;
                }
                if (isScaling)
                {
                    scaling = transformation;
                }
            }
            else if (isRotation)
            {
                transformation = rotation;
                if (isScaling)
                {
                    scaling = transformation;
                }
            }
            else
            {
                transformation = scaling;
            }

            StartRoutine(routine, transformation, onFinished);
        }
        public static void StopCoroutine(MonoBehaviour mb, string tag)
        {
            if (!routinesMap.ContainsKey(mb))
            {
                return;
            }

            RoutineActivity current = null;

            // Stop an already running coroutine if present
            bool isPresent = routinesMap[mb].TryGetValue(tag, out current);

            if (isPresent)
            {
                //Trace.Script("Stopping " + tag);
                current.Stop();
            }
        }
        public static void StartCoroutine(MonoBehaviour mb, IEnumerator routine, string tag, System.Action onFinished = null)
        {
            RoutineActivity current = null;

            // Check if this monobehaviour has already been used before
            if (!routinesMap.ContainsKey(mb))
            {
                routinesMap.Add(mb, new Dictionary <string, RoutineActivity>());
            }

            // Stop an already running coroutine if present
            bool isPresent = routinesMap[mb].TryGetValue(tag, out current);

            if (isPresent)
            {
                current.Stop();
            }
            // Otherwise add it to the list
            else
            {
                current = new RoutineActivity(mb);
                routinesMap[mb].Add(tag, current);
            }

            // Now add/replace the current routine
            if (onFinished != null)
            {
                IEnumerator composedRoutine = ComposeRoutineWithCallback(mb, current, routine, onFinished);
                if (mb.isActiveAndEnabled)
                {
                    current.coroutine = mb.StartCoroutine(composedRoutine);
                }
            }
            else
            {
                if (mb.isActiveAndEnabled)
                {
                    current.coroutine = mb.StartCoroutine(routine);
                }
            }

            // Start it
            //Trace.Script("Starting " + tag);
        }
        private void StartRoutine(IEnumerator newRoutine, RoutineActivity transformation, System.Action onFinished = null)
        {
            StopRoutine(transformation);

            if (newRoutine == null)
            {
                return;
            }

            transformation.routine = newRoutine;

            // If there's a callback to be called when this routine stops
            if (onFinished != null)
            {
                StartCoroutine(StartRoutineWithCallback(newRoutine, onFinished));
            }
            // Otherwise just start it
            else
            {
                StartCoroutine(newRoutine);
            }
            transformation.isActive = true;
        }