一、Event和OnGUI的关系
Event其实就是指UnityGUI Event,它对应着用户的输入(按钮点击,鼠标事件等);
OnGUI()函数的调用是依赖于Event的,只有接收到事件后,才会调用OnGUI()函数;
二、Event成员
static 属性:current,当前将要被处理的事件;
public 属性:
- type:事件类型,对应着枚举类型EventType;
- isMouse / isKey:bool型变量,只读;
三、EventType
Event中有很多事件类型,EventType枚举类型中定义了UnityGUI的输入及处理事件的类型;一部分事件是由系统自动发送,如Repaint,一部分在用户发生交互后系统发送,如KeyDown;
- Layout:一个layout事件是在其它所有事件之前发送前被发送,用于自动布局内容的初始化工作;
- Repaint:重绘事件,每一帧会被发送;
- MouseDown/MouseUp/MouseMove/MouseDrag:点击事件,发送事件后会调用OnGUI()函数;
- KeyDown/KeyUp:
四、问题收集
1.Getting control 0's position in a group with only 0 controls when doing scrollWheel
在更改控件显式时,会出现以上错误,因为在处理每个事件之前都会发送Layout事件来计算所有的自动布局,如果你更改了自动布局之后又进行了OnGUI()的绘制函数,那么就会出现冲突;如下所示,在Repaint和KeyUp等事件发送前都会发送Layout事件;
解决方式有两种:
- 从根源解决,将需要改动的控件从自动布局GUILayout换为GUI,这样计算的自动布局就不会发生冲突了;
- 如果发生了更好,产生了冲突,就不要再进行绘制,免去冲突;只需要在调用GUILayout的控件之前加上Return即可,如下所示;
if (Event.current.type == EventType.KeyUp && Event.current.keyCode == KeyCode.LeftControl)
{
Debug.Log("control is up");
isFpsOpen = !isFpsOpen;
return;
}