본문 바로가기
Unity 게임 개발

Unity Object.Instantiate() 설명

by daisy0461 2021. 3. 21.

 

docs.unity3d.com/ScriptReference/Object.Instantiate.html

 

Unity - Scripting API: Object.Instantiate

This function makes a copy of an object in a similar way to the Duplicate command in the editor. If you are cloning a GameObject you can specify its position and rotation (these default to the original GameObject's position and rotation otherwise). If you

docs.unity3d.com

위에 나와있는 것이 Unity Scription API 2020.3버전입니다.

 

우선 Instantiate의 뜻을 알아보도록 합시다.

Instantiate의 뜻을 알려면 instance 또한 알고 있어야합니다.

 

instance: 추상화 개념 또는 클래스의 객체, 컴퓨터 프로세스등과 같은 템플릿이 실제 구현된 것이다. 

 

많은 곳에서 찾아보면 class와 instance의 의미에 대해 설명을 하고 있습니다.
많은 예시가 'class는 설계도 instance는 이러한 설계도로 만든 제품'이라 설명하고 있습니다.

코드를 통해 예시를 들어보겠습니다.

class Home{

}

위 { }안에는 집을 만들 때 필요한 재료가 들어있다고 생각을 해봅시다. 그 재료들을 가지고 설계도를 만든 것입니다.

이제 여러개의 집을 만들어봅시다.

Home myHome = new Home;
Home yourHome = new Home;
Home friendHome = new Home;
Home hisHome = new Home;

여기서 의문이 하나 생길 수 있습니다. 그냥 집 하나를 만들어서 다 같이 사용하면서 살면 되지 않나??
왜 내꺼 니꺼 친구꺼 저사람꺼 만들지??

집에는 각자 선호하는 인테리어도 있을거고 각자 생활패턴이 있을 것입니다. 즉, 같은 재료로 만든 똑같은 집이라고 할 지라도 다들 사용하는 방식은 다르다는 의미입니다. 그렇기에 각자 다른 집을 부여해주는 것입니다.

 

Home myHome = new Home;
Home yourHome = myHome;
Home friendHome = myHome;
Home hisHome = myHome;

그리고 다른 예시로 위와 같이 같은 집으로 만들면 혹시 myHome에서 불이 나서 다 타서 잿더미가 되었습니다.
그런데 다른 yourHome, friendHome, hisHome 세 곳에서 불이 나지도 않았는데 잿더미가 되면 안되지 않겠습니까. 그렇기에 각각 만들어 줍니다. 

 

이렇게 되면 대략적으로 class와 instance의 의미를 구분할 수 있을 것이라 생각됩니다.

다시 한번 정리를 하자면 class는 만드는 틀, instance는 class를 기반으로 만든 각각 다른 것 이라고 생각하면 됩니다.

 

자... 길고긴 instance가 끝났습니다. 이제 instantiate로 갑시다.

 

instantiate: 인스턴스화라고 하며 class로부터 instance를 생성하는 것입니다.

위에 설명했던 예시를 빌려서 하면 Home이라는 class로부터 instantiate(인스턴스화)를 해서 myHome이라는 instance가 만들어지는 것 입니다.

다시 한번 부가적으로 설명을 하자면 Home이라는 class에 있는 재료들로 myHome을 만드는 일입니다.

Unity에서 사용하는 방법도 Object를 만드는 일을 수행하는 함수로써 사용됩니다. 

 

그럼 Unity에서 사용되는 Instantiate()의 사용 방법들을 알아봅시다.

이 함수가 왜 사용되는지에 대해 알고 있으면 함수에 사용되는 파라미터에 대해 더 잘 이해할 수 있을 것 같아서 먼저 설명을 드리겠습니다.

Instantiate()함수를 사용하면 Game Play중에 Object를 생성할 수 있습니다. 
물론 다른 방법도 있겠습니다. 예를 들면 SetActive(false); 상태에서 ture로 바꿔주며 진행을 해도 되지만 Object들의 수는 게임 안에 너무나도 많기 때문에 하나하나 그렇게 적용시키긴 어렵습니다. 그렇기에 Instantiate함수를 사용합니다.

 

public static Object Instantiate(Object original);

public static Object Instantiate(Object original, Transform parent);

public static Object Instantiate(Object original, Transform parent, bool instantiateInWorldSpace);

public static Object Instantiate(Object original, Vector3 position, Quaternion rotation);

public static Object Instantiate(Object original, Vector3 position, Quaternion rotation, Transform parent);

위 5개가 사용을 할 수 있는 방법들 입니다. 각 파라미터를 설명하겠습니다. 

 

Object형 original 사용자 당신이 복사를 하고 싶어하는 Object를 의미합니다.
생성하고자 하는 Object의 이름을 넣어서 사용하면 됩니다.
현재 Scene에 있는 Object또는 Prefab으로 선언된 객체를 넣으면 됩니다. 
Vector3형 position Object original을 생성할 때 Vector3를 설정합니다.
Quaternion형 rotation Object original을 생성할 때 Quaternion을 설정합니다. 
Transform형 parent Object original에 할당될 부모 Object입니다.
bool형 instantiateInWorldSpace ture가 전달이 되면 World좌표를 기준으로 생성합니다.
false인 경우 Parent 좌표를 기준으로 생성을 합니다.

 

위 Instantiate의 Return형은 인스턴스화된 Obejct. 즉, original이 return됩니다.

이때 return되는 original이라는 Object는 GameObject뿐 아니라, Component도 복제가 됩니다. 모든 자식 객체 및 컴포넌트가 복제가 되고 설정 또한 동일하게 됩니다.
추가적으로 원본 Object가 비활성화 상태이면 return되는 Object또한 비활성화 상태가 됩니다. - 설정이 동일하기 때문입니다.