bool CheckIfAbortOnStateCondition(PlayerController.PlayerStates newState) { bool returnVal = false; switch (newState) { case PlayerController.PlayerStates.idle: break; case PlayerController.PlayerStates.left: break; case PlayerController.PlayerStates.right: break; case PlayerController.PlayerStates.jump: break; case PlayerController.PlayerStates.landing: break; case PlayerController.PlayerStates.falling: break; case PlayerController.PlayerStates.kill: break; case PlayerController.PlayerStates.resurrect: break; case PlayerController.PlayerStates.firingWeapon: if (PlayerController.stateDelayTimer[(int)PlayerController.PlayerStates.firingWeapon] > Time.time) { returnVal = true; } break; } // True means 'Abort', false means 'Continue' return(returnVal); }
bool CheckForValidStatePair(PlayerController.PlayerStates newState) { bool returnVal = false; switch (currentState) { case PlayerController.PlayerStates.idle: // From idle you can go to any state returnVal = true; break; case PlayerController.PlayerStates.left: // From left you can go to any state FacinRight = 0; returnVal = true; break; case PlayerController.PlayerStates.right: // From right you can go to any state FacinRight = 1; returnVal = true; break; case PlayerController.PlayerStates.jump: // From jump you can go to the next step if certain conditions are met if (newState == PlayerController.PlayerStates.falling || newState == PlayerController.PlayerStates.kill || newState == PlayerController.PlayerStates.firingWeapon) { returnVal = true; } else if (!IsNextToWall() && (newState == PlayerController.PlayerStates.left || newState == PlayerController.PlayerStates.right) || ((transform.localScale.x < 0 && previousState == PlayerController.PlayerStates.right && newState == PlayerController.PlayerStates.right) || (transform.localScale.x > 0 && previousState == PlayerController.PlayerStates.left && newState == PlayerController.PlayerStates.left))) { returnVal = true; } else { returnVal = false; } break; case PlayerController.PlayerStates.landing: // You get how this works if (newState == PlayerController.PlayerStates.left || newState == PlayerController.PlayerStates.right || newState == PlayerController.PlayerStates.idle || newState == PlayerController.PlayerStates.firingWeapon) { returnVal = true; } else { returnVal = false; } break; case PlayerController.PlayerStates.falling: if (newState == PlayerController.PlayerStates.landing || newState == PlayerController.PlayerStates.kill || newState == PlayerController.PlayerStates.firingWeapon || newState == PlayerController.PlayerStates.right || newState == PlayerController.PlayerStates.left) { returnVal = true; } else { returnVal = false; } break; case PlayerController.PlayerStates.kill: if (newState == PlayerController.PlayerStates.resurrect) { returnVal = true; } else { returnVal = false; } break; case PlayerController.PlayerStates.resurrect: if (newState == PlayerController.PlayerStates.idle) { returnVal = true; } else { returnVal = false; } break; case PlayerController.PlayerStates.firingWeapon: returnVal = true; break; } return(returnVal); }
public void OnStateChange(PlayerController.PlayerStates newState) { if (newState == currentState) { return; } if (CheckIfAbortOnStateCondition(newState)) { return; } if (!CheckForValidStatePair(newState)) { return; } switch (newState) { case PlayerController.PlayerStates.idle: anim.SetBool("Walking", false); break; case PlayerController.PlayerStates.left: case PlayerController.PlayerStates.right: if (IsGrounded()) { //Debug.Log("Entrei em Walking"); anim.SetBool("Walking", true); } else { anim.SetBool("Walking", false); } break; case PlayerController.PlayerStates.jump: if ((/*playerHasLanded && */ IsGrounded()) || (!IsGrounded() && IsNextToWall())) { anim.SetBool("isOnWall", false); anim.SetBool("Landing", false); anim.SetBool("Jumping", true); if (IsNextToWall()) { jumpingFromWall = true; } r2d.AddForce(new Vector2(r2d.velocity.x, jumpForce) * moveSpeed * Time.deltaTime, ForceMode2D.Impulse); //playerHasLanded = false; } break; case PlayerController.PlayerStates.landing: anim.SetBool("Falling", false); anim.SetBool("Landing", true); //playerHasLanded = true; break; case PlayerController.PlayerStates.falling: anim.SetBool("Falling", true); anim.SetBool("Jumping", false); break; case PlayerController.PlayerStates.kill: break; case PlayerController.PlayerStates.resurrect: //transform.position = playerRespawnPoint.transform.position; //transform.rotation = Quaternion.identity; //rotacio: cap //GetComponent<Rigidbody2D>().velocity = Vector2.zero; //velocitat lineal: zero break; case PlayerController.PlayerStates.firingWeapon: PlayerController.stateDelayTimer[(int)PlayerController.PlayerStates.firingWeapon] = Time.time + 0.2f; GameObject newBullet = Instantiate(bulletPrefab); //Debug.Log(transform.localScale * 4); if (IsNextToWall()) { newBullet.transform.localScale = -transform.localScale * 4; } else { newBullet.transform.localScale = transform.localScale * 4; } newBullet.transform.position = bulletSpawn.position; BulletController bullCon = newBullet.GetComponent <BulletController>(); bullCon.ShootBullet(); OnStateChange(currentState); break; } previousState = currentState; currentState = newState; }