Instantiate로 생성된 게임오브젝트는 한마디로 복제품(clone)이다.

이러한 클론들은 프로그램이 Play 도중에는 Hierarchy에 생성이 되었다가 종료하면 사라지 일회성을 갖는다. 

복제품들의 위치정보나 충돌처리를 위해서는 복제품의 Component에 접근을 해야 되는데 이것을 위해 사용하는 것이 바로 as GameObject라던지 as Transform 등이다.


GameObject go = Instantiate(playerprefab, container.transform) as GameObject;
go.GetComponentInChildren<Text>().text = data;


이렇게 하면 clone이 생성돼었을 때 clone의 Component에 접근이 가능하고,

GetComponent를 이용해서 Transform에 접근하거나 다른 Component를 제어할 수 있다. 



Posted by sungho88
,
GameObject Object.Instantiate<GameObject>(GameObject original, Vector3 position, Quaternion rotation)


Instantiate()함수를 사용하면 게임을 실행하는 도중에 게임오브젝트를 생성할 수 있다.

물론 게임이 실행되기 전 미리 만들어놓을 수 있겠지만, 사실상 불가능하다!


만약, RPG 게임이라면 수많은 아이템, 캐릭터, 배경등 모든것들을 어떻게 미리 만들어놓을 수 있을까?

만약, 총을 쏘는 게임이라면 그... 수많은 총알을 어떻게 미리 만들어 놓을 것인가? 

미리 만들어 놓는다는 것은 말도 안된다. 이럴 때는 게임 중에 게임오브젝트를 생성해야 한다.

아니, 생성이 아니라 해당 게임오브젝트의 복제본을 생성한다고 해야 정확할 것이다.

이럴 때 사용하는 함수가 바로 Instantiate() 함수이다. 
ㅇㅣ 함수는 위와 같이 3개의 매개변수를 갖고 있다.


Instantiate(GameObject original ,Vector3 position ,Quaternion rotation)


1. GameObject original

- 생성하고자 하는 게임오브젝트명. 현재 씬에 있는 게임오브젝트나 Prefab으로 선언된 객체를 의미함.


2. Vector3 position

- Vector3으로 생성될 위치를 설정함.


3. Quaternion rotation

- 생성될 게임오브젝트의 회전값을 지정한다. 

- 회전을 굳이 줘야할 상황이 아니라면, 그냥 기본값으로 설정하는 것. --> Quaternion.identity

- 또는 게임오브젝트에서 설정된 회전값. 즉, original.transform.rotation으로 작성해도 됨.


아래와 같이 선언해서 obj라는 게임오브젝트 객체를 동적으로 생성한다.


Instantiate(obj, new Vector3(x,y,z), Quaternion.identity);      // 그냥 회전없음.

또는 

Instantiate(obj, new Vector3(x,y,z), obj.transform.rotation);   // obj의 회전값.


유니티로 돌아와서 실행을 해보면, 해당 게임오브젝트가 복제되고 있음을 볼 수 있다.

어떻게 보냐면, 오브젝트 옆에 괄호로 (clone)이 줄줄이 복제되어 늘어나는 것을 볼 수 있다.

그런데...안 없어진다.

총알을 100번을 날렸다고 가정해보자. 그럼 100개의 총알이 Instantiate에 의해 생성되어 있다는 것이다.


+ 2018/06/08일 내용 추가 & 수정


GameObject UnityEngine.Object.Instantiate<GameObject>(GameObject original, Transform parent)


즉, position과 rotation 설정하지 않고, 특정 하이어라키 위치에서 생성하기 위해 사용할 수 있다.

넣고 싶은 오브젝트를 두 번째 파라미터인 parent에 적어주면 복제 생성시 하위 자식으로 생성된다.



그렇다면, 반대로 Instantiate로 생성한 오브젝트를 제거.삭제하는 함수는 무엇일까?

바로 Destroy()함수이다. Destroy라는 뜻 자체가 파괴하다, 죽이다. 라는 의미이다.


사용방법은 매우 쉽다.

Destroy(GameObject obj);


괄호안에 게임오브젝트 객체를 넣으면 제거된다. 이렇게 호출하면, 그 객체는 곧바로 사라진다.

바로 사라지지 않고 짧은 시간을 지연시킨 후에 오브젝트를 파괴하는 것도 가능하다.


Destroy(GameObject obj, float time);


두 번째 매개변수로 float형 소수를 적어주면, 그 시간만큰 지연 후 사라지도록 할 수 있다.



Posted by sungho88
,