2D平台游戏房间切换:如何区分触发的Collider2D?
多房间2D平台游戏切换解决方案
方案一:复用门脚本,通过配置区分目标房间
不用为每个门编写新脚本,给门的核心脚本添加一个公共配置变量,用于指定该门对应的目标房间编号,只需在Inspector面板给每个门设置对应值即可适配多场景:
// 门的核心脚本 public class RoomDoor : MonoBehaviour { // 在Inspector中设置该门要切换到的目标房间编号 public int targetRoomNumber; private CameraController cam; private PlayerController m_player; void Awake() { // 根据项目结构获取相机和玩家实例,也可使用单例/依赖注入 cam = FindObjectOfType<CameraController>(); m_player = FindObjectOfType<PlayerController>(); } private void OnTriggerEnter2D(Collider2D collision) { if (collision.CompareTag("Player")) { int oldRoomNumber = m_player.m_currentRoomNumber; // 直接更新玩家当前房间为门指定的目标值 m_player.m_currentRoomNumber = targetRoomNumber; // 根据房间切换方向处理相机逻辑 if (targetRoomNumber > oldRoomNumber) { cam.enablePlayerCentering(); } else { cam.recenterLastRoom(); } } } }
新增房间时,只需给对应门设置targetRoomNumber(比如从房间1到房间2的门设为2,返回的门设为1),完全无需修改脚本,完美支持来回切换。
方案二:移回HeroKnight脚本,确保单次触发
若要将触发逻辑移回角色,解决多碰撞体重复触发问题,可采用以下两种方式:
方法1:指定主碰撞体负责触发
仅给角色根节点的主碰撞体开启Is Trigger,关闭其他圆形碰撞体的触发属性,这样只有主碰撞体触发OnTriggerEnter2D,自然只会触发一次。
方法2:用开关变量防止重复触发
在角色脚本中添加布尔开关,标记是否正在执行房间切换,避免短时间内重复触发:
// HeroKnight脚本 public class HeroKnight : MonoBehaviour { public int m_currentRoomNumber; private CameraController cam; private bool isSwitchingRoom = false; // 切换状态开关 void Awake() { cam = FindObjectOfType<CameraController>(); } private void OnTriggerEnter2D(Collider2D collision) { // 仅响应房间触发器,且当前未在切换状态时执行 if (!collision.CompareTag("RoomTrigger") || isSwitchingRoom) return; isSwitchingRoom = true; RoomTrigger trigger = collision.GetComponent<RoomTrigger>(); int oldRoomNumber = m_currentRoomNumber; m_currentRoomNumber = trigger.targetRoomNumber; if (m_currentRoomNumber > oldRoomNumber) { cam.enablePlayerCentering(); } else { cam.recenterLastRoom(); } // 延迟重置开关,避免角色快速扫过触发器时重复触发 Invoke(nameof(ResetSwitch), 0.5f); } private void ResetSwitch() { isSwitchingRoom = false; } }
对应的房间触发器仅需简单配置目标房间号:
public class RoomTrigger : MonoBehaviour { public int targetRoomNumber; }
该方案既将逻辑移回角色,保证单次触发,同时完全适配后续依赖房间编号的代码需求。
内容的提问来源于stack exchange,提问作者adepolo12
相关产品推荐
相关产品推荐

