代码之家  ›  专栏  ›  技术社区  ›  Kyohei Kaneko

CircleCollider2D未注册与TileMapCollider2D中的某些磁贴的冲突

  •  1
  • Kyohei Kaneko  · 技术社区  · 7 年前

    (我也在Unity Answers上问过这个问题,但有时需要一段时间才能得到答复,如果我在那里得到答复,我也会把它放在这里。)

    玩家可以根据移动水平移动一定距离。我的计划是用绿色突出显示有效移动空间,用红色突出显示无效移动空间。为此,我有一个名为MovementRange的子游戏对象,它有一个圆形的collider2D,其半径与玩家的移动级别相匹配。所有设置都是默认设置。

    此功能用于高亮显示范围内的瓷砖:

    void HighlightCellsInRange(Collision2D collision)
     {
         Vector3 hitPosition = Vector3.zero;
         ContactPoint2D[] contacts = new ContactPoint2D[100];
         int contactCount = collision.GetContacts(contacts);
    
         for (int i = 0; i < contactCount; i++)
         {
             Vector3Int tile = _tileMap.WorldToCell(contacts[i].point);
             _tileMap.SetTile(tile, _greenTile);
             _tilesInRange.Add(tile);
         }
     }
    

    这适用于为其注册碰撞的任何平铺。问题在于,某些磁贴不注册碰撞(而其他磁贴有多个碰撞)。

    以下是一些屏幕截图,您可以看到正在发生的情况:

    我已在返回的所有碰撞接触中生成gizmo球体。选择“圆碰撞器”,以便可以清楚地看到缺少的平铺碰撞接触点。在圆对撞机的正中心少了6个!

    CircleCollider2D missing contacts

    在这个屏幕截图中,您可以看到栅格和每个磁贴都显示活动的六边形碰撞器。

    TilemapCollider2D tiles colliders

    我尝试过更改“圆碰撞器”和“tilemap碰撞器”上的设置,但我不明白为什么有些碰撞没有注册。

    如有任何建议,将不胜感激。谢谢

    1 回复  |  直到 7 年前
        1
  •  2
  •   Kyohei Kaneko    7 年前

    我最终向Unity发送了一份bug报告,他们最终接受了。

    他们首先试图解释为“如果对撞机已经在物体上方,它不会开火”。但事实并非如此,也无法解释为什么其他瓷砖仍与之碰撞。 所以我在屏幕上记录了一个从0.1半径到全尺寸的对撞机,并一直用Gizmo跟踪接触点。您可以清楚地看到接触点开始很好,然后突然消失,尤其是在tilemap的右侧。

    下面是一个针对该漏洞的GIF,供感兴趣的人参考: enter image description here

    推荐文章