Mouse Over Control
- 특정 컨트롤에 마우스가 위치해 있는지 확인
[1] Layout 요소가 아닌 경우
1
2
3
4
5
Rect rect = /* Set Rect */;
EditorGUI.LabelField(rect, "Label"); // Draw Field Control
bool mouseOver = rect.Contains(Event.current.mousePosition);
[2] Layout 요소인 경우
1
2
3
4
EditorGUILayout.TextField("Text");
bool mouseOver = GUILayoutUtility.GetLastRect()
.Contains(Event.current.mousePosition);
Mouse Down, Up, Drag
- 컨트롤에 포커싱된 상태에서는 검사 불가
1
2
3
bool mouseDown = Event.current.type == EventType.MouseDown;
bool mouseUp = Event.current.type == EventType.MouseUp;
bool mouseDrag = Event.current.type == EventType.MouseDrag;
Focused On Control
- 특정 컨트롤에 포커싱되어 있는지 확인
1
2
3
4
5
GUI.SetNextControlName("Control"); // 이어지는 컨트롤에 이름 부여
// <- Draw Field (Layout 요소 상관 없음)
bool focused = (GUI.GetNameOfFocusedControl() == "Control");
KeyDown, KeyUp
[1] 컨트롤에 포커싱되지 않은 경우
1
2
3
4
5
6
7
bool keyDown =
Event.current.keyCode == KeyCode.A &&
Event.current.type == EventType.KeyDown;
bool keyUp =
Event.current.keyCode == KeyCode.A &&
Event.current.type == EventType.KeyUp;
[2] 컨트롤에 포커싱된 상태에서 검사
1
2
3
4
5
6
7
bool keyDown =
Event.current.keyCode == KeyCode.A &&
Event.current.type == EventType.Used; // KeyDown 대신 Used
bool keyUp =
Event.current.keyCode == KeyCode.A &&
Event.current.type == EventType.KeyUp; // KeyUp은 동일
Force to Focus on Control
- 특정 컨트롤에 포커싱하기
1
2
3
4
5
GUI.SetNextControlName("TextField"); // 컨트롤에 이름 부여
EditorGUILayout.TextField("Text");
// 이름 부여된 컨트롤에 포커싱
EditorGUI.FocusTextInControl("TextField");
- 응용 : 현재 포커스 제거하기
1
2
3
4
// 컨트롤이 없는 부분에 마우스 클릭할 경우
// 강제로 포커스 제거
if(Event.current.type == EventType.MouseDown)
EditorGUI.FocusTextInControl("");