首页 > 解决方案 > Unity:让一个图块占据更多的网格单元格

问题描述

我正在尝试创建一个基本的塔防游戏,其中我将单元格大小设置为 0.5 X 和 0.5 Y(以便玩家可以更自由地放置他们的塔,想想 WC3)。

当我稍后在游戏中想要检查一个网格单元是否被占用时,这会导致问题,因为某些单元似乎被占用,但实际上并没有。

这是一张图片来说明我的问题:

统一截图

黑色方块渲染了 4 个单元格,但只有 1 个单元格被占用(黑色方块左下角的白色方块)。

有没有其他人遇到过这个特定的问题并且知道如何解决这个问题,或者您还有其他想要推荐的解决方案吗?:)

提前致谢!

标签: unity3d

解决方案


虽然我不确定统一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;
    }
}

这些网格图块将有一个布尔值isOccupiedtrue如果将对象放置在其上,则将其设置为,否则将设置为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,并在物体下面延伸一点,这样它就可以与网格瓷砖碰撞。


推荐阅读