Unity:基于Box Collider 2D标签加载对应场景的代码故障求助
关卡加载器功能修复
需求说明
实现关卡加载器功能:通过4个带有Box Collider 2D的「门」游戏对象(命名为top、bottom、left、right),根据门的标签加载对应名称的场景(例如bottom门加载bottom场景)。
问题现状
当前编写的GameManager代码无法正常触发场景加载,代码如下:
using UnityEngine; using UnityEngine.SceneManagement; public class GameManager : MonoBehaviour { [SerializeField] private string topScene; [SerializeField] private string bottomScene; [SerializeField] private string leftScene; [SerializeField] private string rightScene; private void OnTriggerEnter2D(Collider2D collision) { if (collision.gameObject.CompareTag("Player")) { if (collision.CompareTag("top")) { LoadScene(topScene); } else if (collision.CompareTag("bottom")) { LoadScene(bottomScene); } else if (collision.CompareTag("left")) { LoadScene(leftScene); } else if (collision.CompareTag("right")) { LoadScene(rightScene); } } } private void LoadScene(string sceneName) { SceneManager.LoadScene(sceneName); } }
相关截图
- 层级面板:

- 游戏场景:

问题分析与修复方案
核心逻辑错误
代码中存在对象判断逻辑混淆:外层判断collision是Player,内层却又判断同一个collision是门的标签(top/bottom等),这完全矛盾——一个对象不可能同时拥有Player和门的标签。
针对性修复
根据GameManager的挂载位置,分两种修复方式:
方式1:GameManager挂载在每个门对象上
此时OnTriggerEnter2D的collision参数是触发门的Player,需要判断**当前门对象(GameManager所在对象)**的标签:
using UnityEngine; using UnityEngine.SceneManagement; public class GameManager : MonoBehaviour { [SerializeField] private string topScene; [SerializeField] private string bottomScene; [SerializeField] private string leftScene; [SerializeField] private string rightScene; private void OnTriggerEnter2D(Collider2D collision) { // 确认触发门的是Player if (collision.CompareTag("Player")) { // 判断当前门的标签 if (gameObject.CompareTag("top")) { LoadScene(topScene); } else if (gameObject.CompareTag("bottom")) { LoadScene(bottomScene); } else if (gameObject.CompareTag("left")) { LoadScene(leftScene); } else if (gameObject.CompareTag("right")) { LoadScene(rightScene); } } } private void LoadScene(string sceneName) { SceneManager.LoadScene(sceneName); } }
方式2:GameManager挂载在Player对象上
此时OnTriggerEnter2D的collision参数是Player触发的门对象,直接判断门的标签即可:
using UnityEngine; using UnityEngine.SceneManagement; public class GameManager : MonoBehaviour { [SerializeField] private string topScene; [SerializeField] private string bottomScene; [SerializeField] private string leftScene; [SerializeField] private string rightScene; private void OnTriggerEnter2D(Collider2D collision) { // 判断触发的门对象标签 if (collision.CompareTag("top")) { LoadScene(topScene); } else if (collision.CompareTag("bottom")) { LoadScene(bottomScene); } else if (collision.CompareTag("left")) { LoadScene(leftScene); } else if (collision.CompareTag("right")) { LoadScene(rightScene); } } private void LoadScene(string sceneName) { SceneManager.LoadScene(sceneName); } }
额外必要检查
确保以下配置正确,否则碰撞触发会失效:
- 所有门对象的Box Collider 2D必须勾选
Is Trigger - Player对象必须添加Rigidbody 2D组件(2D碰撞触发需要刚体参与)
- 要加载的场景已添加到Unity编辑器的
File > Build Settings > Scenes In Build列表中 - 门对象的标签已正确设置为
top/bottom/left/right,Player对象标签设置为Player
内容的提问来源于stack exchange,提问作者TechNerdTheCoder
相关产品推荐
相关产品推荐

