一、生命周期
void Awake():
void OnGUI():绘制窗口时调用
void Update(): 更新
void OnFocus():当窗口获得焦点时调用一次
void OnLostFocus():当窗口失去焦点时调用一次
void OnHierarchyChange():当Hierarchy视图中的任何对象发生改变时调用一次
void OnProjectChange():当Project视图中的资源发生改变时调用一次
void OnInspectorUpdate(){ this.Repaint(); }:窗口面板更新,必须重绘,否则不会更新
void onSelectionChange():{
//当窗口出去开启状态,并且在Hierarchy视图中选择某游戏对象时调用
foreach(Transform t in Selection.transforms){
//有可能是多选,因此Selection是个数组或者其他结构类型来的
}
}
二、Unity编辑器的扩展:IMGUI(Immediate Mode GUI)
1、定义:
所有关于 Editor 的相关 UI,包括 Inspector、Hierarchy、Window、Game 视图上动态创建的那些半透明 UI、还有 Scene 视图上可添加的辅助显示 UI.
2、名字来源于两种类型的UI系统:immeditate 和 retained
- retained:当设置好各种组件(例如Text、button之类的信息)后,或者修改它们的相关属性,这些组件的相关信息和改动会被保存下来(retained),系统会根据这些新的信息来绘制响应事件。UGUI即是典型的retained mode GUI。
- immediate:系统不会保存UI控件上的各种信息,不会用上次的状态继续工作,而是反复询问这些控件的信息。例如OnGUI()绘制。
3、相关类介绍
-
Editor类:继承ScriptableObject,只能定制针对脚本的扩展,从脚本内容欧冠在Inspector里的显示布局,到变量在Scene视图的可视化编辑
-
EditorWindow类:继承ScriptableObject,主要是扩展编辑器的功能,有独立的窗口,使用OnGUI函数绘制2D的UI
-
在Game视图上显示的ingameGUI主要是GUI和GUILayout,另外与之对应的editor-only类是editorGUI和EditorGUILayout两个类。
-
GUI和EditorGUI提供的接口为Fiexed Layout,基本上都是需要传入一个rect变量指定控件的位置和大小,当窗口大小改时控件会保持不变。可以将代码放到GUI.BeginGroup()和GUI.EndGroup()之间将控件进行分组或者划分子区域进行布局。
-
GUILayout和EditorGUILayout则是与前面两个对应的AutoLayout类,不需要指定控件的位置和大小,会根据当前显示区域的大小自动调整布局适应变化。多个控件默认是从上到下的顺序排序,可以用GUILayout.beginHoriztontal(),GUILayout.EndHorizontal(),GUILayoutBeginVertical(),GUiLayoutEndVertical()将代码写到这些调用之间进行水平或者垂直排列控件。
-
GUIUtility类提供了一些工具方法,如获取控件id,转换Screen和GUI之间的坐标等。
-
EditorGUIUtility类是针对Editor提供一些工具方法,除了GUIUtility那些方法外还增加了很多有用的方法,如获取内建资源图标、高亮选中某个物体、产生复制粘贴命令等。
-
Event:该类包含了所有用户输入(按钮、鼠标点击、UI相关布局和绘制事件)。调用Event.current获得当前事件信息,查看EventType枚举定义可查询全部可用类型事件。这个信息在OnGUI、OnInspector、onSceneGUI里面都可以使用以处理一些特定逻辑。
三、自定义控件
- GUIContent:定义了控件需要显示什么,包含三个基本要素(图片、文本、鼠标停留的提示信息tooltip,play mode运行时tooltip无效)。
- GUIStyle:定义了控件要如何显示,包括Normal Hover Active等状态切换显示、文字大小颜色、指定图标显示位置等各种信息。