Unity: 如何使一个图块占据更多的网格单元

3

我试图创建一个基本的塔防游戏,其中我设置了网格单元的大小为0.5 X和0.5 Y(这样玩家可以更自由地放置他们的塔,类似于WC3)。

当游戏后期需要检查一个网格单元是否被占用时,这会导致问题,因为有些网格看起来已经被占用,但实际上并没有。

以下是一张图片解释我的问题:

Unity screenshot

黑色正方形渲染在4个网格单元上,但只有1个单元被占用(即黑色正方形左下角的白色正方形)。

是否有其他人遇到过这个特定的问题,并知道如何解决,或者是否有其他解决方案可以推荐?谢谢! :)

1个回答

2
尽管我不确定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()//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;
        }
    }

}

在放置物体时,我只需检查其下方的每个瓷砖是否设置了 isOccupiedfalse。为了检查它下面的瓷砖,我会向下进行一个盒状射线投射,宽度和长度与您要放置的对象相同,并向下延伸一点以使其与网格瓷砖碰撞。"最初的回答"

谢谢,我也开始考虑使用类似的解决方案来检查碰撞,而不是使用网格 hasTile 方法。我会尽快尝试这个方法,如果它有效(理论上应该是),我会将其标记为被接受的答案。 :) - Prince John
1
祝你好运。我已经添加了一些关于如何制作网格的基本代码示例,以及有关如何检查下方瓷砖的额外说明。 - Remy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接