Tilemap.HasTile () всегда возвращает false только для верхнего слоя карты тайла - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь сделать игру для строителей, где вы можете строить везде, где нет построек и касаться земли. Вот мой код

private void Update()
{

    if (buildMode)
    {
        playerScript.enabled = false;
        Vector3 point = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        if (Input.GetMouseButtonDown(0))
        {
            buildOverlay.ClearAllTiles();
            Vector3Int selectedTile = buildOverlay.WorldToCell(point);
            selectedTile.z = 0;
            if (Vector3.Distance(GameObject.Find("Player").transform.position, selectedTile) < buildDistance)
            {
                //BoundsInt bounds = collidableTilemap.cellBounds;
                //TileBase[] allTiles = collidableTilemap.GetTilesBlock(bounds);

                //for (int x = 0; x < bounds.size.x; x++)
                //{
                //    for (int y = 0; y < bounds.size.y; y++)
                //    {
                //        TileBase tile = allTiles[x + y * bounds.size.x];
                //        Debug.Log(collidableTilemap.HasTile(new Vector3Int(x, y, 0)));

                //        if (collidableTilemap.HasTile(new Vector3Int(x, y, 0)))
                //        {
                //            buildOverlay.SetTile(selectedTile, notplaceable);
                //        }
                //        else
                //        {
                //          buildOverlay.SetTile(selectedTile, placeable);

                //        }
                //    }
                //}
                selectedTile.z = 0;
                Debug.Log(selectedTile);
                Debug.Log(collidableTilemap.HasTile(selectedTile));
                if (!collidableTilemap.HasTile(selectedTile))
                {
                    buildOverlay.SetTile(selectedTile, placeable);
                }
                else
                {
                    buildOverlay.SetTile(selectedTile, notplaceable);
                }



            }




        }
        else
        {
            playerScript.enabled = true;
        }
    }
}

Пока этот код отключает возможность перемещаться и проверять перекрывающийся тайл. В настоящее время у меня переменная buildDistance установлена ​​в бесконечность, так что это не проблема.

Вот некоторые изображения:

works under the first layer

it thinks the first layer isn't there

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

they are in same tilemap

Этот код должен видеть, существует ли тайл в координатах где игрок хочет разместить. Работает нормально, за исключением первого слоя. Пожалуйста, помогите!

Я довольно новичок в Unity, поэтому не обращайте внимания на мои ошибки нубов. Спасибо!

[EDIT]: Я немного изменил свою местность и понял пару новых вещей:

Этот блок красный

I don't know why this is red

Этот блок зеленый.

Why is this green????

Я не могу построить нигде в этом ряду, кроме случаев, когда камень заканчивается:

enter image description here

Я могу построить здесь:

WHAT IS GOING ON

ЧТО ПРОИСХОДИТ !!!!! ???? !! ???

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Таким образом, в основном это 1 единица от оси y, поэтому просто вычтите 1 единицу y.

Замените эту строку:

if (!collidableTilemap.HasTile(selectedTile)

на

if (!collidableTilemap.HasTile(selectedTile - new Vector3Int(0, 1, 0)))

Это в основном сводит на нет эффект смещения, который Unity накладывает на плитки с пола.

2 голосов
/ 13 апреля 2020

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

Vector3Int selectedTile = buildOverlay.WorldToCell(point);

Этот тип приведения от float к int на самом деле не округляет число, а вместо этого ставит его на пол. Unity часто размещает свои карты тайлов, так что плитки на 0,5 м смещены относительно мировой сетки, и из-за этого пола эта позиция может быть причиной этих проблем. Я бы предложил попробовать

Vector3Int selectedTile = buildOverlay.WorldToCell(Vector3Int.RoundToInt(point)) 

или, если это не помогло, вы можете попробовать более уродливый

Vector3Int selectedTile = buildOverlay.WorldToCell(point+Vector3.one*0.5f);

(если это все еще не работает, вы можете опустить 0.5f )

Не самое красивое из решений, но я думаю, что именно здесь ваша проблема, я бы с ней поиграл.

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