我正在尝试创建一个基本的塔防游戏,在其中我将像元大小设置为0.5 X和0.5 Y(以便玩家可以更自由地放置其塔,请考虑使用WC3)。
当我稍后在游戏中要检查网格单元是否被占用时,这会引起问题,因为某些单元似乎会被占用,但实际上未被占用。
以下是说明我的问题的图片:
黑色方块呈现在4个单元格上,但是只有一个单元格被占用(白色方块位于黑色方块的左下角)。
是否还有其他人遇到此特定问题,并且知道如何解决此问题,或者您有其他建议的解决方案吗? :)
谢谢!
答案 0 :(得分:2)
尽管我不确定统一Grid
组件的工作原理,但我在一款基于网格的游戏中使用了以下方法。但是请注意,我为此实现了自己的网格,其中包含自定义网格图块。但是也许可以将相同的逻辑应用于统一网格
这个网格只是一个像这样的简单网格
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()//this loops like an update while we're in building stage
{
if (Physics.Raycast(transform.position, Vector3.up * 2, out hit))
{
tileOccupied = true;
}
else
{
tileOccupied = false;
}
}
}
在放置对象上,我只需要检查其下方的每个图块是否将isOccupied
设置为false
。要检查其下方的瓷砖,我将对您要放置的对象的宽度和长度向下进行一次boxRayCast,并在该对象下方延伸一点,以便它可以与网格瓷砖碰撞。