Unity編輯器擴展——繼承ScriptableWizard類去創建嚮導窗口(批量處理資源)

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章