尽管我不确定Unity中的Grid组件如何工作,但在我的基于网格的游戏中,我使用了以下方法。但需要注意的是,我为此实现了自己的网格,其中包含自定义网格瓦片。但也许相同的逻辑可以应用于Unity的网格。
这个网格只是一个简单的网格,像这样制作:
for (int i = 0; i < terrainLength; i++)
{
for (int j = 0; j < terrainWidth; j++)
{
GameObject tile = Instantiate(gridTilePrefab, new Vector3(posX + i * gridCube.transform.localScale.x, posY + terrainHeight, posZ + j * gridCube.transform.localScale.z), Quaternion.identity);
tile.name = "grid[" + i + "," + j + "]";
tile.transform.parent = gridParent.transform;
}
}
这些网格瓦片将具有布尔值“isOccupied”。如果放置了物体,它将被设置为“true”,如果没有,则为“false”。
在建造阶段,我只需要从瓦片中心投射一条射线并检查是否发生碰撞即可轻松检查其是否被占用(无需在游戏过程中进行这些检查!)实现非常简单,如下所示:
Class GridTile
{
public bool isOccupied {get; private set;}
public void BuildStageLoop()
{
if (Physics.Raycast(transform.position, Vector3.up * 2, out hit))
{
tileOccupied = true;
}
else
{
tileOccupied = false;
}
}
}
在放置物体时,我只需检查其下方的每个瓷砖是否设置了
isOccupied
为
false
。为了检查它下面的瓷砖,我会向下进行一个盒状射线投射,宽度和长度与您要放置的对象相同,并向下延伸一点以使其与网格瓷砖碰撞。"最初的回答"