CircleCollider2D未在TileMapCollider2D中注册与某些图块的碰撞

时间:2018-11-24 22:13:11

标签: unity3d collision-detection

(我也曾在Unity Answers上问过这个问题,但是有时在那儿要花些时间才能得到答复,如果我在那里也得到答案,我也会把它放在这里。)

我正在制作一个基于图块的游戏,该游戏使用单元格布局为Hexagon的Grid> Tilemap。

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

TileMap使用TileMapCollider2D。由于网格上的每个图块都小于实际的网格六边形,这意味着每个图块之间都被间隙隔开。 TileMapCollider2D可以为每个图块正确分配一个六边形对撞机。所有设置均为默认设置。磁贴图还将Rigidbody2D设置为Kinematic,并选中了Use Full Kinematic Contacts。

此功能用于突出显示范围内的图块:

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 个答案:

答案 0 :(得分:1)

我最终向Unity发送了一个错误报告,最终他们接受了。

他们首先尝试将其解释为“如果对撞机已经在物体上方,则不会触发”。无论如何,这并没有解释为什么其他图块仍然与之碰撞。 因此,我屏幕记录了一个从0.1半径增长到完整大小的对撞机,并一直跟踪与小物件的接触点。您可以清楚地看到接触点开始很好,然后突然消失,尤其是在图块地图的右侧,随着它的增大。

就目前而言,当对撞机同时接触多个贴图时,使用TilemapCollider2D对单个贴图的碰撞是不可靠的。

以下是对此感兴趣的人的GIF图片: enter image description here