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();
}
}
}