public bool CrouchToWalk(Crouching crouching, Walking walking)
 {
     return(walking.IsWalking() && !crouching.ToSprint && !crouching.IsCrouching && !crouching.Rising);
 }
 public bool JumpToWalk(Jumping jumping, Walking walking, bool preserveSprint)
 {
     return(!jumping.IsJumping() && !jumping.ToSlide && !preserveSprint && walking.IsWalking());
 }
 public bool WallRunToWalk(Jumping jumping, Walking walking, bool isWallRunning)
 {
     return(!isWallRunning &&
            !jumping.IsJumping() &&
            walking.IsWalking());
 }
    private void Awake()
    {
        Player player = FindObjectOfType <Player>();

        _characterController = GetComponent <CharacterController>();
        _stateHelper         = new PlayerMovementStateMachineHelper();
        _stateMachine        = new BaseStateMachine();
        _playerLookVars      = new PlayerLookVars();

        // Hook into the BaseStateMachine OnStateChanged event
        _stateMachine.OnStateChanged += HandleStateChanged;

        // Prepare our StateParams for passing to all of our states
        _stateParams                 = new StateParams();
        _stateParams.Velocity        = _velocity;
        _stateParams.GravityOverride = defaultGravity;

        // Create our states
        Idle        idle        = new Idle(player);
        Walking     walking     = new Walking(player);
        Sprinting   sprinting   = new Sprinting(player);
        Jumping     jumping     = new Jumping(player);
        WallRunning wallRunning = new WallRunning(player, defaultGravity);
        Crouching   crouching   = new Crouching(player);
        Sliding     sliding     = new Sliding(player);

        // Create our state transitions
        // Any -> Idle
        _stateMachine.AddAnyTransition(idle, () => _stateHelper.ToIdle(idle, jumping, crouching, sliding));
        // Any -> Jumping
        _stateMachine.AddAnyTransition(jumping, () => _stateHelper.ToJump(jumping, _isWallRunning, _stateParams.WallJumped));

        // Idle -> Walking
        _stateMachine.AddTransition(idle, walking, () => walking.IsWalking());
        // Walking -> Sprinting
        _stateMachine.AddTransition(walking, sprinting, () => PlayerInput.Instance.ShiftDown);
        // Sprinting -> Walking
        _stateMachine.AddTransition(sprinting, walking, () => !sprinting.IsStillSprinting());

        // Idle -> Crouching
        _stateMachine.AddTransition(idle, crouching, () => PlayerInput.Instance.CrouchDown);
        // Walking -> Crouching
        _stateMachine.AddTransition(walking, crouching, () => PlayerInput.Instance.CrouchDown);
        // Crouching -> Walking
        _stateMachine.AddTransition(crouching, walking, () => _stateHelper.CrouchToWalk(crouching, walking));
        // Crouching -> Sprinting
        _stateMachine.AddTransition(crouching, sprinting, () => _stateHelper.CrouchToSprint(crouching));
        // Sprinting -> Sliding (Crouching)
        _stateMachine.AddTransition(sprinting, sliding, () => PlayerInput.Instance.CrouchDown);

        // Jumping -> Sliding
        _stateMachine.AddTransition(jumping, sliding, () => _stateHelper.JumpToSlide(jumping));
        // Jumping -> Sprinting
        _stateMachine.AddTransition(jumping, sprinting, () => _stateHelper.JumpToSprint(jumping, _preserveSprint));
        // Jumping -> Walking
        _stateMachine.AddTransition(jumping, walking, () => _stateHelper.JumpToWalk(jumping, walking, _preserveSprint));
        // Jumping -> Wall Running
        _stateMachine.AddTransition(jumping, wallRunning, () => _isWallRunning);

        // Wall Running -> Sprinting
        _stateMachine.AddTransition(wallRunning, jumping, () => _stateHelper.WallRunToSprint(jumping, _isWallRunning, _preserveSprint));
        // Wall Running -> Walking
        _stateMachine.AddTransition(wallRunning, jumping, () => _stateHelper.WallRunToWalk(jumping, walking, _isWallRunning));

        // Default to Idle
        _stateParams = _stateMachine.SetState(idle, _stateParams);
    }