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
相关产品推荐
相关产品推荐

