Beispiel #1
0
    void LocomotionStateFSM()
    {
        Vector3 direction = Vector3.zero;

        if (input.ControlsActivated.Exists(
                x => x == PlayerInput.CONTROLS.W_HOLD ||
                x == PlayerInput.CONTROLS.S_HOLD ||
                x == PlayerInput.CONTROLS.A_HOLD ||
                x == PlayerInput.CONTROLS.D_HOLD))
        {
            direction = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
        }

        LOCOMOTIONSTATE prevLocState = locomotionState;

        //prioritize running over crouching

        if (input.ControlsActivated.Exists(x => x == PlayerInput.CONTROLS.SHIFT_HOLD))
        {
            if (locomotionState != LOCOMOTIONSTATE.RUNNING)
            {
                ChangeLocomotionState(LOCOMOTIONSTATE.RUNNING);
            }
        }
        else
        {
            if (locomotionState == LOCOMOTIONSTATE.RUNNING)
            {
                ChangeLocomotionState(LOCOMOTIONSTATE.WALKING);
            }
        }

        if (input.ControlsActivated.Exists(x => x == PlayerInput.CONTROLS.CTRL_TAP))
        {
            if (locomotionState == LOCOMOTIONSTATE.WALKING)
            {
                ChangeLocomotionState(LOCOMOTIONSTATE.CROUCHING);
            }
            else if (locomotionState == LOCOMOTIONSTATE.CROUCHING)
            {
                ChangeLocomotionState(LOCOMOTIONSTATE.WALKING);
            }
        }

        switch (locomotionState)
        {
        case LOCOMOTIONSTATE.WALKING:
            if (locomotionStateCallOnce)
            {
                if (prevLocState == LOCOMOTIONSTATE.CROUCHING)
                {
                    Uncrouch();
                }

                locomotionStateCallOnce = false;
            }
            MoveEntity(direction, walkSpeed);
            break;

        case LOCOMOTIONSTATE.RUNNING:
            if (locomotionStateCallOnce)
            {
                if (prevLocState == LOCOMOTIONSTATE.CROUCHING)
                {
                    Uncrouch();
                }

                locomotionStateCallOnce = false;
            }
            MoveEntity(direction, runSpeed);
            break;

        case LOCOMOTIONSTATE.CROUCHING:
            if (locomotionStateCallOnce)
            {
                Crouch();
                locomotionStateCallOnce = false;
            }
            MoveEntity(direction, crouchSpeed);
            break;
        }
    }
Beispiel #2
0
 public void ChangeLocomotionState(LOCOMOTIONSTATE state)
 {
     locomotionState         = state;
     locomotionStateCallOnce = true;
 }