地图使用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;
// }
// }
}
}```