private static void SetSwipeAnimation(SwipeInput.SwipeType swipeType)
    {
        string trigger = "";

        swipeAnimator.SetBool(leftTrigger, false);
        swipeAnimator.SetBool(rightTrigger, false);
        swipeAnimator.SetBool(upTrigger, false);
        swipeAnimator.SetBool(downTrigger, false);
        switch (swipeType)
        {
        case SwipeInput.SwipeType.Left:
            trigger = leftTrigger;
            break;

        case SwipeInput.SwipeType.Right:
            trigger = rightTrigger;
            break;

        case SwipeInput.SwipeType.Up:
            trigger = upTrigger;
            break;

        case SwipeInput.SwipeType.Down:
            trigger = downTrigger;
            break;

        case SwipeInput.SwipeType.Tap:
            break;
        }
        swipeAnimator.SetBool(trigger, true);
    }
        private void OnSwipe(SwipeInput.SwipeType swipeType)
        {
            if (_isUnderControl == false)
            {
                return;
            }
            switch (swipeType)
            {
            case SwipeInput.SwipeType.Up:
                StartJump();
                break;

            case SwipeInput.SwipeType.Down:
                StartSlide();
                break;

            case SwipeInput.SwipeType.Tap:
                break;

            case SwipeInput.SwipeType.Left:
            case SwipeInput.SwipeType.Right:
                ChangePath(swipeType);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(swipeType), swipeType, null);
            }
        }
        private void ChangePath2(SwipeInput.SwipeType swipeType)
        {
            var targetLine = currentRoadId;

            switch (swipeType)
            {
            case SwipeInput.SwipeType.Left:
                targetLine = Mathf.Clamp(--targetLine, 0, levelHolder._lines.Length - 1);
                break;

            case SwipeInput.SwipeType.Right:
                targetLine = Mathf.Clamp(++targetLine, 0, levelHolder._lines.Length - 1);
                break;
            }
            if (targetLine == currentRoadId)
            {
                return;
            }
            var p0 = _follower.result;                                                                                         // point on current spline
            var p1 = levelHolder._lines[targetLine].Evaluate(levelHolder._lines[targetLine].Project(p0.position));             // closest point on side line
            var d  = p0.position - p1.position;

            if (!PlayerMover.CheckLineSwap(levelHolder._lines[targetLine], p0, levelHolder._lineWidth))
            {
                return;
            }
            OnTrackChange?.Invoke(currentRoadId, targetLine);
            currentRoadId = targetLine;
            d.Normalize();
            var d2 = new Vector2(Vector3.Dot(d, p1.right), Vector3.Dot(d, p1.normal));             // offset is [X * point.right + Y * point.normal]

            _follower.computer   = levelHolder._lines[currentRoadId];
            _changeRoadCoroutine = StartCoroutine(SwitchLine(d2));
        }
 public static void OnTutorialTriggerEnter(ITutorialObject tutorial, SwipeInput.SwipeType expectedType, bool finishTutorial)
 {
     swipe.Activate();
     SetSwipeAnimation(expectedType);
     tutorial.Activate();
     expectedSwipeType          = expectedType;
     SwipeInput.OnPlayerSwiped += WaitForSwipe;
     PauseController.SetPause();
     ControllManager.Instance.RemoveControl();
     isFinishTutorial = finishTutorial;
 }
 private static void TutorialCondition(SwipeInput.SwipeType swipeType)
 {
     if (swipeType == expectedSwipeType)
     {
         SwipeInput.OnPlayerSwiped -= WaitForSwipe;
         PauseController.Resume();
         ControllManager.Instance.GiveControl();
         OnTutorialFakeInput?.Invoke(swipeType);
         swipe.Deactivate();
         if (isFinishTutorial == false)
         {
             ControllManager.Instance.RemoveControl();
         }
     }
 }
        private void ChangePath(SwipeInput.SwipeType swipeType)
        {
            if (_changeRoadCoroutine != null)
            {
                return;
            }
            var targetLine = currentRoadId;

            switch (swipeType)
            {
            case SwipeInput.SwipeType.Left:
                targetLine = Mathf.Clamp(--targetLine, 0, levelHolder._lines.Length - 1);
                break;

            case SwipeInput.SwipeType.Right:
                targetLine = Mathf.Clamp(++targetLine, 0, levelHolder._lines.Length - 1);
                break;
            }
            if (targetLine == currentRoadId)
            {
                return;
            }

            var p0 = _follower.result;             // point on current spline

            if (CheckLineSwap(levelHolder._lines[targetLine], p0, levelHolder._lineWidth))
            {
                _followCamera._isActive = false;
                var p1 = levelHolder._lines[targetLine].Evaluate(levelHolder._lines[targetLine].Project(p0.position));                 // closest point on side line
                var d  = p0.position - p1.position;
                d.Normalize();
                currentRoadId      = targetLine;
                _follower.enabled  = false;
                _follower.computer = levelHolder._lines[currentRoadId];
                var d2 = new Vector2(Vector3.Dot(d, p1.right), Vector3.Dot(d, p1.normal));                 // offset is [X * point.right + Y * point.normal]
                _follower.motion.offset = d2;
                _changeRoadCoroutine    = StartCoroutine(SwitchLine(d2));
            }
        }
 private static void WaitForSwipe(SwipeInput.SwipeType swipeType)
 {
     TutorialCondition(swipeType);
 }
 void IOpponentMover.ChangePath(SwipeInput.SwipeType swipeType) => ChangePath2(swipeType);