• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

GetComponent에 대해서

20.05.16 23:46 작성 조회수 748

1

이 함수가 해당 게임 오브젝트의 컴포넌트를 불러오는 함수인 거죠?

Instance = go.GetComponent<Managers>();의 경우에는

게임 오브젝트 go에 넣어진 @Managers의 Managers란 컴포넌트를 불러와서 Instanc에 넣는 거고요.

그런데 비주얼 스튜디오에서 GetComponent의 설명을 읽어보니

Component GameObject.GetComponent(systerm type type)

라고 되어 있던데 맨 앞의 Component는 왜 붙어있는 건가요?

유니티의 도큐멘테이션에서는 Component.GetComponet라고 되어 있던데 이렇게 쓰면 컴포넌트의 컴포넌트를 불러온다는 건가요???? 마치 인셉션처럼??

헷갈리네요 ㅜㅜ

답변 1

답변을 작성해보세요.

3

안녕하세요,

GetComponent도 버전이 여러개가 있는데
Instance = go.GetComponent<Managers>();에서 사용한 버전은 Generic 버전입니다.
그러니까 T GetComponent<T>(); 이 버전입니다.

물론 다른 형태의 GetComponent도 있는데요.
Component GetComponent(Type type);
Component GetComponent(string type);

GetComponent(typeof(Managers)) 형태로 호출이 가능하겠죠.
그런데 여기서 앞에 Component는 왜 있는걸까요?
모든 함수는 반환 타입을 지정해야 하는데 (함수 호출이 완료되면 무엇이 반환되는지)
여기서는 GetComponent를 사용하면,
반드시 Component이라는 클래스 형식을 반환한다는 의미입니다.
그런데 Managers의 경우 Component가 아닌데? 라고 의문이 들긴 하지만,
유심히 보면 Managers는 MonoBehaviour를 상속 받았고,
MonoBehaviour는 Behaviour를, Behaviour는 Component를 상속 받은 것을 알 수 있습니다.
결국 Managers는 Component의 먼 손자 정도 된다고 볼 수 있습니다.
결국 GetComponent의 반환 타입인 Component가 의미하는 바는
반환 타입은 [Component 혹은 Component를 상속받은 클래스를 반환한다]는 의미라고 보시면 되겠습니다.

마지막으로 Component.GetComponent (앞에 .이 있는 경우)는 조금 다른 의미입니다.
GetComponent가 어떤 클래스에 정의되어 있는지를 명시해주는 것인데요.
GameObject라는 클래스 안에 GetComponent가 있으면 GameObject.GetComponent를 사용하고,
Component라는 클래스 안에 GetComponent가 있으면 Component.GetComponent를 사용하는 것입니다.
우리가 보통 사용하는건 GameObject안에 있는 함수를 사용하는데,
Component 클래스에도 동일한 GetComponent가 정의되어 있긴 합니다.
워낙 자주 사용하는 기능이다 보니 여기 저기서 사용할 수 있게 인터페이스를 열어준거라 보시면 됩니다.
(참고로 이 경우 인셉션이랑은 아~무런 상관이 없습니다 ㅎㅎ 혼동하시면 안 됩니다)