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

Unity C#开发中switch case逻辑正确但技能效果不符合预期如何解决

问题根因分析

1. 高亮状态残留(最高概率)

你当前的技能开启逻辑仅会主动设置当前等级对应对象的高亮状态,不会主动关闭不符合当前等级的对象的高亮。比如你之前触发过等级3的技能,所有对象的isOutlined都被设为true,之后把技能等级调到0再触发技能,case 0的逻辑只把敌人的isOutlined设为true,其余普通物品、特殊物品、隐藏区域的isOutlined还保留之前的true状态,就会出现所有对象都高亮的现象,看起来和等级3效果完全一致。

2. Player对象引用错误

确认脚本中绑定的player变量,是不是你实际修改cateyeLevel的那个Player实例。如果场景里存在多个Player对象,或者脚本的player字段没有正确赋值,你修改的Player实例和代码读取的不是同一个,就会出现你以为等级是0、实际代码读取到的cateyeLevel是3的问题。你可以在switch语句前加一行日志验证实际取值:

Debug.Log("代码实际读取的技能等级:" + player.cateyeLevel);

3. 关闭逻辑存在遗漏

你不同等级的关闭逻辑只处理当前等级对应的对象,比如等级0的关闭逻辑只会把敌人的高亮关掉,如果其他对象之前处于高亮状态,会一直残留,也会干扰后续技能的表现。


修复方案

你可以重构这段逻辑,去掉冗余的switch分支,既避免状态残留,也减少重复代码:

IEnumerator CatEye(){
    catsEyeActive = true;

    // 先清除所有对象的高亮,避免历史残留
    if(enemyObject != null) enemyData.isOutlined = false;
    if(itemObject != null) item.isOutlined = false;
    if(specialObject != null) special.isOutlined = false;
    if(hiddenObject != null) hidden.isOutlined = false;

    // 根据等级依次开启对应高亮
    if(player.cateyeLevel >= 0 && enemyObject != null) enemyData.isOutlined = true;
    if(player.cateyeLevel >= 1 && itemObject != null) item.isOutlined = true;
    if(player.cateyeLevel >= 2 && specialObject != null) special.isOutlined = true;
    if(player.cateyeLevel >= 3 && hiddenObject != null) hidden.isOutlined = true;

    yield return new WaitForSeconds(15f);

    // 统一关闭所有高亮
    if(enemyObject != null) enemyData.isOutlined = false;
    if(itemObject != null) item.isOutlined = false;
    if(specialObject != null) special.isOutlined = false;
    if(hiddenObject != null) hidden.isOutlined = false;

    catsEyeActive = false;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:36:07