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;

/// 
/// 编辑Video_Model_Tracking属性
/// 
[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");

方法三:

    /// 
    /// 方法三
    /// 
    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("Build Asset Bundle");
        win.Show();
    }

    [SerializeField]//必须要加
    protected List _assetLst = new List();

    //序列化对象
    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();
        }
    }
}
Unity 编辑器之Inspector面板编辑_第1张图片

你可能感兴趣的:(编辑器)