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

Unity C#开发中if条件成立但代码块未执行问题求解

问题根因

Debug.Log(levelIdentifier)打印出Level但if判断不触发,本质是你生成的levelIdentifier末尾携带了空字符\0,和字面量"Level"并不相等。
你初始化currentSceneChars数组时长度设为场景名总长度,但StringReader.Read只往数组里写入了currentScene.Length - 2个字符,数组剩余位置会保留char类型默认值\0。把整个char数组转为字符串时,这些末尾的空字符会被一并包含。而Debug.Log打印时会自动截断字符串末尾的空字符,所以你肉眼看到的输出是Level,实际字符串长度远大于5,相等判断自然不会通过。

你的代码还存在两个会导致后续逻辑失效的隐藏问题:

  • 直接用levelIndex = currentScene[stringLength - 1]取关卡序号,拿到的是字符的ASCII编码值而非真实数字。比如场景名是Level 1时,字符'1'转int得到的是49,计算下一关时会直接跳转到Level 50,完全不符合预期。
  • 手动截取字符串前缀的逻辑鲁棒性极差,只要场景命名多一个空格、序号变成两位数就会直接失效。
修复方案

放弃手动操作char数组、StringReader的脆弱写法,直接用字符串分割处理场景名,代码如下:

public void ButtonNextLevel()
{
    string currentScene = SceneManager.GetActiveScene().name;
    string[] sceneNameParts = currentScene.Split(' ');
    
    if (sceneNameParts.Length == 2 && sceneNameParts[0] == "Level")
    {
        if (int.TryParse(sceneNameParts[1], out int currentLevelNum))
        {
            string nextScene = $"Level {currentLevelNum + 1}";
            if (SceneManager.GetSceneByName(nextScene).IsValid())
            {
                SceneManager.LoadScene(nextScene);
                return;
            }
        }
    }
    // 前缀不匹配或下一关不存在时直接触发通关
    GameWon();
}

public void GameWon()
{
    SceneManager.LoadScene("GameWon");
}
排查小技巧

后续再遇到字符串视觉上相等但判断不通过的情况,直接打印两个字符串的长度对比:Debug.Log($"待判断字符串长度:{levelIdentifier.Length},目标字符串长度:{"Level".Length}"),就能立刻发现隐藏的不可见字符问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:42:25