unity3d - Unity:让一个图块占据更多的网格单元格
问题描述
我正在尝试创建一个基本的塔防游戏,其中我将单元格大小设置为 0.5 X 和 0.5 Y(以便玩家可以更自由地放置他们的塔,想想 WC3)。
当我稍后在游戏中想要检查一个网格单元是否被占用时,这会导致问题,因为某些单元似乎被占用,但实际上并没有。
这是一张图片来说明我的问题:
黑色方块渲染了 4 个单元格,但只有 1 个单元格被占用(黑色方块左下角的白色方块)。
有没有其他人遇到过这个特定的问题并且知道如何解决这个问题,或者您还有其他想要推荐的解决方案吗?:)
提前致谢!
解决方案
虽然我不确定统一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,并在物体下面延伸一点,这样它就可以与网格瓷砖碰撞。
推荐阅读
- reactjs - 如何向使用 React.js 的网络爬虫服务的 API 发出 POST http 请求?
- r - 如何仅针对矩阵的特定列检查一对值?
- javascript - React 和 Typescript 中的 ServiceWorker
- cupy - 如何调用具有双指针作为参数的内核?
- javascript - React Native / Javascript 异步等待
- python - 使用 python 查找超链接的单词和 Web 链接
- java - Jackson 2.11.4:为缺少的 JSON 字段设置默认值
- powershell - 如何将 catch 块中的所有错误放入 Powershell 中的电子邮件正文中?
- python - Django 返回 JSON POST 响应标头和正文
- tensorflow - 为什么找不到正确的 cuda 版本?