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

如何在C#中不使用大量数组精简重复的技能冷却代码?

多技能冷却逻辑的精简实现方案(无大量数组)

核心思路

将每个技能的冷却状态(isCooldown、cooldownTimer、冷却时长等)单独封装,用一个统一容器管理所有技能的状态,避免多数组同步的冗余和冲突,同时复用通用的冷却更新/检查函数。


方法1:用对象/字典封装单技能状态(适合脚本语言)

以JavaScript为例,用对象存储单个技能的冷却属性,再通过字典映射所有技能:

// 初始化所有技能的冷却状态,key为技能标识
const skillCooldowns = {
  fireBall: { isCooldown: false, cooldownTimer: 0, duration: 5 },
  frostNova: { isCooldown: false, cooldownTimer: 0, duration: 8 },
  thunderStrike: { isCooldown: false, cooldownTimer: 0, duration: 10 },
  heal: { isCooldown: false, cooldownTimer: 0, duration: 15 }
};

// 通用冷却更新函数
function updateCooldown(skillName, deltaTime) {
  const skill = skillCooldowns[skillName];
  if (skill.isCooldown) {
    skill.cooldownTimer -= deltaTime;
    if (skill.cooldownTimer <= 0) {
      skill.isCooldown = false;
      skill.cooldownTimer = 0;
    }
  }
}

// 通用技能释放检查函数
function canCastSkill(skillName) {
  const skill = skillCooldowns[skillName];
  if (!skill.isCooldown) {
    skill.isCooldown = true;
    skill.cooldownTimer = skill.duration;
    return true;
  }
  return false;
}
  • 优势:每个技能状态独立封装,不会出现逻辑冲突;仅用一个容器管理,空间占用远低于多数组;新增技能只需在字典中添加新对象,无需修改核心函数。

方法2:用自定义类封装冷却逻辑(适合面向对象语言)

以Python为例,通过类封装冷却属性与行为,实例化每个技能的冷却对象:

class SkillCooldown:
    def __init__(self, duration):
        self.is_cooldown = False
        self.cooldown_timer = 0
        self.duration = duration

    # 内置冷却更新方法
    def update(self, delta_time):
        if self.is_cooldown:
            self.cooldown_timer -= delta_time
            if self.cooldown_timer <= 0:
                self.is_cooldown = False
                self.cooldown_timer = 0

    # 内置释放检查方法
    def can_cast(self):
        if not self.is_cooldown:
            self.is_cooldown = True
            self.cooldown_timer = self.duration
            return True
        return False

# 初始化技能冷却实例
skill_cooldowns = {
    "fire_ball": SkillCooldown(5),
    "frost_nova": SkillCooldown(8),
    "thunder_strike": SkillCooldown(10),
    "heal": SkillCooldown(15)
}

# 调用示例
skill_cooldowns["fire_ball"].update(1)
if skill_cooldowns["fire_ball"].can_cast():
    print("释放火球术")
  • 优势:逻辑内聚性更强,后续扩展冷却相关功能(比如冷却缩减)时,只需修改类的实现;代码可读性更高,技能状态与行为绑定。

方法3:用Map存储动态技能(适合技能数量不固定的场景)

以C#为例,用Dictionary存储技能ID与冷却对象的映射,支持动态添加/删除技能:

public class SkillCooldown
{
    public bool IsCooldown { get; set; }
    public float CooldownTimer { get; set; }
    public float Duration { get; set; }

    public SkillCooldown(float duration)
    {
        Duration = duration;
        IsCooldown = false;
        CooldownTimer = 0;
    }
}

// 初始化技能冷却字典
Dictionary<int, SkillCooldown> skillCooldowns = new Dictionary<int, SkillCooldown>
{
    { 1, new SkillCooldown(5f) },
    { 2, new SkillCooldown(8f) },
    { 3, new SkillCooldown(10f) },
    { 4, new SkillCooldown(15f) }
};

// 通用更新方法
public void UpdateCooldown(int skillId, float deltaTime)
{
    if (skillCooldowns.TryGetValue(skillId, out var skill))
    {
        if (skill.IsCooldown)
        {
            skill.CooldownTimer -= deltaTime;
            if (skill.CooldownTimer <= 0)
            {
                skill.IsCooldown = false;
                skill.CooldownTimer = 0;
            }
        }
    }
}

// 通用释放检查方法
public bool CanCastSkill(int skillId)
{
    if (skillCooldowns.TryGetValue(skillId, out var skill))
    {
        if (!skill.IsCooldown)
        {
            skill.IsCooldown = true;
            skill.CooldownTimer = skill.Duration;
            return true;
        }
    }
    return false;
}
  • 优势:支持动态增减技能,无需提前定义所有技能的结构;键值对映射避免了数组索引同步的问题,逻辑更安全。

内容的提问来源于stack exchange,提问作者polelord

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:15:42