인프런 커뮤니티 질문&답변

Hyobin Kim님의 프로필 이미지
Hyobin Kim

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진

UI 자동화 #3

Rect Transform

작성

·

323

0

((PointerEventData data) => {evt.gameObject.transform.position = data.position;})

처음에는 transform.position = data.postion이라고 했다가, image UI가 드래그 해도 움직이지 않게 되는걸 보여주셨고

그래서 뒤에 evt.gameObejct를 추가해서

UI_EventHandler를 들고 있는 게임오브젝트의 트랜스폼을 변경하는걸로 고쳐주시잖아요

이 부분을 이해하는건 딱히 어렵지 않았습니다만

그 과정에 발생하지 않은 어떤 부분이 이해가 안됩니다

처음에 transform.position = data.position만 있을때는 말 그대로 이 스크립트(UI_Button.cs)가 붙어있는 UI_Button이라는 게임오브젝트의 트랜스폼을 변경하는거잖아요

당연히 이 오브젝트는 Transform 대신에 RectTransform을 들고 있으니까 저 변경이 적용될리가 없다고 이해했습니다

그런데 왜 여기서 NullReferenceException이 뜨질 않는건가요?

어쨋든 Transform이라는 컴포넌트가 있는건 아닌데 말이죠

지금 그 다음강의를 보고 있다가 혹시나 하는 생각으로 글에다 추가 중인데요

혹시 저기서 NullReferenceException이 뜨질 않는 이유가, RectTransform이 Transform을 상속하고 있는것과 관련이 있나요?

그리고 한가지 더 질문을 드리면, 수정전 코드로 이미지UI를 드래그해서 움직이려고 하면 UI_Button 오브젝트의 transform을 변경하게 되는거였다고 했잖아요

그런데 UI_Button의 RectTransform 컴포넌트의 좌표를 보고 있어도 변하질 않던데 이건 왜 그런가요?

답변 3

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

첫번째 답변에 따르면, 코드에서 접근하려는 컴포넌트 그자체가 게임오브젝트에 달려있지 않지만, 해당 게임 오브젝트가 코드에서 접근하려는 컴포넌트를 상속받고 있는 컴포넌트를 들고 있으면 괜찮다는 말씀이시죠?

네 맞습니다.

컨텐츠 작업에 유용하다는 말씀은 무슨 뜻인가요?

나중에 후반부에 RPG 샘플 게임을 만들면 감이 오실텐데
우리가 붙이는 MonoBehaviour 스크립트들도 상속 구조로 만들어서,
부모 클래스를 찾는 방법 등을 이용하게 됩니다. (ex. CreatureController, PlayerController 등)

코드가 이럴때의 경우, 드래그해서 transform.positon에 변화가 생기는 대상은 캔버스 그자체 UI_Button이잖아요?
그런데 이건 코드를 저 상태로 두고 Image UI를 드래그 해도 움직이질 않더라고요

어떤 UI가 이벤트를 안 먹는 경우는 빈번하게 일어나고
이유는 굉장히 다양하게 존재할 수 있습니다.
가령 EventSystem을 빼먹었다거나, Raycast Target을 뺴먹은 등의 경우도 있지만

가장 찾기 어려운 케이스는 동일한 위치의 다른 UI가
클릭 이벤트를 '먼저' 먹어 버린 경우가 많습니다.
지금은 아마 그런 경우로 예상되네요.
저런 문제 판별하려면 로그를 찍는게 가장 확실합니다.

0

Hyobin Kim님의 프로필 이미지
Hyobin Kim
질문자

첫번째 답변에 따르면, 코드에서 접근하려는 컴포넌트 그자체가 게임오브젝트에 달려있지 않지만, 해당 게임 오브젝트가 코드에서 접근하려는 컴포넌트를 상속받고 있는 컴포넌트를 들고 있으면 괜찮다는 말씀이시죠?

컨텐츠 작업에 유용하다는 말씀은 무슨 뜻인가요?

두번째 답변에서 영상에서 잘 움직이고 있는 RectTransform은 ItemIcon의 TectTransform이고

제가 질문 드린바는

        AddUIEvent(go, (PointerEventData data) => {transform.position = data.position; }, Define.UIEvent.Drag); 

코드가 이럴때의 경우, 드래그해서 transform.positon에 변화가 생기는 대상은 캔버스 그자체 UI_Button이잖아요?

그런데 이건 코드를 저 상태로 두고 Image UI를 드래그 해도 움직이질 않더라고요

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

혹시 저기서 NullReferenceException이 뜨질 않는 이유가, RectTransform이 Transform을 상속하고 있는것과 관련이 있나요?

-> 맞습니다. RectTransform 코드를 따라가보면 Transform을 상속받고 있습니다.
Component끼리 상속 관계가 있을 때 부모 클래스로 찾을 수가 있는데,

컨텐츠 작업에 특히 유용합니다.

그런데 UI_Button의 RectTransform 컴포넌트의 좌표를 보고 있어도 변하질 않던데 이건 왜 그런가요?
-> 혹시 해당 오브젝트의 RectTransform을 보고 계신게 맞을까요?
15:41 부근을 보시면 잘 움직이고 있습니다

Hyobin Kim님의 프로필 이미지
Hyobin Kim

작성한 질문수

질문하기