一:ScriptableWizard类
ScriptableWizard类继承自EditorWindow类,所以在继承自ScriptableWizard的类中也可以自定义窗口中的内容,只不过ScriptableWizard为简单的窗口需求提供了便捷
二:代码实现
——创建窗口
using UnityEditor;
public class ModificationValue : ScriptableWizard
{
public float value;
[MenuItem("Tools/Create Wizard")]
private static void CreateWizard()
{
DisplayWizard<ModificationValue>("统一修改", "修改并退出", "修改不退出");
}
}
——定义属性
using UnityEditor;
public class ModificationValue : ScriptableWizard
{
public float targetValue;
[MenuItem("Tools/Create Wizard")]
private static void CreateWizard()
{
DisplayWizard<ModificationValue>("统一修改", "修改并退出", "修改不退出");
}
}
——创建按钮与其他按钮的监听
创建按钮对应DisplayWizard的第一个参数,其他按钮对应DisplayWizard的第二个参数
using UnityEditor;
using UnityEngine;
public class ModificationValue : ScriptableWizard
{
public float targetValue;
[MenuItem("Tools/Create Wizard")]
private static void CreateWizard()
{
DisplayWizard<ModificationValue>("统一修改", "修改并退出", "修改不退出");
}
/// <summary>
/// 按下创建按钮时
/// </summary>
private void OnWizardCreate()
{
GameObject[] gos = Selection.gameObjects;
foreach (var go in gos)
{
Test _Test = go.GetComponent<Test>();
if (_Test != null)
{
//记录撤销操作
//Undo.RecordObject(_Test, "value");
_Test.value = targetValue;
}
}
}
/// <summary>
/// 按下其他按钮时
/// </summary>
private void OnWizardOtherButton()
{
Debug.Log("点击了其他按钮");
}
}
——ScriptableWizard类中的回调函数
OnWizardUpdate触发条件:窗口被创建出来和窗口中的数据更新时会调用(不止调用一次)——ScriptableWizard类中的回调
OnSelectionChange触发条件:当选择的物体改变时——EditorWindow类中的回调
/// <summary>
/// 当窗口中的数据更新时
/// </summary>
private void OnWizardUpdate()
{
Debug.Log("当窗口中的数据更新时");
}
/// <summary>
/// 当选择的物体改变时
/// </summary>
private void OnSelectionChange()
{
Debug.Log("当选择的物体改变时");
}
——提示信息
private void OnSelectionChange()
{
errorString = "";
helpString = "";
if (Selection.gameObjects.Length <= 0)
{
errorString = "没有选择预制体";
}
else
{
helpString = "当前选择了" + Selection.gameObjects.Length + "个预制体";
}
}
——显示进度条
/// <summary>
/// 按下其他按钮时
/// </summary>
private void OnWizardOtherButton()
{
int length = Selection.gameObjects.Length;
//EditorUtility.DisplayProgressBar("进度条", "正在删除 0/" + length, 0);
EditorUtility.DisplayCancelableProgressBar("进度条", "正在删除 0/" + length, 0);
int count = 0;
foreach (var go in Selection.gameObjects)
{
DestroyImmediate(go);
count++;
EditorUtility.DisplayCancelableProgressBar("进度条", "正在删除" + count + "/" + length, count / length);
}
EditorUtility.ClearProgressBar();
}
——显示弹出框
/// <summary>
/// 按下其他按钮时
/// </summary>
private void OnWizardOtherButton()
{
int length = Selection.gameObjects.Length;
if(EditorUtility.DisplayDialog("是否删除选择的物体", "选择了" + length + "个物体", "确认", "关闭"))
{
foreach (var go in Selection.gameObjects)
{
DestroyImmediate(go);
}
}
}