You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:26:04