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

Unity使用Platform Effector时OnCollisionEnter2D未碰撞却触发如何解决?

问题原因

Platform Effector 2D的单向碰撞逻辑是物理引擎先完成碰撞检测,再根据法线方向过滤掉无效碰撞的物理响应(比如从下方碰撞时不生成阻挡力,允许玩家穿过),而OnCollisionEnter2D是在碰撞检测完成阶段就触发,不会等待过滤逻辑执行,因此会出现未产生有效碰撞也触发回调的情况。

解决方案

1. 先确认基础配置正确

  • 平台挂载的Collider2D组件需勾选Used By Effector选项
  • Platform Effector 2D组件需开启Use One Way选项
  • Platform Effector 2D的One Way Layer Mask需包含玩家所在的物理层

2. 新增碰撞法线方向判断

在OnCollisionEnter2D中判断碰撞法线的Y轴分量,只有玩家从平台上方发起的有效碰撞,法线Y值才会小于0(水平平台场景下),以此过滤无效触发:

private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.GetComponent<Player>())
    {
        // 获取第一个碰撞点的法线
        Vector2 collisionNormal = collision.GetContact(0).normal;
        // 法线Y分量小于-0.5说明是玩家从平台上方碰撞,属于有效碰撞
        if (collisionNormal.y < -0.5f)
        {
            Debug.Log("On Collision Enter");
            //CameraFollow.instance.useFixedDeltaTime = false;
            Player = collision.gameObject;
            PlayerScript = Player.GetComponent<Player>();
            amountOfTimesPlayerCollided++;
        }
    }
}

如果使用可旋转的非水平平台,可以把法线判断改成和平台自身向上向量的点积计算,即可适配任意角度的平台单向碰撞判断。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:57:00