private void Update() { if (Time.timeScale == 0) { return; } // check alive #region check alive if (Alive == false) { Locked = true; Rbody2D.velocity = new Vector2(0, Rbody2D.velocity.y); if (!IsDead) { MoveAnim.SetBool("dead", true); goToDead(-1f); } } #endregion // Hunger #region Hunger if (TC.Minutes - TimeOnHold >= 1) { CurrentHungerValue -= HungerCost; TimeOnHold = TC.Minutes; } if (CurrentHungerValue <= 0) { CurrentHungerValue = 0; if (!BM.containsBuff("Hungry0")) { BM.addBuff(BuffStock.findBuff("Hungry0")); } } else if (CurrentHungerValue >= TotalHungerValue) { CurrentHungerValue = TotalHungerValue; } #endregion // go to crouch #region go to crouch if ((Input.GetKeyDown(KeyCodeList.Instance.Crouch)) && OnGround == true && CurrentState != StateEnum.ATTACK) { IsCrouching = true; } else if (Input.GetKeyUp(KeyCodeList.Instance.Crouch) && CurrentState != StateEnum.ATTACK) { IsCrouching = false; } if (IsCrouching == true) { updateState(StateEnum.CROUCH); } else if (CurrentState == StateEnum.CROUCH) { finishCrouch(); } #endregion // operation #region operation if (Locked == false && IsRolling == false && IsCrouching == false) { // go to jump #region go to jump if (Input.GetKeyDown(KeyCodeList.Instance.Jump) && CurrentState != StateEnum.ATTACK && IsHealing == false && IsSpeeling == false) { if (OnGround == true && OnWall == false) { IsJumping = true; OnGround = false; updateState(StateEnum.JUMP, Direction, CurrentSpeed, CurrentJumpForce * (1 + (CurrentSpeed - WalkingSpeed) * 0.1f)); } else if (ExtraJumpCount > 0 && IsSpeeling == false) { // extra jump if (CurrentEnergy >= JumpCost) { ExtraJumpCount--; CurrentEnergy -= JumpCost; Rbody2D.velocity = new Vector2(0, 0); updateState(StateEnum.JUMP, Direction, CurrentSpeed, CurrentJumpForce * ExtraJumpMultiple); } } } #endregion // jump higher #region jump higher if (Input.GetKey(KeyCodeList.Instance.Jump) && IsJumping == true) { if (CurrentJumpDuration > 0) { Rbody2D.velocity += Vector2.up * CurrentJumpForce * DeltaJumpForcePercent; CurrentJumpDuration -= Time.deltaTime; } else { IsJumping = false; } } if (Input.GetKeyUp(KeyCodeList.Instance.Jump)) { IsJumping = false; } #endregion // go to attack #region go to attack if (ChainsDuration > 0) { ChainsDuration -= Time.deltaTime; } else { ChainsDuration = 0; AttackNum = 0; } if (CurrentCoolDown < CoolDown) { // 更新冷却 CurrentCoolDown += Time.deltaTime; } if (CurrentCoolDown >= CoolDown && !IsRolling && !IsHealing) { if (Input.GetKeyDown(KeyCodeList.Instance.Attack) && OnGround == true) { if (IsDashing) { finishDash(); } // 重置冷却时间 CurrentCoolDown = 0; if (ChainsDuration > 0) { // 连续攻击 if (AttackNum < MaxAttackNum) { AttackNum++; ChainsDuration = MaxChainsDuration; } else { AttackNum = 0; ChainsDuration = MaxChainsDuration; } } else { // 超时,重置 AttackNum = 0; ChainsDuration = MaxChainsDuration; } updateState(StateEnum.ATTACK, Direction, CurrentSpeed, CurrentJumpForce, true, AttackEnum.NORMAL_ATTACK); Skill = AttackEnum.NORMAL_ATTACK; } if (Input.GetKeyDown(KeyCodeList.Instance.Attack) && OnGround == false && !IsSpeeling) { // 重置冷却时间 CurrentCoolDown = 0; updateState(StateEnum.ATTACK, Direction, CurrentSpeed, CurrentJumpForce, true, AttackEnum.JUMP_ATTACK); Skill = AttackEnum.JUMP_ATTACK; } if (Input.GetKeyDown(KeyCodeList.Instance.Attack) && OnWall == true) { // 重置冷却时间 CurrentCoolDown = 0; updateState(StateEnum.ATTACK, Direction, CurrentSpeed, CurrentJumpForce, true, AttackEnum.SPEEL_ATTACK); Skill = AttackEnum.SPEEL_ATTACK; } } #endregion //roll #region roll if (/*CurrentState != StateEnum.ATTACK && */ !IsRolling && !IsHealing && checkGround() && CurrentEnergy >= RollingCost && Input.GetKeyDown(KeyCodeList.Instance.Roll)) { if (IsDashing) { finishDash(); } else { CurrentEnergy -= RollingCost; } IsRolling = true; if (CurrentState == StateEnum.ATTACK) { finishAttack(Skill); } MoveAnim.SetBool("roll", true); ChainsDuration = MaxChainsDuration; } #endregion // dash #region dash if (IsRunning && Input.GetKey(KeyCodeList.Instance.Dash) && checkGround() && !IsHealing) { if (CurrentEnergy > 0) { IsDashing = true; CurrentEnergy -= Time.deltaTime * DashingCost; } else { finishDash(); } } else { finishDash(); } #endregion } #endregion // cure energy #region cure energy if (!IsDashing && !IsRolling && !(IsRunning && OnGround) && !(IsJumping && ExtraJumpCount < MaxExtraJumpCount)) { CurrentEnergy += Time.deltaTime * EnergyCure; if (CurrentEnergy > TotalEnergy) { CurrentEnergy = TotalEnergy; } else if (CurrentEnergy < 0) { CurrentEnergy = 0; } } #endregion // cure shield #region cure shield if (CurrentShieldValue < 0) { CurrentShieldValue = 0; } else if (CurrentShieldValue < TotalShieldValue) { CurrentShieldValue += Time.deltaTime * ShieldCure; } else if (CurrentShieldValue > TotalShieldValue) { CurrentShieldValue = TotalShieldValue; } #endregion }