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

김지수님의 프로필 이미지
김지수

작성한 질문수

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

UI 자동화 #2

Util.FindChild<T>(gameObject, names[i], true)와 관련하여...

해결된 질문

작성

·

434

3

안녕하세요! 강의 복습 중에 또 질문이 생겨 질문드립니다!

이전 강의에서 다른 분 질문을 통해 componet.name은 결국 Button, Text 등 T 타입의 클래스를 컴포넌트로 들고 있는 게임오브젝트의 이름을 가져온다는 것은 이해가 되었습니다.

그렇다면 Util.FindChild<T>(gameObject, names[i], true) 함수의 return 값이 T component인데

디버깅한 장면에서  _objects 딕셔너리의 Value 값이  ("PointButton{Unity.Engine.UI.Button}")로 되어 있는 건 사실은 Button Component를 return 했지만 걔는 PointButton꺼야 라는 뜻인가요..?

Get 함수를 만들 때 return 값을 다시 T로 캐스팅 하는 것을 미루어 보아

Bind 할때 objects[i] = Util.FindChild<T>(gameObject, names[i], true)에서 자동으로 Object로 캐스팅 되었다가(부모 클래스이기 때문에..?)

다시 꺼내 쓸때는 T로 캐스팅 해야하는 건가요..?

답변 2

1

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

복잡하게 생각하실 것 없이,
유니티에서 어지간한 리소스는 UnityEngine.Object를 상속받고 있습니다.
return을 다시 T로 캐스팅하는 이유는
Dictionary의 value를 Object[]로 관리하고 있기 때문입니다.
타입만 확실하다면 업캐스팅/다운캐스팅은 자유자재로 해도 무방합니다.
마치 Player, Monster와 같은 애들을 Creature로 묶어서 관리하는 것과 유사합니다.

디버깅한 장면에서  _objects 딕셔너리의 Value 값이  ("PointButton{Unity.Engine.UI.Button}")로 되어 있는 건 사실은 Button Component를 return 했지만 걔는 PointButton꺼야 라는 뜻인가요..?

네!

Bind 할때 objects[i] = Util.FindChild<T>(gameObject, names[i], true)에서 자동으로 Object로 캐스팅 되었다가(부모 클래스이기 때문에..?) 다시 꺼내 쓸때는 T로 캐스팅 해야하는 건가요..?

네!

0

김지수님의 프로필 이미지
김지수
질문자

감사합니다!

김지수님의 프로필 이미지
김지수

작성한 질문수

질문하기