[Unity] Tilemap 的坑:GameObject Brush 刷出来的 Tile 不保存在 Tilemap 中

616 阅读1分钟

GameObject Brush 刷出来的 Tile 不保存在 Tilemap 中,不显示在 Tilemap Info 里

如果偶然有一次是显示的,那……可能是 bug?

比如我第一次用 GameObject Brush 刷 Tilemap 确实是能用 hasTile 确认 tile 存在的

但是我第二次用就没有了

别人的讨论:

forum.unity.com/threads/una…

原因似乎是因为 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);
                }
            }
        }
    }
}