效果
创建、选择画笔
脚本
- Editor
using UnityEditor;
using UnityEditor.Tilemaps;
using UnityEngine;
// [CustomEditor(typeof(GridBrush))] // 在默认画笔上添加脚本
[CustomEditor(typeof(CustomBrush))] // 在新创建的画笔上添加脚本
public class CreateCustomBrushEditor : GridBrushEditor
{
private string _brushName;
protected override void OnEnable()
{
base.OnEnable();
_brushName = (target as CustomBrush)?.name;
}
// 重绘Scene视图
public override void OnPaintSceneGUI(GridLayout gridLayout, GameObject brushTarget, BoundsInt position, GridBrushBase.Tool tool, bool executing)
{
base.OnPaintSceneGUI(gridLayout, brushTarget, position, tool, executing);
string msg = $"{_brushName}\n{gridLayout.name}-{brushTarget.name}\n{position}";
GUIStyle style = new GUIStyle();
style.normal.textColor = Color.red;
style.fontSize = 20;
// Handles 场景视图中的自定义 3D GUI 控件和绘制操作
Handles.Label(position.position, msg, style);
}
[MenuItem("Assets/Create/创建自定义画笔", false, 0)]
public static void CreateCustomBrushFile()
{
// public static string SaveFilePanelInProject (string 保存框标题, string 文件名, string 后缀名, string 保存提示);
string path = EditorUtility.SaveFilePanelInProject("保存自定义画笔", "New Brush", "asset", "请选择保存画笔的路径!");
if (path != "") AssetDatabase.CreateAsset(ScriptableObject.CreateInstance<CustomBrush>(), path);
}
}
- 画笔
using UnityEditor.Tilemaps;
using UnityEngine;
/**
* CustomGridBrushAttribute 用于将该类定义为网格画笔,以及使其在调色板窗口中可用
* CustomGridBrushAttribute (bool hideAssetInstances, bool hideDefaultInstance, bool defaultBrush, string defaultName)
* --> hideAssetInstances 在该瓦片面板窗口中隐藏该画笔的所有资源实例
* --> hideDefaultInstance 在该 Tile Palette 设置后,该摄像机渲染另一个通道(在不透明效果之后,但在图像效果之前)
* --> defaultBrush 如果设置为 true,则画笔将替换在调色板窗口中作为默认画笔的 Unity 内置画笔
* --> defaultName 此画笔的默认实例的名称
*/
// 创建自定义画笔 - 拓展画笔
[CustomGridBrushAttribute(false, true, false, "自定义画笔")]
public class CustomBrush : GridBrush
{
public string name; // 画笔名称(可以添加其他参数用于修改画笔绘制的形式)
/**
* 重写画笔绘制方法
* public void Paint (GridLayout gridLayout, GameObject brushTarget, Vector3Int position);
* --> gridLayout 用于布局的 Grid
* --> brushTarget 绘制操作的目标。默认为当前选择的 GameObject
* --> position 要绘制数据的单元格的坐标
*/
public override void Paint(GridLayout gridLayout, GameObject brushTarget, Vector3Int position)
{
base.Paint(gridLayout, brushTarget, position);
#if
// 修改绘制形式
// position.x += 2;
// base.Paint(gridLayout, brushTarget, position);
#endif
// 打印绘制区域的信息
Debug.Log($"{gridLayout.name}-{brushTarget.name} ---> {position}");
}
}