1. 程式人生 > >Unity 編輯器之Inspector面板編輯

Unity 編輯器之Inspector面板編輯

編輯器有很多類:編輯器類。例如:EditorGUI(編輯器介面),EditorGUILayout(編輯器介面佈局),EditorGUIUtility(編輯器介面工具)等等這些,都是編輯器對介面進行編輯。

EditorGUILayout 編輯器介面佈局

介面的相關事件機制總共有9個:

1.public void OnGUI() ->繪製視窗

2.public void Update() ->重新整理方法,100次/秒

3.public void OnInspectorUpdate() ->重新整理方法,比Update()少

4.public void OnSelectionChange() ->選擇一個物件

5.public void OnDestroy ->銷燬視窗

6.public void OnFocus() ->獲得焦點

7.public void OnLostFocus() ->失去焦點

8.public void OnHierarchayChange() ->Hierarchay檢視視窗檔案發生改變

9.public void OnProjectChange() ->Project檢視視窗檔案發生改變

資料儲存並及時更新的問題:

       編輯Inspector屬性時,我先輸入資料,然後將面板上視覺化的資料第一次儲存,之後再改變資料,把unity專案工程關掉再重新開啟,第二次改變的資料沒有儲存上,Inspector上顯示的資料是第一次的。圖片裡面的Target裡面的值一直為空,賦完值,第二次依舊是這樣。這是為什麼呢???


方法一:原因是資料沒有儲存,我上網搜尋了一下,好多都是說按照下面程式碼的方法一寫的,可是寫了之後,改一次資料有效果,之後就不行了,那隻能另找方法解決了。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

/// <summary>
/// 編輯Video_Model_Tracking屬性
/// </summary>
[CustomEditor(typeof(Video_Model_Tracking))]
public class Video_Model_TrackingEditor : Editor
{

    private Video_Model_Tracking itm;
    public override void OnInspectorGUI()
    {
        if (itm == null)
            itm = this.target as Video_Model_Tracking;//獲取Video_Model_Tracking指令碼的目標

        //方法一
        //當Inspector 面板發生變化時儲存資料
        if (GUI.changed)
        {
            EditorUtility.SetDirty(target);
        }
    }
}

方法二:能夠解決每次資料更改時,都能夠及時更新,替換掉方法一的程式碼,就可以了。Undo

        //方法二
        Undo.RecordObject(target, "target change");

方法三:

    /// <summary>
    /// 方法三
    /// </summary>
    void OnInspectorUpdate()
    {
        Debug.Log("面板的更新");
        this.Repaint();
    }
方法四(序列化):這個是我在網上找到的一種,對陣列資料的更新
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class AssetBundleCreator : EditorWindow
{
    [MenuItem("Tools/Build Asset Bundle")]
    public static void BuildAssetBundle()
    {
        var win = GetWindow<AssetBundleCreator>("Build Asset Bundle");
        win.Show();
    }

    [SerializeField]//必須要加
    protected List<UnityEngine.Object> _assetLst = new List<UnityEngine.Object>();

    //序列化物件
    protected SerializedObject _serializedObject;

    //序列化屬性
    protected SerializedProperty _assetLstProperty;

    protected void OnEnable()
    {
        //使用當前類初始化
        _serializedObject = new SerializedObject(this);
        //獲取當前類中可序列話的屬性
        _assetLstProperty = _serializedObject.FindProperty("_assetLst");
    }

    public override void OnInspectorGUI()
    {
        //方法四
        //更新
        _serializedObject.Update();

        //開始檢查是否有修改
        EditorGUI.BeginChangeCheck();

        //顯示屬性
        //第二個引數必須為true,否則無法顯示子節點即List內容
        EditorGUILayout.PropertyField(_assetLstProperty, true);

        //結束檢查是否有修改
        if (EditorGUI.EndChangeCheck())
        {
            //提交修改
            _serializedObject.ApplyModifiedProperties();
        }
    }
}