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
相关产品推荐
相关产品推荐

