前情概要:
不久之前我通宵写了个编辑器工具 就是这个 自定义布局编辑器EditorGUICustomLayout
但是后面在添加功能时 发现之前这个设计就是一坨答辩
就比如说用json来存面板的配置 但有些Unity里面的类 比如 UnityEngine.Vector2 我这个Newtonsoft.Json它存不起来 这样就要多自己去另外处理 很麻烦
然后就是存储图片这种信息也需要复杂的处理 还有添加控件删除控件 总之一堆麻烦 很答辩
所以我又通宵了一夜把他重构了 流程就和UGUI一样 摆好面板 然后做成预设体 然后加载出来用
和UGUI不同的地方也就功能还需慢慢完善和他是在EditorWindow里面绘制的
所以用Prefab的话 上面所有问题就全都轻松解决了
演示:
获取代码:
LiLiSiDeSu/EditorUGUI
使用:
其实我在演示视频里面拼了一下事例批量改名小工具 虽然没声音 但有一遍完整的流程 但我还是图文讲一下吧
要做一个面板的话 会创建这两个脚本
BatchRename脚本
这个继承了EditorUGUIWindow的脚本就是你写编辑器工具的逻辑的地方
(其实给他起WindowBatchRename这个名字挺好的 但我写这个的时候没想到)
using UnityEngine;
using UnityEditor;
// EditorUGUIWindow的泛型就填下一个讲的那个脚本 一一对应
public class BatchRename : EditorUGUIWindow<EditorPanelBatchRename>
{
[MenuItem("杂鱼工具~~~/Batch Rename")]
private static void OpenWindow()
{
BatchRename window = GetWindow<BatchRename>();
window.Show();
}
// ^^^ 这上面从MenuItem特性到这的这些个代码基本都是固定的 MenuItem里面填你喜欢的名字
// 然后 > BatchRename window = GetWindow<BatchRename>(); <
// 这段代码的话 总之GetWindow泛型里面填的和用来存他的返回值的变量的类型就和你这个脚本名一样
// 你填其他的类型的话 他会打开你填的类型的窗口
// 前提是你乱填的类型是继承了EditorPanelBase的 不然也填不进去 总之可以逝着填一下
// 不过你得自己去写一个面板了 我只提供了一个面板
// 这个是Button的回调 p_result就是GUI.Button返回的结果 被按了就返回个true
// p_btnName就是按下的Button的gameObject.name
// 还有你不加那个if (p_result)判断的话 他会一直执行你写的逻辑 为什么? 你点到基类里面看看这个方法在哪执行的就知道了
// 总之每个有Button的面板都应该重写这个方法 然后switch写逻辑
// case "一定要和面板上控件的gameObject.name一样":break;
public override void BtnCallback(bool p_result, string p_btnName)
{
base.BtnCallback(p_result, p_btnName);
switch (p_btnName)
{
case "BtnRename":
if (p_result)
{
Rename();
}
break;
}
}
private void Rename()
{
GameObject[] selectedObjects = Selection.gameObjects;
try
{
for (int i = 0; i < selectedObjects.Length; i++)
{
selectedObjects[i].name = panel.dicIpt["IptBaseName"].text + (int.Parse(panel.dicIpt["IptStartIndex"].text) + i);
}
}
catch
{
}
}
}
EditorPanelBatchRename脚本
他是继承了EditorPanelBase这个基类脚本的 目前这种脚本里面也不需要写什么
就创建一下然后挂到你的面板物体上就行了
它用于存储你面板上的所有控件(Button Text…..) 主要都写在基类里面了 你可以点击去看看
然后挂了这个脚本的物体 他的Inspector上会有个
LoadControl按钮 这个是用于把你在这个面板下新创建的或者改过名字的控件给记录或重新读取用的
总之加了新控件 或 给控件改名了 都记得按一下 不过你也可以等整个面板拼好马上要做成预设体了之前点一下 总之到最后都要点一下的 改了控件的位置信息或者像这样的没必要改
总之就是 要做面板或者改面板 最后整完点一下LoadControl然后把他做成预设体或者覆盖原来预设体就行了
然后 然后就没了 教学结束 讲多了还容易误导 感兴趣就去看源码 代码挺少的 也不难理解 总之去睡觉了…..
注意:
不要忘了点LoadControle哦 还有预设体
其他事例:
能拼出的效果(很简陋 但不要在意) 虽然不能直接用鼠标拖控件 但是还是很方便的
后续会添加更多功能