이 예시에서는 플레이어가 발사 버튼을 누르면 Launcher 게임 오브젝트가 발사체 프리팹을 인스턴스화합니다. 프리팹에는 메시, 리지드바디, 콜라이더가 포함되어 있으므로 공기를 통과하여 충돌이 발생하는 시점을 감지할 수 있습니다.
발사체가 무언가와 충돌하여 폭발 프리팹을 인스턴스화합니다. 폭발 프리팹에는 파티클 시스템 효과, 그리고 주변 게임 오브젝트에 힘을 가하는 스크립트가 포함됩니다.
블록 예시와 동일한 방식으로, 발사체 프리팹이 얼마나 복잡한지에 상관없이 발사체를 코드 한 줄로 인스턴스화할 수 있습니다. 프리팹을 인스턴스화한 후에는 인스턴스화된 게임 오브젝트의 모든 프로퍼티도 수정할 수 있습니다. 예를 들어 발사체 리지드바디의 속도를 설정할 수 있습니다.
사용하기 쉬우면서도 나중에 코드를 수정하지 않고도 프리팹을 수정할 수 있습니다. 발사체가 로켓인 경우 나중에 파티클 시스템을 추가하여 연기 흔적을 남기도록 할 수 있습니다. 이렇게 하면 인스턴스화된 모든 로켓에 파티클 트레일이 생깁니다.
다음은 Instantiate 메서드를 사용하여 발사체를 발사하는 스크립트의 예입니다.
using UnityEngine;
public class FireProjectile : MonoBehaviour
{
public Rigidbody projectile;
public float speed = 4;
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
Rigidbody p = Instantiate(projectile, transform.position, transform.rotation);
p.velocity = transform.forward * speed;
}
}
}
코드에서 프리팹 변수 유형은 게임 오브젝트가 아니라 리지드바디입니다. 여기에는 두 가지 유용한 효과가 있습니다.
이 변수에는 Rigidbody 컴포넌트가 있는 게임 오브젝트만 할당할 수 있습니다. 이는 변수에 올바른 게임 오브젝트를 할당하는 데 도움이 되므로 유용합니다.
Instantiate 메서드는 새 인스턴스의 Rigidbody 컴포넌트에 대한 레퍼런스를 반환합니다. 이는 인스턴스화 후 즉시 리지드바디의 속도를 간편하게 설정할 수 있으므로 유용합니다.
public 프리팹 변수를 만들 때 변수 유형은 게임 오브젝트, 또는 임의의 유효한 컴포넌트 유형(빌트인 Unity 컴포넌트 또는 자체 MonoBehaviour 스크립트 중 하나)일 수 있습니다.
게임 오브젝트 유형 변수의 경우 변수에 게임 오브젝트를 할당하면 Instantiate 함수가 새로운 게임 오브젝트 인스턴스에 대한 레퍼런스를 반환합니다.
컴포넌트 유형 변수(예: 리지드바디, 콜라이더, 광원)의 경우 해당 컴포넌트 유형의 게임 오브젝트만 변수에 할당할 수 있습니다. 그러면 Instantiate 함수가 새로운 게임 오브젝트 인스턴스에서 해당 컴포넌트에 대한 레퍼런스를 반환합니다.
다음 스크립트(발사체 프리팹에 배치됨)는 발사체의 현재 위치에서 폭발을 인스턴스화하고, 발사체가 무언가와 충돌하면 발사체 게임 오브젝트를 제거합니다.
using UnityEngine;
public class Projectile : MonoBehaviour
{
public GameObject explosion;
void OnCollisionEnter()
{
Instantiate(explosion,transform.position,transform.rotation);
Destroy(gameObject);
}
}
플레이 모드에서 실행되는 스크립트를 보여주는 위 이미지에서 인스턴스화된 게임 오브젝트는 계층 구조에 나타나며, 이름에 (Clone)이 붙습니다.