You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unity中OnTriggerEnter未检测到2D碰撞的问题求助

解决Unity 2D触发器OnTriggerEnter未触发的问题

我来帮你排查这个头疼的触发器不触发问题,这类碰撞检测的坑我踩过不少,咱们一步步来捋清楚:

最容易踩的坑:用错了2D版本的函数!

划重点:因为你用的是2D碰撞组件(BoxCollider2D),必须使用OnTriggerEnter2D(Collider2D other)函数,而不是3D的OnTriggerEnter!很多人会搞混这两个,直接导致函数根本不会被Unity调用。正确的代码写法应该是:

void OnTriggerEnter2D(Collider2D other)
{
    Debug.Log("触发器触发啦!碰撞对象:" + other.gameObject.name);
}

注意函数名里的2D后缀,参数是Collider2D而不是Collider

检查2D碰撞的核心前提:Rigidbody2D组件

Unity的2D触发器碰撞规则是:至少有一个参与碰撞的对象必须挂载Rigidbody2D组件,而且要注意:

  • 如果你把脚本挂在角色(CharacterRobotBoy)上,确保角色的Rigidbody2D没有设为Static(静态刚体不会参与动态碰撞检测),一般设为Dynamic或者Kinematic都可以;
  • 如果目标对象是场景里的静态物体(比如固定的机关),那角色必须带有Rigidbody2D;如果目标是动态物体,至少一方有Rigidbody2D就行。

确认Collider2D的设置细节

  • 目标对象的BoxCollider2D必须勾选Is Trigger,你说已经勾了,但建议再检查一遍有没有误取消;
  • 角色的BoxCollider2D不要勾选Is Trigger(除非你特意要角色变成触发器,但一般角色作为碰撞体,目标作为触发器);
  • 检查图层碰撞矩阵:打开Edit > Project Settings > Physics2D,找到Layer Collision Matrix,确认角色所在图层和目标所在图层的碰撞选项是勾选状态——如果这两个层被设置为不碰撞,触发器肯定不会触发。

角色运动方式的冲突排查

如果你用的CharacterRobotBoy原本是3D资源,改成2D后如果还在使用3D的CharacterController来控制移动,会和2D的Rigidbody2D碰撞系统冲突!这种情况下,建议改用Rigidbody2D的MovePosition或者AddForce方法来控制角色移动,或者完全切换到2D的角色控制器组件。

最后几个小细节检查

  • 检查Scene视图的Gizmos,勾选Collider的显示,确认角色的Collider和目标的触发器Collider真的有重叠(有时候视觉上看起来碰了,但实际Collider范围没覆盖到);
  • 有没有代码禁用了Collider2D或者Rigidbody2D?比如GetComponent<BoxCollider2D>().enabled = false;这种操作会直接导致碰撞检测失效。

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

火山引擎 最新活动