(我也曾在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个!
在此屏幕快照中,您可以看到网格,并且每个图块都显示活动的六角形对撞机。
我尝试更改圆形碰撞器和tilemap碰撞器的设置,但我不明白为什么有些碰撞没有记录。
任何建议将不胜感激。谢谢