본문 바로가기
  • 불확실한 내일을 위해
유니티 C#/C#

C#기초 - GetComponent 함수 사용법

by 그린초코 2024. 4. 21.

스크립트를 작성할 때 특정 오브젝트의 컴포넌트에 접근하기 위해서는 GetComponent 함수를 사용해야 한다.

텍스트는 GetComponent<Text>()  (예시는 https://greenchoco.tistory.com/164 (비공개글))

오디오는 GetComponent<AudioSource>() 이런 식으로 사용된다. 

 

그리고 직접 만든 스크립트도 컴포넌트의 일종이라서 GetComponent().에 쓸 수 있다.

예를 들어 내가 love 라는 스크립트를 만들었고 그 안에 go메서드가 있다면 GetComponent<love>().go() 으로 love 스크립트의 go메서드를 호출할 수 있다. 

 

좌표를 구할 때는 GetComponent<Transform>() 인데 아래와 같이 쓰면 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Study5_Component : MonoBehaviour
{
    public Transform myTr;

    void Start()
    {
        myTr = GetComponent<Transform>(); //자신의 transform 컴포넌트를 가져와 변수에 할당한다. 
    }
}

 

이 스크립트를 적용한 오브젝트의 인스펙터를 확인하면 아래와 같이 적용된 것을 확인할 수 있다. 

 

추가로 기본 오브젝트인 Directional Light 의 컴포넌트 할당 예시를 들어볼 것이다.

위의 스크립트에서 아래와 같이 tr와 DLlight 변수 선언을 추가하고 DLlight 변수에 tr 컴포넌트를 할당할 것이다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Study5_Component : MonoBehaviour
{
    public Transform tr; // 자신의 Transform 컴포넌트를 담을 변수 선언
    public Transform myTr; // 자신의 Transform 컴포넌트를 담을 변수 선언
    public Light DLlight; // Directional Light의 Light 컴포넌트를 담을 변수 선언

    void Start()
    {
        myTr = GetComponent<Transform>(); //자신의 transform 컴포넌트를 가져와 변수에 할당한다. 
        DLlight = tr.GetComponent<Light>(); // Directional Light 의 Light 컴포넌트를 가져와 변수에 할당한다. 
    }
}

 

해당 오브젝트의 인스펙터는 이렇게 뜰 것이다. 

 

tr 컴포넌트에 아무것도 담지 않아서 tr의 컴포넌트를 가져오는 DLlight 변수의 컴포넌트도 비어있다.

Directional Light 오브젝트에는 기본적으로 아래와 같이 Light 컴포넌트가 포함되어 있다. 

 

즉 DLlight 의 Light 컴포넌트는 Directional Light의 컴포넌트 Light를 가져올 수 있다는 것이다. 

 

그럼 Directional Light를 위의 오브젝트 인스펙터 Tr의 None(Transform) 부분에 드래그하여 넣어준다. 

 

그런 뒤 플레이 버튼을 누르면 아래와 같은 결과가 나온다. 

 

DLlight는 tr에 알당된 Directional Light 의 Light 컴포넌트를 불러와 할당하였다. 

 

 

추가로, GetComponent 함수를 생략하고 가져올 수 있는 컴포넌트도 있다. 

바로 Transform 과 GameObject 인데, 다른 컴포넌트가 없는 빈 오브젝트여도 이 2가지 컴포넌트는 기본적으로 갖고 있으므로 GetComponent 함수를 생략할 수 있다.

 

GameObject는 인스펙터 창에서 이름있는 곳 그 자체라고 생각하면 되고, transform은 위치를 나타내는 기본 컴포넌트라 삭제할 수 없다. 

 

예를 들어 아래와 같이 쓰면

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Study5_Component : MonoBehaviour
{
    public Transform myTr; // 자신의 Transform 컴포넌트를 담을 변수 선언
    public GameObject myG; // 자신의 GameObject 컴포넌트를 담을 변수 선언

    // Start is called before the first frame update
    void Start()
    {
        myTr = transform;
        myG = gameObject;
    }
}

 

아래와 같은 결과가 나온다. 

 

즉  myTr = GetComponent<Transform>(); 은  myTr = transform; 으로 생략 가능하다는 것이고,

myG = gameObject; 는  myG = GetComponent<GameObject >(); 와 같은 뜻인 것이다. 

 

728x90

댓글