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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:09:58