效果
创建、选择画笔
脚本
- 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 false // 修改绘制形式 // position.x += 2; // base.Paint(gridLayout, brushTarget, position); #endif // 打印绘制区域的信息 Debug.Log($"{ gridLayout.name}-{ brushTarget.name} ---> { position}"); } }