< Summary

Class:DCL.Tutorial.TutorialStep
Assembly:Onboarding
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Tutorial/Scripts/TutorialStep.cs
Covered lines:2
Uncovered lines:56
Coverable lines:58
Total lines:168
Line coverage:3.4% (2 of 58)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
TutorialStep()0%110100%
TutorialStep()0%110100%
Awake()0%6200%
OnDestroy()0%6200%
OnStepStart()0%1561200%
OnStepExecute()0%6200%
OnStepPlayHideAnimation()0%56700%
OnStepFinished()0%30500%
OnShowAnimationFinish()0%6200%
OnHideAnimationFinish()0%2100%
PlayAndWaitForHideAnimation()0%20400%
ConfigureSkipOptions()0%30500%
YesSkipInputAction_OnFinished(...)0%6200%
NoSkipInputAction_OnFinished(...)0%20400%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Tutorial/Scripts/TutorialStep.cs

#LineLine coverage
 1using System;
 2using System.Collections;
 3using UnityEngine;
 4
 5namespace DCL.Tutorial
 6{
 7    /// <summary>
 8    /// Class that represents one of the steps included in the onboarding tutorial.
 9    /// </summary>
 10    public class TutorialStep : MonoBehaviour
 11    {
 112        protected static int STEP_FINISHED_ANIMATOR_TRIGGER = Animator.StringToHash("StepFinished");
 13
 14        internal event Action OnShowAnimationFinished;
 15        internal event Action OnJustAfterStepExecuted;
 16
 17        [SerializeField] internal bool unlockCursorAtStart = false;
 18        [SerializeField] internal bool show3DTeacherAtStart = false;
 19        [SerializeField] internal protected RectTransform teacherPositionRef;
 20        [SerializeField] internal GameObject mainSection;
 21        [SerializeField] internal GameObject skipTutorialSection;
 22        [SerializeField] internal InputAction_Hold yesSkipInputAction;
 23        [SerializeField] internal InputAction_Hold noSkipInputAction;
 24
 25        protected TutorialController tutorialController;
 26        internal Animator stepAnimator;
 27        internal MouseCatcher mouseCatcher;
 28        protected bool hideAnimationFinished = false;
 29        internal bool blockSkipActions = false;
 30
 2131        internal bool letInstantiation = true;
 32        private HUDCanvasCameraModeController hudCanvasCameraMode;
 33
 34        private void Awake()
 35        {
 036            var canvas = GetComponentInChildren<Canvas>();
 037            if (canvas != null)
 038                hudCanvasCameraMode = new HUDCanvasCameraModeController(canvas, DataStore.i.camera.hudsCamera);
 039        }
 40
 041        private void OnDestroy() { hudCanvasCameraMode?.Dispose(); }
 42
 43        /// <summary>
 44        /// Step initialization (occurs before OnStepExecute() execution).
 45        /// </summary>
 46        public virtual void OnStepStart()
 47        {
 048            tutorialController = TutorialController.i;
 049            stepAnimator = GetComponent<Animator>();
 50
 051            mouseCatcher = SceneReferences.i?.mouseCatcher;
 52
 053            if (unlockCursorAtStart)
 054                mouseCatcher?.UnlockCursor();
 55
 056            if (tutorialController != null)
 57            {
 058                tutorialController.ShowTeacher3DModel(show3DTeacherAtStart);
 59
 060                if (tutorialController.configuration.teacher != null)
 61                {
 062                    if (tutorialController.currentStepIndex > 0)
 063                        tutorialController.configuration.teacher.PlaySpeakSound();
 64                    else
 065                        tutorialController.configuration.teacher.PlayHappySound(1f);
 66                }
 67
 068                if (show3DTeacherAtStart && teacherPositionRef != null)
 69                {
 070                    tutorialController.SetTeacherPosition(teacherPositionRef.position);
 71
 072                    if (tutorialController.configuration.teacher != null &&
 73                        tutorialController.configuration.teacher.IsHiddenByAnimation)
 074                        tutorialController.configuration.teacher.PlayAnimation(TutorialTeacher.TeacherAnimation.Reset);
 75                }
 76            }
 77
 078            ConfigureSkipOptions();
 079        }
 80
 81        /// <summary>
 82        /// Executes the main flow of the step and waits for its finalization.
 83        /// </summary>
 84        /// <returns></returns>
 085        public virtual IEnumerator OnStepExecute() { yield break; }
 86
 87        /// <summary>
 88        /// Executes the final animation and waits for its finalization and for any camera blending.
 89        /// </summary>
 90        /// <returns></returns>
 91        public virtual IEnumerator OnStepPlayHideAnimation()
 92        {
 093            blockSkipActions = true;
 094            OnJustAfterStepExecuted?.Invoke();
 095            yield return PlayAndWaitForHideAnimation();
 096            yield return null;
 097            yield return new WaitUntil(() => !CommonScriptableObjects.cameraIsBlending.Get());
 098        }
 99
 100        /// <summary>
 101        /// Step finalization (occurs after OnStepExecute() execution).
 102        /// </summary>
 103        public virtual void OnStepFinished()
 104        {
 0105            if (mainSection != null &&
 106                skipTutorialSection != null &&
 107                yesSkipInputAction != null &&
 108                noSkipInputAction)
 109            {
 0110                yesSkipInputAction.OnFinished -= YesSkipInputAction_OnFinished;
 0111                noSkipInputAction.OnFinished -= NoSkipInputAction_OnFinished;
 112            }
 0113        }
 114
 0115        internal void OnShowAnimationFinish() { OnShowAnimationFinished?.Invoke(); }
 116
 117        /// <summary>
 118        /// Warn about the finalization of the hide animation of the step
 119        /// </summary>
 0120        internal void OnHideAnimationFinish() { hideAnimationFinished = true; }
 121
 122        private IEnumerator PlayAndWaitForHideAnimation()
 123        {
 0124            if (stepAnimator == null)
 0125                yield break;
 126
 0127            stepAnimator.SetTrigger(STEP_FINISHED_ANIMATOR_TRIGGER);
 0128            yield return new WaitUntil(() => hideAnimationFinished);
 0129        }
 130
 131        private void ConfigureSkipOptions()
 132        {
 0133            if (mainSection != null &&
 134                skipTutorialSection != null &&
 135                yesSkipInputAction != null &&
 136                noSkipInputAction)
 137            {
 0138                yesSkipInputAction.OnFinished += YesSkipInputAction_OnFinished;
 0139                noSkipInputAction.OnFinished += NoSkipInputAction_OnFinished;
 140            }
 0141        }
 142
 143        private void YesSkipInputAction_OnFinished(DCLAction_Hold action)
 144        {
 0145            if (skipTutorialSection.activeSelf)
 146            {
 0147                tutorialController.SkipTutorial();
 148            }
 0149        }
 150
 151        internal void NoSkipInputAction_OnFinished(DCLAction_Hold action)
 152        {
 0153            if (blockSkipActions)
 0154                return;
 155
 0156            if (mainSection.activeSelf)
 157            {
 0158                mainSection.SetActive(false);
 0159                skipTutorialSection.SetActive(true);
 160            }
 0161            else if (skipTutorialSection.activeSelf)
 162            {
 0163                mainSection.SetActive(true);
 0164                skipTutorialSection.SetActive(false);
 165            }
 0166        }
 167    }
 168}