Posted in: Unity, 메서드 & 팁 정리

(유니티) 인스턴스화 Instantiate

인스턴스화?

유니티에서의 인스턴스( instance )는 이미 만들어진 게임 오브젝트를 필요할 때마다 실시간으로 만든다는 의미입니다. 보통 총알이나 몬스터를 찍어낼 때 사용합니다.

나루토가 사용하는 그림자 분신술과 비슷하다고 볼 수 있습니다. 그림자 분신술은 모두 다 똑같은 힘을 가지는 분신들이지만 본체는 단 하나죠.

public GameObject target;

void Start()
{
    Instantiate(target);
}

스크립트를 새로 만들어 위 코드와 같이 작성합니다.

Instantiate함수는 게임 오브젝트를 인스턴스 할 수 있는 함수입니다.

히에라키 창에서 오른쪽 마우스 클릭 -> Create Empty로 빈 게임 오브젝트를 생성합니다. 마찬가지로 3D 오브젝트인 Sphere를 생성합니다.

게임 오브젝트에 방금 작성한 스크립트를 붙이고 생성한 Sphere를 target에 넣어줍니다.

실행시켜보면 스타트 함수에 의해 target을 인스턴스화 하여 Sphere의 복제품이 생성되었습니다.

인스턴스화는 보통 이미 만들어진 게임 오브젝트를 필요할 때마다 생성시키는 용도입니다.

Sphere을 프리팹하고 public GameObject target에 다시 넣어줍시다.

이미 만들어진 게임 오브젝트를 대상으로 인스턴스화 하기때문에 프리팹을 대상으로 인스턴스 하는게 주로 사용되는 방법입니다.

앞서 작성했던 스크립트를 수정해줍시다.

public Transform spawnerPosition;

public GameObject target;

void Start()
{
    Instantiate(target, spawnerPosition.position,
                        spawnerPosition.rotation);
}

Instantiate함수는 게임 오브젝트를 생성시킬 때 위치와 회전도 조정할 수 있습니다.

히에라키에서 Create Empth로 빈 오브젝트를 생성한 후 이름을 SpawnerPosition 이라고 지어줬습니다. 말 그대로 생성되는 위치입니다.

SpawnerPosition 게임 오브젝트를 스크립트에 작성했던 public Transform spawnerPosition과 연결시키면 Sphere 오브젝트를 원하는 위치에 생성시킬 수 있겠군요.

Instantiate함수는 해당 게임 오브젝트가 가지고 있는 타입으로 원본을 가져올 수 있습니다. 즉, 리턴값을 GameObject로만 해야되는게 아니라 Rigidbody같은 자주 활용되는 컴포넌트로도 가져올 수 있습니다.

public Transform spawnerPosition;

public Rigidbody target;

void Start()
{
    Rigidbody instance = Instantiate(target,
                        spawnerPosition.position,
                        spawnerPosition.rotation);
                        
}

그러므로 게임 오브젝트가 Rigidbody 컴포넌트를 가지고 있다면 Rigidbody로 가져올 수도 있습니다.

// 두 코드는 똑같은 의미임

// GameObject 타입으로 가져올 경우
instance.GetComponent<Rigidbody>().AddForce(0,50,0);


// Rigidbody 타입으로 가져올 경우
instance.AddForce(0,50,0);

큰 차이 없다고 생각할 수 있지만, 위 코드처럼 코드가 훨씬 간결해 질 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다