Unity 2D点击Point预制体时误加载场景问题求助
问题分析与修复方案
核心问题
- 逻辑判断语法错误:
OnTriggerExit2D中误用赋值运算符=代替比较运算符==,导致只要Point离开触发器就强制触发场景加载,完全忽略是否点击过的判断。 - 状态重置顺序混乱:
OnTriggerExit2D中两个if语句顺序颠倒,场景加载逻辑还未执行,就先重置了canClick等状态,导致触发失败的逻辑失效。 - 状态变量冗余:
triggered与canClick功能重叠,导致Update中的判断逻辑容易出现冲突,引发误触发。
修复后的代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class DestroyPoint : MonoBehaviour { // 标记是否处于可点击Point的有效范围 bool canClickPoint = false; Collider2D currentTargetPoint; private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { // 优先处理点击到Point的逻辑 if (canClickPoint && currentTargetPoint != null) { Debug.Log("Point Destroyed"); Destroy(currentTargetPoint.gameObject); currentTargetPoint = null; canClickPoint = false; } // 未点击到Point时触发场景加载 else { Debug.Log("Game over"); SceneManager.LoadScene("FishingSpot"); } } } void OnTriggerEnter2D(Collider2D other) { if (other.CompareTag("Point")) { Debug.Log("Entered clickable area"); canClickPoint = true; currentTargetPoint = other; } } void OnTriggerExit2D(Collider2D other) { if (other.CompareTag("Point")) { Debug.Log("Exited clickable area"); // 仅当Point未被点击就离开时,触发场景加载 if (canClickPoint && currentTargetPoint != null) { Debug.Log("Game Over - missed the point"); SceneManager.LoadScene("FishingSpot"); } // 统一重置状态 canClickPoint = false; currentTargetPoint = null; } } }
修改说明
- 简化状态管理:移除冗余的
triggered变量,仅用canClickPoint标记是否处于可点击范围,逻辑更清晰。 - 修正判断逻辑:将
OnTriggerExit2D中的赋值操作改为正确的比较逻辑,确保只有未点击就错过Point时才触发场景加载。 - 调整逻辑顺序:Update中先处理点击成功的分支,再处理失败分支,避免状态冲突引发误触发。
- 统一状态重置时机:在
OnTriggerExit2D中先判断是否触发失败场景加载,再重置所有状态,保证逻辑执行顺序正确。
内容的提问来源于stack exchange,提问作者CreatoMan
相关产品推荐
相关产品推荐

