GameObject Brush 刷出来的 Tile 不保存在 Tilemap 中,不显示在 Tilemap Info 里
如果偶然有一次是显示的,那……可能是 bug?
比如我第一次用 GameObject Brush 刷 Tilemap 确实是能用 hasTile 确认 tile 存在的
但是我第二次用就没有了
别人的讨论:
原因似乎是因为 GameObject Brush 只实例化 Tile Pattle 里面保存的 Perfab 而不将 Tile 信息保存到 Tilemap
最好的解决方法就是不用 GameObject Brush……
比如我本来只是希望刷一个带有 3d collision 的 2d sprite,现在就改成用代码扫一遍 tilemap 给 tile 添加 3d collision
比如:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;
public class UnwalkableMap : MonoBehaviour
{
public Transform CollisionRoot;
private Tilemap tilemap;
[Tooltip("x 方向上的格子的个数")]
public int gridSizeX = 0;
[Tooltip("y 方向上的格子的个数")]
public int gridSizeY;
[Tooltip("格子的半径")]
public float gridCellRadius;
private float gridCellDiameter;
private void Start()
{
gridCellDiameter = 2 * gridCellRadius;
tilemap = GetComponent<Tilemap>();
if(tilemap != null && CollisionRoot != null)
AddCollision();
}
private void AddCollision()
{
Vector3 worldBottomLeft = transform.position - Vector3.right * (gridSizeX * gridCellDiameter / 2f) - Vector3.up * (gridSizeY * gridCellDiameter / 2f);
for (int x = 0; x < gridSizeX; x++)
{
for (int y = 0; y < gridSizeY; y++)
{
Vector3 worldPoint = worldBottomLeft + Vector3.right * (x * gridCellDiameter + gridCellRadius) + Vector3.up * (y * gridCellDiameter + gridCellRadius);
if (tilemap.HasTile(tilemap.WorldToCell(worldPoint)))
{
GameObject box = new GameObject(string.Format("Box_{0}_{1}", x, y));
box.transform.position = worldPoint;
box.transform.parent = CollisionRoot;
BoxCollider boxCollider = box.AddComponent<BoxCollider>();
boxCollider.size = new Vector3(gridCellDiameter, gridCellDiameter, gridCellDiameter);
}
}
}
}
}