Tilemap.SetTile 仅适用于 Vector3Int,但我的图块大小以 0.16f 为增量

Tilemap.SetTile only works with Vector3Int, but my tile size is in 0.16f increments

所以在我的 Unity2D 游戏中,我需要从脚本中更改瓦片地图中的瓦片。我很快找到了 Tilemap.SetTile 函数,该函数在他的参数中要求一个 Vector3Int 位置,但是我的图块大小以 0.16f 为增量,这意味着我的图块的 Vector3 位置看起来像 (0, -0.16f, 0)。

public class BreakableWalls : MonoBehaviour
{
    private float tileSize = 0.16f;
    public int hp;
    public Tilemap tilemap;
    public TileBase fullTile;
    public TileBase brokenTile;

    public void Start()
    {
        for (float i = 0; i > -(tileSize * 3); i -= tileSize)
        {
            Vector3 currentTilePos = new Vector3(0, 0 - i, 0);
            TileBase tile = hp == 2 ? fullTile : brokenTile;
            tilemap.SetTile(currentTilePos, tile);
        }
    }
}

原理很简单。我的易碎墙可以从 2 HP(需要射击两次才能完全破坏)或 1 HP(需要射击一次才能完全破坏)开始。一堵墙由 3 块瓷砖组成,我将遍历每块瓷砖(从顶部开始,因为顶部瓷砖的位置始终是 Vector3.zero),以根据墙的 HP 更新它们的外观。

如果我的 tileSize 为 1,这会工作正常,因为 SetTile 需要一个 Vector3Int,但由于我的 0.16f tileSize,目前它不会工作。

我该如何解决这个问题?

谢谢,

tileSize 不影响单元格索引。只需这样做:

for (int i = 0; i > -3 ; i -= 1) 
{ 
    Vector3Int currentTileCellPos = new Vector3Int(0, i, 0); 
    TileBase tile = hp == 2 ? fullTile : brokenTile; 
    tilemap.SetTile(currentTileCellPos, tile); 
}

您实际上似乎不需要图块的世界位置 - 您从不在问题中使用它。如果你这样做,你总是可以做 Vector3 currentTileWorldPos tilemap.CellToWorld(currentTileCellPos);