Unity中C#场景切换异常:两脚本均加载同一目标场景
问题原因及解决方法
核心问题:条件判断的赋值错误
你两个脚本的Update方法里都犯了同一个低级错误——用赋值运算符=代替了比较运算符==:
// 错误写法:将collide强制赋值为true,而非判断它是否为true if (collide = true && Input.GetKeyDown(changeSceneKey))
这个错误会导致:不管玩家有没有触发当前门的触发器,只要按下对应按键,该条件就会成立(collide = true会把变量设为true,且表达式结果本身也是true)。如果两个门的触发按键设置相同,按下按键时两个脚本都会执行场景加载,后执行的操作会覆盖先执行的,最终只会加载场景2(取决于脚本的执行顺序)。
次要问题:玩家对象处理顺序错误
你当前的代码是先加载场景,再查找Player并设置DontDestroyOnLoad,但加载场景时原场景的Player会被销毁,这时候GameObject.FindGameObjectWithTag("Player")根本找不到目标对象,等于无效操作。
解决步骤
1. 修复条件判断
把两个脚本里的条件判断改成以下两种写法之一:
- 使用比较运算符:
if (collide == true && Input.GetKeyDown(changeSceneKey))
- 更简洁的bool变量直接判断:
if (collide && Input.GetKeyDown(changeSceneKey))
2. 调整Player处理顺序
先获取Player并设置不销毁,再执行场景加载:
// 以SceneChange脚本为例,HouseChangeScene脚本同理修改 void Update() { if (collide && Input.GetKeyDown(changeSceneKey)) { player = GameObject.FindGameObjectWithTag("Player"); DontDestroyOnLoad(player); SceneManager.LoadScene(3); } }
3. 验证场景索引与按键设置
- 打开Unity的File > Build Settings,确认场景列表里索引2和3对应的是你预期的场景;
- 检查两个门对象的Inspector面板,确保
changeSceneKey设置的是不同按键(如果需要用同一按键,修复条件判断后只有触发对应门的触发器时才会执行加载,不会产生冲突)。
关于重建场景索引的问题
删除场景重新添加后索引不变,是因为Unity会保留原有场景的索引(除非你手动拖动调整顺序)。但你的核心问题不在索引,先解决代码错误后再验证场景对应关系即可。
内容的提问来源于stack exchange,提问作者Mick_Ash
相关产品推荐
相关产品推荐

