UGUI 커널 탐구(一) EventSystem

UGUI는Unity3D가 공식적으로 내놓은 UI 시스템으로 UGUI를 더욱 잘 사용하기 위해서는 이를 알아야 한다.


UGUI 코드가 시작되었습니다.bitbucket에서 원본 코드로 다운로드할 수 있습니다.
Unity 공식은 액세서리를 숨기는 것을 좋아하지만, 예를 들어 RectTransform과Canvas 시리즈의 원본 코드는 모두 Unity Engine 안에 넣는다. 그러나 이것은 우리가 이미 원본이 시작된 코드를 분석하는 데 방해가 되지 않는다(사실 다소 방해가 되겠지...)
오늘은 UGUI의 이벤트 시스템인 Event System에 대해 살펴보겠습니다.
이름은 크게 지었지만 실제로 이벤트시스템이 클릭, 키보드 입력, 터치 등 이벤트를 처리하고 관리하는 것이기 때문에 이벤트 시스템인 Input 이벤트시스템이 되는 것이 적절하다.
EventSystem이 처음에 List와 변수를 설명한 것을 보았습니다.
        private List m_SystemInputModules = new List();

        private BaseInputModule m_CurrentInputModule;

시스템 입력 모듈표와 현재 입력 모듈.
Base Input Module는 추상적인 클래스로Pointer Input Module는 추상적인 클래스를 계승하고 Standalone Input Module와Touch Input Module는Pointer Input Module에서 계승한다.Standalone Input Module은'PC, Mac & Linux Standalone'이라는 플랫폼을 위한 입력 모듈이고, 터치 Input Module는'iOS','안드로이드'등 터치 가능한 모바일 플랫폼을 위한 입력 모듈이다.
EventSystem은 모든 프레임에서 이 입력 모듈을 처리합니다. 먼저 TickModules 방법을 호출하고 모든 InputModule를 업데이트합니다.
그리고 m시스템 Input Modules는 이러한 모듈이 현재 플랫폼을 지원하는지 판단한다(예를 들어 Standalone Input Module는 마우스가 연결되었는지 판단해야 하고 터치가 지원되는지 판단해야 한다). 그리고 모듈이 활성화되었는지(예를 들어 활성화 가능한 조건인 Standalone Input Module와 Touch Input Module의 원본 코드)
조건에 맞는 모듈이 있으면 m 에 값을 부여합니다CurrentInputModule(현재 입력 모듈) 및 break.
조건에 부합되는 모듈이 없으면 현재 플랫폼을 지원하는 첫 번째 모듈을 m 로 선택합니다CurrentInputModule.
마지막으로 mCurrentInputModule의 값이 변경되었고 mCurrentInputModule이 null로 호출되지 않습니다.
m_CurrentInputModule.Process();

이 방법은 EventSystem에서 현재 선택한 GameObject (m CurrentSelected) 에 다양한 입력 이벤트 (예: 클릭, 드래그 등 이벤트) 를 전달합니다.
반면 mCurrentSelected의 대부분은 Selectable 구성 요소(Button, Dropdown, InputField 등 구성 요소가 계승된 것)에서 설정된 것으로 관련 코드는 후속 글에서 소개할 것입니다.
설정 mCurrentSelected 에서는 Execute Events 클래스를 통해 이전 객체에 대해 취소된 이벤트를 실행하고 새로 선택한 객체에 대해 선택된 이벤트를 실행합니다.이것이 바로 OnSelect와 OnDeselect 두 가지 방법의 유래이다.
EventSystem의 RaycastAll 방법은 카메라에서 점 E로 설정된 점까지 방사선을 UI에 비추고 비추는 모든 대상을 정렬합니다. 대개 원근 정렬입니다.
이 방법은 Pointer Input Module에서 사용한 것으로 만약에 이벤트를 클릭(또는 터치)하여 이동할 때 이 이벤트에 영향을 받는 대상도 변화할 수 있다. Raycast All 방법(전입된 이벤트 데이터의 Position 속성은 점E)을 통해 첫 번째 방사선에 비친 대상을 얻을 수 있다. 만약에 이전의 대상과 다르면객체를 변경할 수 있습니다(원래 객체의 OnPointer Exit 및 새 객체의 OnPointer Enter 메서드를 리셋할 수 있습니다).
IsPointer Over Game Object는 Event System류에서 특히 자주 사용하는 방법으로 UI에 클릭했는지 여부를 판단하는데 구체적으로Pointer Input Module에서 이루어진 것이다. 앞으로 UGUI의 입력 모듈을 연구할 때 깊이 있게 설명할 것이다. 요약하면 현재 어떤 키 위치(기본값-1마우스 왼쪽 키)가 존재하는지 판단하는 데이터이다.
마지막으로 EventSystem에는 static 속성이 있습니다.
        public static EventSystem current { get; set; }

정적 속성이기 때문에current만 존재하며, 모든 실례 대상이 하나씩 있는 것은 아닙니다.
EventSystem 구성 요소 OnEnable에서 이 대상을current에 값을 부여합니다.OnEnabled 및 OnDisabled를 참조하십시오.
        protected override void OnEnable()
        {
            base.OnEnable();
            if (EventSystem.current == null)
                EventSystem.current = this;
#if UNITY_EDITOR
            else
            {
                Debug.LogWarning("Multiple EventSystems in scene... this is not supported");
            }
#endif
        }

Disable에서 current에 null(current==this) 값을 지정합니다.OnEnabled 및 OnDisabled를 참조하십시오.
        protected override void OnDisable()
        {
            if (m_CurrentInputModule != null)
            {
                m_CurrentInputModule.DeactivateModule();
                m_CurrentInputModule = null;
            }

            if (EventSystem.current == this)
                EventSystem.current = null;

            base.OnDisable();
        }

이것이 바로 우리가 Unity Editor에 여러 개의 이벤트시스템을 추가할 때 경고를 하는 이유입니다.
물론 게임이 실행될 때 우리는 함부로 이벤트시스템을 삭제할 수 없다. 첫째, 필요하지 않은 것 같다. 둘째, 이벤트시스템 자체에 많은 것이 없지만 입력 모듈에 데이터가 저장되어 있기 때문이다.

좋은 웹페이지 즐겨찾기