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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:26:13