본문 바로가기

Unity/Unity 스파르타

15주차 - GUI 공부(GUIUtility.GetControlID(),Event,HandleUtility.Repaint())

728x90

GUIUtility.GetControlID()

모든 GUI 에는 컨트롤 ID라는것이 배정됩니다.

ID에 의해 각각의 GUI는 독립된 것

ID를 적절하게 배정하지 않으면 의도하지 않는 GUI의 다수 조작(경쟁)을 하게 됩니다.

int id = GUIUtility.GetControlID(FocusType.Passive, rect);

이 경우는 키보드 이외의 포커스를 받아 특정 범위(rect)내의 컨트롤 ID를 생성/취득하고 있습니다.

 

Event

Event클래스는 모든 이벤트를 관리하기 위한 기능입니다.

GUI에 대한 이벤트는 다양한 종류가 있고 예를 들면 버튼을 마우스로 클릭할 때

- 버튼 위에 마우스가 있을 때

- 클릭되었을때

- 버튼을 누른 채로 있을때

이벤트가 발생합니다.

 


if (GUI.Button(buttonRect, "select", EditorStyles.objectFieldThumb.name + "Overlay2"))
{
    //현재 컨트롤 ID에 대한 오브젝트 피커를 표시하기
    EditorGUIUtility.ShowObjectPicker<Sprite>(sprite, false, "", id);
    //오브젝트 피커를 표시하는 이벤트를 발행해서 이벤트의 Use를 실행하기
    evt.Use();  //var evt = Event.Current
}

 

"버튼을 눌렀다"라는 이벤트를 사용할 경우 반드시 Event.Use를 호출합니다. 그러면 이번 이벤트는 이미 사용이 끝난 상태가 됩니다.

Event.Use를 호출한 후에는 Event.type는 used입니다. 이렇게 함으로써 다른 이벤트 처리는 실행되지 않게 되어, 다른 이벤트와 경쟁하지 않습니다.

GUILayout

GUILayout의 구조는 GUILayoutUtility.GetRect에서 Rect정보를 가져와 렌더링하게 됩니다.

GUILayoutUtility.GetLastRect를 실행해서 쉽게 Rect정보를 가져올 수 있습니다.

 

HandleUtility.Repaint()

HandleUtility.Repaint는 현재의 뷰를 다시 렌더링하는 것입니다.

기능적으로는 EditorWindow.Repaint과 다르지 않습니다.

Unity에서 GUI를 변경하면 자동으로 다시 렌더링되지 않습니다. 이는 성능 향상을 위해 의도적으로 설계된 방식이지만, 프리뷰 표시처럼 실시간으로 변화하는 GUI를 구현할 때는 문제가 될 수 있습니다.

HandleUtility.Repaint는 이 문제를 해결하는 데 사용됩니다.

HandleUtility.Repaint를 호출하면 GUI 시스템에 렌더링 요청을 직접 전달하여 GUI를 강제로 다시 렌더링하도록 합니다. 이렇게 하면 프리뷰 표시처럼 실시간으로 변화하는 GUI를 구현할 수 있습니다.

 

  • HandleUtility.Repaint를 너무 자주 사용하면 성능 저하를 초래할 수 있습니다.
  • 필요할 때만 사용하는 것이 좋습니다.

 

다시 렌더링하는 처리가 이루어지는 것은 다음 패턴입니다.

- GUIView에서 Event의 Repaint가 발행된 때

- GUIView위에 마우스를 올렸을때

- GUIView에 Focus를 맞췄을때

- GUIView의 Repaint을 요청했을때 때

- EditorWindow.Repaint 등

- HandleUtility.Repaint을 발행했을 때

728x90