public virtual void ReceiveCompleteTrigger(TutoriaCompletelTrigger trigger)
 {
     if (trigger == completeTrigger)
     {
         DoComplete();
     }
 }
        protected void OnTriggerSettingGUI()
        {
            State skipState = (State)EditorGUILayout.EnumPopup(new GUIContent("Skip State", "Skip this task for specfic states"), _tt.skipState);

            if (skipState != _tt.skipState)
            {
                EditorUtility.SetDirty(_tt);
                Undo.RegisterCompleteObjectUndo(_tt, "Reassign skip state");
                _tt.skipState = skipState;
            }

            if (isCompletedTriggerEditable)
            {
                TutoriaCompletelTrigger completeTrigger = (TutoriaCompletelTrigger)EditorGUILayout.EnumPopup(new GUIContent("Complete Trigger", "How this be triggered to complete"), _tt.completeTrigger);
                if (completeTrigger != _tt.completeTrigger)
                {
                    EditorUtility.SetDirty(_tt);
                    Undo.RegisterCompleteObjectUndo(_tt, "Reassign complete trigger");
                    _tt.completeTrigger = completeTrigger;
                }
            }
            else
            {
                EditorGUI.BeginDisabledGroup(true);
                EditorGUILayout.EnumPopup(new GUIContent("Complete Trigger", string.Format("How this be triggered to complete, not editable for {0}.", target.GetType())), _tt.completeTrigger);
                _tt.completeTrigger = forceCompleteTrigger;
                EditorGUI.EndDisabledGroup();
            }

            float timeoutSeconds = EditorGUILayout.FloatField(new GUIContent("Timeout Seconds", "A timeout seconds to force complete this step, if complete trigger is not fired."), _tt.timeoutSeconds);

            if (timeoutSeconds != _tt.timeoutSeconds)
            {
                EditorUtility.SetDirty(_tt);
                Undo.RegisterCompleteObjectUndo(_tt, "Reassign Timeout Seconds");
                _tt.timeoutSeconds = timeoutSeconds;
            }

            if (_tt.timeoutSeconds > 0)
            {
                bool completeTutorialIfTimeout = EditorGUILayout.Toggle(new GUIContent("Complete Tutorial If Timeout", "Complete the whole tutorial if this step timeout."), _tt.completeTutorialIfTimeout);
                if (completeTutorialIfTimeout != _tt.completeTutorialIfTimeout)
                {
                    EditorUtility.SetDirty(_tt);
                    Undo.RegisterCompleteObjectUndo(_tt, "Reassign Complete Tutorial If Timeout");
                    _tt.completeTutorialIfTimeout = completeTutorialIfTimeout;
                }
            }

            float minEnabledSeconds = EditorGUILayout.FloatField(new GUIContent("Min Enabled Seconds", "A minimum seconds between start and complete, use this to avoid flicker."), _tt.minEnabledSeconds);

            if (minEnabledSeconds != _tt.minEnabledSeconds)
            {
                EditorUtility.SetDirty(_tt);
                Undo.RegisterCompleteObjectUndo(_tt, "Reassign Min Enabled Seconds");
                _tt.minEnabledSeconds = minEnabledSeconds;
            }
        }
 private static void FireCompleteTrigger(TutorialStep ts, TutoriaCompletelTrigger trigger)
 {
     if (ts != null)
     {
         foreach (TutorialTask tt in ts.tasks)
         {
             tt.ReceiveCompleteTrigger(trigger);
         }
     }
 }
        public static void FireCompleteTrigger(TutoriaCompletelTrigger trigger)
        {
            if (currentTutorial != null && currentTutorial.isRunning)
            {
                FireCompleteTrigger(currentTutorial.currentStep, trigger);
                return;
            }

#if UNITY_EDITOR
            // For development only when TutorialStep is drag to edit without using TutorialManager and currentTutorial=null
            TutorialStep ts = Object.FindObjectOfType <TutorialStep>();
            if (ts != null)
            {
                FireCompleteTrigger(ts, trigger);
            }
#endif
        }