编辑器有很多类:编辑器类。例如: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();
}
}
}