Unity/C#回合制游戏反隐技能冷却与生效周期优化实现问询
Unity回合制反隐技能代码优化思路
你的需求是实现一项反隐技能:让隐身舰船在指定回合内显形,随后进入指定回合冷却,冷却结束可再次生效,每回合通过TakeTurn函数驱动逻辑。原代码嵌套分支较多,状态管理依赖多个变量,可读性和维护性较差,以下是几种优化思路和实现方案:
原代码回顾
public void TakeTurn() { if (nTurnsCooling < N_TURNS_COOLDOWN && !active) { nTurnsCooling++; } else { active = true; if (nTurnsActive < N_TURNS_TO_REVEAL_CLOAKED_SHIPS) { foreach (var ship in shipsBeingAffected) { ship.DecloakShip(); } nTurnsActive++; } else { active = false; nTurnsActive = 0; } nTurnsCooling = 0; } }
核心优化方向
1. 用枚举明确技能状态,消除嵌套分支
原代码通过active布尔值+两个计数器管理状态,容易出现逻辑混乱。改用枚举定义技能的三种核心状态(就绪、生效中、冷却中),让逻辑分支更清晰:
private enum SkillState { Ready, // 可触发 Active, // 显形生效中 Cooldown // 冷却中 } // 配置参数 [SerializeField] private int activeTurns = 3; // 显形持续回合数 [SerializeField] private int cooldownTurns = 5; // 冷却回合数 // 状态管理变量 private SkillState _currentState = SkillState.Ready; private int _remainingTurns;
2. 扁平状态流转逻辑,简化TakeTurn实现
基于枚举状态,用switch-case实现线性的状态流转,避免多层嵌套:
public void TakeTurn() { switch (_currentState) { case SkillState.Ready: // 自动触发技能(若为手动触发,可将此逻辑移到单独的CastSkill方法) _currentState = SkillState.Active; _remainingTurns = activeTurns; RevealCloakedShips(); break; case SkillState.Active: RevealCloakedShips(); _remainingTurns--; if (_remainingTurns <= 0) { // 显形结束,进入冷却 _currentState = SkillState.Cooldown; _remainingTurns = cooldownTurns; } break; case SkillState.Cooldown: _remainingTurns--; if (_remainingTurns <= 0) { // 冷却结束,回到就绪状态 _currentState = SkillState.Ready; } break; } } // 抽离重复的显形逻辑,便于维护 private void RevealCloakedShips() { foreach (var ship in shipsBeingAffected) { ship.DecloakShip(); } }
3. 额外优化点
- 减少重复调用:如果
DecloakShip是一次性生效(比如调用后舰船保持显形直到技能结束),可只在进入Active状态时调用一次,无需每回合重复执行,降低性能消耗。 - 手动触发支持:若技能需要玩家手动释放,可新增
CastSkill()方法,仅当技能处于Ready状态时允许切换到Active状态,TakeTurn只负责倒计时逻辑。 - 变量命名规范:用更直观的命名替代原代码的缩写(比如
nTurnsCooling改为_remainingCooldown),提升代码可读性。
内容的提问来源于stack exchange,提问作者Jacob Jackson
相关产品推荐
相关产品推荐

