유니티 3D 에서 큐브를 동적으로 생성하여 떨어뜨리는 예
First Person Controller 가 특정 구역에 접근하면 바위가 떨어져서 길을 막는 장면을 만들어 보고자 한다
빈 게임 오브젝트를 Scene 뷰에 설정하고 Collider를 확장하여 구역을 설정한 후에 Collider 의 Is Trigger 옵션을 선택하면 다른 오브젝트가 해당 구역 안으로 들어오면 OnTriggerEnter () 함수가 호출된다. OnTriggerEnter () 안에서 바위가 떨어지도록 인스턴스를 생성하면 된다.
바위가 실행시에 동적으로 생성되어 떨어지게 하려면 바위 모델은 Prefab 이어야 하고 Rigidbody 콤포넌트에 Use Gravity 항목에 선택된 상태이어야만 중력의 작용으로 공중에서 떨어지는 효과를 낼 수 있다.
또한 바닥에 바위가 떨어져서 충돌하고 멈추게 하려면 바위 프리팹은 Collider 콤포넌트를 포함하고 있어야 한다
Scene 뷰를 다음과 같이 지형 위의 공중에 바위 역할을 하는 큐브를 설정한 상태이다
위의 상태에서 Play 모드로 테스트하면 큐브가 떨어지면서 지형에 충돌하고 멈추는 상태가 된다
여기서는 큐브를 프리팹으로 설정한 후 원본 큐브를 삭제하고 실행시에 큐브 프리팹을 동적으로 생성하여 떨어뜨리는 작업을 하려고 한다.
우선 Project 뷰에 프리팹을 하나 생성하고 Hierarchy 뷰의 Cube 를 드래그하여 생성된 프리팹으로 할당한다
Hierarchy 뷰의 큐브를 드래그하여 프리팹으로 할당한다
Scene 뷰에 있던 큐브를 프리팹으로 설정한 상태이므로 실행시에 동적으로 프리팹의 인스턴스를 생성할 때 위치를 지정하지 않으면 Scene 뷰에 있던 그 자리에 생성된다. 프리팹을 생성하였으므로 Hierarchy 뷰에 있는 Cube 를 삭제한다. 실행시에 동적으로 생성할 수 있는 준비가 되었기 때문이다
이제 지형의 중심부에 Empty GameObject를 생성하고 Box Collider를 추가하고 Is Trigger 옵션을 선택한다.
위에서 설정한 Collider 의 영역으로 다른 오브젝트가 들어가면 큐브 프리팹이 공중에서 떨어지도록 스크립트를 작성한다
#pragma strict
var prefab :GameObject;
function Start () {
}
function Update () {
}
var prevTime:long = 0;
var cnt:int = 0;
function OnTriggerEnter(collider:Collider){
if(cnt<1) {
Instantiate(prefab);
cnt++;
}
}
위의 스크립트를 빈 게임오브젝트에 드래그하여 할당하고 Hierarchy 뷰에서 빈 게임오브젝트를 선택한 후 Inspector 뷰의 스크립트 섹션에서
스크립트에서 선언한 public 변수인 prefab 에 CubePrefab을 드래그하여 할당한다.
설정한 Collider 근처에 First Person Controller 를 배치하고 Play 모드에서 FPC 를 이동하여 Collider 영역으로 들어가면 큐브가 떨어지는 것을 확인할 수있다
만약 큐브가 떨어지는 지점을 변경하고자 한다면 Project 뷰의 프리팹을 Scene 뷰로 드래그하여 위치를 다시 지정하고 Inspector 뷰의 상단에 있는 Prefab Apply 버튼을 누르면 위치가 새로이 변경된다. 위치 변경후 Scene 뷰에 있는 프리팹은 삭제하면 된다