一: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);
}
}
}