同时移动和删除不同tilemap的tile的自定义刷子

地图使用tilemap实现,而地图由很多个不同的tilemap组成,这导致在修改地图时十分的不方便,所以我自己实现了一个同时能移动和删除不同tilemap里的瓦片自定义GridBrush,其他工具的功能因暂时没需求就没去实现,话不多说,给大家分享一下我的实现:

using System;
using System.Collections.Generic;
using System.Reflection;
using UnityEditor;
using UnityEngine;
using UnityEngine.Tilemaps;

namespace UnityEditor.Tilemaps
{
    /// <summary>
    /// Use this to move tiles between different Tilemaps
    /// </summary>
    [CustomGridBrush(true, false, false, "Multiple TileMap Brush")]
    public class MultipleTileMapBrush : GridBrush
    {
        public static int tilemapNum = 1;
        public Tilemap[] affectedTilemaps = new Tilemap[tilemapNum];

        // public override void Select(GridLayout gridLayout, GameObject brushTarget, BoundsInt position)
        // {
        //     // Debug.Log(gridLayout);
        //     // Debug.Log(brushTarget);
        //     // Debug.Log(position);
        //     // Debug.Log(position.position);
        // }

        public override void Move(GridLayout gridLayout, GameObject brushTarget, BoundsInt from, BoundsInt to)
        {
            if (affectedTilemaps.Length == 0){
                return;
            }
            // 存储 from 和 to 位置的所有 Vector3Int
            List<Vector3Int> fromPositions = new();
            List<Vector3Int> toPositions = new();
            //存储所有要操作的tile
            List<TileBase> tiles = new();

            foreach (Vector3Int fromPosition in from.allPositionsWithin)
            {
                fromPositions.Add(fromPosition);
            }
            foreach (Vector3Int toPosition in to.allPositionsWithin)
            {
                toPositions.Add(toPosition);
            }

            foreach (Tilemap tilemap in affectedTilemaps)
            {   
                if (tilemap == null){
                    continue;
                }
                tiles.Clear();
                // 遍历存储的 from 位置
                foreach (Vector3Int fromPosition in fromPositions)
                {
                    // 获取原位置的 Tile
                    TileBase tile = tilemap.GetTile(fromPosition);
                    if (tile != null)
                    {
                        tiles.Add(tile);
                        // 移除原位置的 Tile
                        Undo.RegisterCompleteObjectUndo(tilemap, "Move Tiles");
                        tilemap.SetTile(fromPosition, null);
                    }
                    else{
                        tiles.Add(null);
                    }
                }
                int index = 0;
                // 遍历存储的 to 位置
                foreach (Vector3Int toPosition in toPositions)
                {
                    // 设置新位置的 Tile
                    Undo.RegisterCompleteObjectUndo(tilemap, "Move Tiles");
                    tilemap.SetTile(toPosition, tiles[index]);
                    index ++;
                }
            }

        }

        // public override void MoveStart(GridLayout gridLayout, GameObject brushTarget, BoundsInt position)
        // {

        // }

        // public override void MoveEnd(GridLayout gridLayout, GameObject brushTarget, BoundsInt position)
        // {

        // }

        // public override void Paint(GridLayout gridLayout, GameObject brushTarget, Vector3Int position)
        // {
        // }

        public override void Erase(GridLayout gridLayout, GameObject brushTarget, Vector3Int position)
        {
            if (affectedTilemaps.Length == 0){
                return;
            }
            // 开始 Undo 记录

            if (brushTarget.TryGetComponent<Tilemap>(out var brushTargetTilemap))
            {
                // 获取对应位置的 Tile
                TileBase brushTargetTile = brushTargetTilemap.GetTile(position);

                if (brushTargetTile != null)
                {
                    // 移除位置的 Tile
                    Undo.RegisterCompleteObjectUndo(brushTargetTilemap, "Erase Tiles");
                    brushTargetTilemap.SetTile(position, null);
                }
            }

            // Undo.RegisterCompleteObjectUndo(affectedTilemaps, "Erase Tiles");
            foreach (Tilemap tilemap in affectedTilemaps)
            {
                if (tilemap == null) {
                    continue;
                }
                // 获取对应位置的 Tile
                TileBase tile = tilemap.GetTile(position);

                if (tile != null)
                {
                    // 移除位置的 Tile
                    Undo.RegisterCompleteObjectUndo(tilemap, "Erase Tiles");
                    tilemap.SetTile(position, null);
                }
            }
        }

        // public override void Pick(GridLayout gridLayout, GameObject brushTarget, BoundsInt position, Vector3Int pickStart)
        // {

        // }

        // public override void FloodFill(GridLayout gridLayout, GameObject brushTarget, Vector3Int position)
        // {
        // }

        // private void DoFloodFill(Tilemap sourceMap, TileBase srcTile, Vector3Int position)
        // {
        // }

        // public override void BoxFill(GridLayout gridLayout, GameObject brushTarget, BoundsInt position)
        // {
        // }

        // public override void Flip(FlipAxis flip, GridLayout.CellLayout layout)
        // {

        // }

        // public override void Rotate(RotationDirection direction, GridLayout.CellLayout layout)
        // {

        // }

        // public override void ChangeZPosition(int change)
        // {
           
        // }

        // public override void ResetZPosition()
        // {

        // }
    }

    /// <summary>
    /// The Brush Editor for a Change Layer Brush.
    /// </summary>
    [CustomEditor(typeof(MultipleTileMapBrush))]
    public class MultipleTileMapBrushEditor : GridBrushEditor
    {
        // public MultipleTileMapBrush MultipleTileMapBrush
        // {
        //     get
        //     {
        //         return target as MultipleTileMapBrush;
        //     }
        // }

    }
}```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值