Unity Tilemap复合碰撞体问题:敌人可将玩家推入碰撞体内部
问题修复方案
1. 检查刚体与碰撞体基础设置
- 玩家刚体:关闭
Is Kinematic,将Collision Detection设为Continuous Dynamic(2D游戏场景),同时在Constraints中锁定Z轴旋转及无需移动的轴,避免物理交互异常。确保玩家碰撞体类型为Dynamic。 - 敌人刚体:禁用
Is Kinematic,改用Rigidbody2D.AddForce()或Rigidbody2D.MovePosition()实现移动(必须在FixedUpdate()方法中调用),禁止直接修改Transform组件。敌人碰撞体类型设为Dynamic,并调整至合适大小,避免碰撞检测失效。
2. 优化Composite Collider 2D配置
- 确保Tilemap的Composite Collider 2D已勾选
Used By Composite,将Geometry Type设置为Outlines,生成更规整的碰撞边缘,减少穿模缝隙。 - 检查单个Tile的碰撞体设置,确认所有需要碰撞的Tile都正确生成了碰撞形状,无缺失或重叠错误。
3. 调整碰撞层级与交互规则
- 在
Physics 2D Settings中配置层级碰撞矩阵,确保玩家、敌人、Tilemap三者之间的碰撞交互正常开启,避免层级屏蔽导致的碰撞失效。 - 给玩家和敌人设置不同的碰撞标签,方便后续逻辑中精准判断碰撞对象。
4. 添加碰撞后位置修正逻辑
在玩家脚本中加入碰撞回调,当检测到与Tilemap碰撞时,强制修正玩家位置至碰撞体外:
private void OnCollisionStay2D(Collision2D other) { if (other.gameObject.CompareTag("Tilemap")) { Vector3 closestValidPos = other.collider.ClosestPoint(transform.position); // 偏移微小距离避免持续触发碰撞 transform.position = closestValidPos + (transform.position - closestValidPos).normalized * 0.01f; } }
5. 优化敌人追踪逻辑
- 敌人追踪时,先通过
Physics2D.Raycast()或Physics2D.CircleCast()检测移动路径上是否存在Tilemap碰撞体,若存在则暂停向玩家方向的推力,避免硬推玩家穿墙。 - 改用预测位置追踪(比如根据玩家移动速度提前计算目标点),减少敌人与玩家的直接硬碰撞概率。
内容的提问来源于stack exchange,提问作者chovui choi
相关产品推荐
相关产品推荐

