Unity中Box Collider 2D与Tilemap Collider 2D碰撞失效问题求助
Unity水Tilemap碰撞失效&看不到碰撞盒的排查方案
先解决看不到碰撞盒绿色网格线的问题
- 打开Scene视图右上角的
Gizmos按钮,下拉列表里务必勾选Tilemap Collider 2D和Composite Collider 2D(如果用了的话) - 检查水Tilemap上的
Tilemap Collider 2D组件是否处于启用状态,没开的话肯定看不到Gizmos线 - 要是用了
Composite Collider 2D,得确保Tilemap Collider 2D的Used By Composite选项是勾选的,否则复合碰撞不生效也看不到线
核心:让水Tilemap的碰撞真正生效
1. 给Tilemap配置正确的碰撞组件
- 给蓝色水Tilemap添加
Tilemap Collider 2D,如果水是分散的多个Tile,建议再添加Composite Collider 2D,同时把Tilemap Collider 2D的Used By Composite勾上——这样能把零散的Tile碰撞合并成一个整体,避免出现能卡进去的缝隙 - 选中单个水Tile,在Inspector面板里确认
Collider Type不是None,选Sprite或者Grid都行,没碰撞类型的话Tile本身不会产生碰撞
2. 玩家对象的组件必须达标
- 玩家必须有
Rigidbody 2D,Body Type要设为Dynamic(如果用velocity移动,别选Kinematic,否则会忽略碰撞) - 玩家必须加
Collider 2D(比如Box Collider 2D),组件要启用,碰撞体的大小和位置要和玩家精灵匹配,别缩得太小或者偏移到精灵外面
3. 层级碰撞矩阵必须正确设置
- 打开
Edit > Project Settings > Physics 2D,找到Layer Collision Matrix - 找到玩家所在层级和水Tilemap所在层级,确保两者的交叉格子是打勾状态——没勾的话两个层级完全不会产生碰撞
4. 移动代码的正确写法
- 用
Rigidbody2D.velocity移动时,必须把移动逻辑写在FixedUpdate()里,别写在Update(),因为刚体物理更新是固定帧率的,Update里写会导致碰撞检测不稳定 - 绝对不要直接修改
transform.position来移动玩家,这会绕过Unity的碰撞检测系统,直接穿过去
额外排查点
- 如果之前调整过组件顺序,不用纠结,Unity里Rigidbody和Collider的顺序不影响碰撞,只要两个组件都启用就行
- 检查水Tilemap的层级是否和陆地Tilemap区分开,确保碰撞检测只针对水层级,别误把陆地也设成可碰撞
内容的提问来源于stack exchange,提问作者SchloesserJonas
相关产品推荐
相关产品推荐

