Unity: заставить плитку занимать больше ячеек сетки - PullRequest
2 голосов
/ 03 апреля 2019

Я пытаюсь создать базовую игру защиты башни, в которой я установил размер своей ячейки 0,5 X и 0,5 Y (чтобы игрок мог более свободно размещать свои башни, подумайте, например, WC3).

Это вызывает проблемы, когда я позже в игре хочу проверить, занята ли ячейка сетки, потому что некоторые ячейки будут казаться занятыми, но на самом деле это не так.

Вот изображение, иллюстрирующее мою проблему:

Unity screenshot

Черный квадрат отображается над 4 ячейками, но занята только 1 ячейка (белый квадрат в левом нижнем углу черного квадрата).

Кто-нибудь еще сталкивался с этой конкретной проблемой и знает, как ее решить, или есть другие решения, которые вы хотели бы порекомендовать?:)

Заранее спасибо!

1 Ответ

2 голосов
/ 03 апреля 2019

Хотя я не уверен, как работает компонент 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 вниз с шириной и длиной объекта, который вы пытаетесь разместить, и немного растянул его под объектом, чтобы он мог сталкиваться с плитками сетки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...