Хотя я не уверен, как работает компонент Unity 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
, если нет.
Чтобы проверить, занят ли он или нет, я просто бросил бы raycast вверх от центра плиткии проверять наличие любых столкновений во время фазы строителя (нет необходимости выполнять эти проверки во время игры!), реализованная программа была простой, как это:
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 вниз с шириной и длиной объекта, который вы пытаетесь разместить, и немного растянул его под объектом, чтобы он мог сталкиваться с плитками сетки.