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; } }
public void ChangeLocomotionState(LOCOMOTIONSTATE state) { locomotionState = state; locomotionStateCallOnce = true; }