본문으로 바로가기


유니티 NGUI - Event에 관하여..

category 유니티/NGUI 2018. 11. 30. 02:55

# NGUI 이벤트


1) 개요

 NGUI의 클릭, 드래그 등의 기능을 수행 시 호출되는 함수와 그 이유를 살펴본다. 코드가 궁금하면 NGUI Panel Camera에 붙은 UICamera.cs를 살펴본다.


2) NGUI 이벤트의 기본 구조

 NGUI의 패널을 만들면 기본적으로 카메라가 붙고 카메라에 UICamera.cs가 붙어있다.

 UICamera.cs는 MonoBehaviour를 상속받아 매 프레임마다 Update()를 수행하면서 이벤트 발생을 검사한다.

 이벤트 발생을 검사하는 동안 Press, Release 등의 초기 이벤트를 감지하고 그안에서 클릭, 드래그 등 상세한 이벤트로 분기 및 수행한다.

 예를들어, click에 대한 조건에 충족되면 Notify 함수를 통해 현재 콜라이더에 잡힌 gameObject와 수행할 함수(OnClick)을 인자로 넘겨주고

 Notify 함수 안에서 파라미터로 받은 gameObject에 메세지를 보낸다. 메세지는 'go.SendMessage(funcName, obj, SendMessageOptions)'와 같은  형태로 전송된다.

 인자의 SendMessageOptions로는 DontRequireReceiver가 쓰이는데 이것은 해당 오브젝트의 컴포넌트를 모두 검사해 수행하고자 하는 function이 없는 컴포넌트는 무시하고 다른 컴포넌트를 검사하도록 지시하는 옵션이다.

  

3) 사소한 물음

 UICamera.cs를 훑으며 이와 같은 과정을 알게됐을 때, 작은 의문이 들었다. 일전에 유니티 공부를하며 알게된 것 중 하나로 SendMessage()는 수행할 funcName를 String으로 넘겨주며 해당 함수를 찾기위해 클래스의 정보를 검사하는데 리플렉션에 의존한다는 것이었다. 또한 리플렉션 과정의 연산은 꽤나 무겁기 때문에 SendMessage() 사용을 자제하라는 저자의 충고를 깊이 새기고있었다.

 하지만 쉽고 잦게 발생되는 UI 이벤트 함수가 이러한 과정을 가지고 있다는 점에서 이것이 성능에 영향을 주진 않을까하는 작은 물음을 가지게 되었다. 프레임 단위의 호출이 아니기 때문에

 크게 성능에 영향이 없는건가 싶기도하다. 많은 기업, 그리고 훌륭한 개발자분들이 NGUI를 사용하고 있는 시대에 이제 막 NGUI를 사용하기 시작한 초보의 티를 낸 것이 아닌가 싶기도하다.


4) 누군가가 필요로 할 것 같아서.. 


<camera.cs의 일부...>

'유니티 > NGUI' 카테고리의 다른 글

유니티 NGUI - Button 핵심만  (0) 2018.11.30
유니티 NGUI - Label 핵심만  (0) 2018.11.30
유니티 NGUI - Sprite 핵심만  (0) 2018.11.30
유니티 NGUI - Atlas 핵심만  (0) 2018.11.30
유니티 NGUI - Panel 핵심만  (0) 2018.11.30