본문 바로가기
Unity/함수

Instantiate함수

by Jinger 2023. 4. 12.

서론

    유니티에서 Instantiate 함수는 새로운 게임 오브젝트를 생성하는 데 사용한다. 이 함수를 사용하면 미리 만들어 놓은 프리팹을 이용하여 게임 오브젝트를 생성할 수 있다. 상세한 내용을 알기 위해 프리팹, 부모, 계층창에 대해 가볍게 설명하겠다.


Instantiate

    매개변수에 따라 자세한 설정으로 프리팹을 생성할 수 있다. 아래 함수들 모두 Object를 반환한다.

//1.기본 형태
public static Object Instantiate(Object original);
//2.부모 설정
public static Object Instantiate(Object original, Transform parent);
//3.부모 설정 + 좌표계 설정
public static Object Instantiate(Object original, Transform parent, bool instantiateInWorldSpace);
//4.생성 위치 설정 + 바라보고 있는 방향 설정
public static Object Instantiate(Object original, Vector3 position, Quaternion rotation);
//5.생성 위치 설정 + 바라보고 있는 방향 설정 + 부모 설정
public static Object Instantiate(Object original, Vector3 position, Quaternion rotation, Transform parent);
  • original: 복사할 프리팹
  • patent: 새 객체에 할당될 부모
  • instantiateInWorldSpace: 생성할 게임 오브젝트의 위치를 부모 게임 오브젝트의 좌표계(false)에 상대적으로 배치할 것인지, 월드 좌표계(true)에 상대적으로 배치할 것인지를 결정하는 불리언값. (디폴트값은 false이다.)
  • position: 새 객체의 생성 위치
  • rotation: 새 객체의 방향

1번 형태는 받아온 프리팹을 그대로 생성하기만 한다.

2번은 부모를 직접 지정 가능하다.

3번은 부모를 직접 지정하고 좌표계를 설정한다.

4번은 프리팹의 생성 위치와 바라보는 방향을 설정해 준다.

5번은 4번 기능에 부모 지정하는 기능이 추가된 것이다.

parent

     부모(Parent)는 게임 오브젝트의 계층 구조에서 상위에 위치하는 게임 오브젝트를 말한다. 부모 게임 오브젝트는 자식 게임 오브젝트를 가질 수 있으며, 이를 통해 게임 오브젝트의 계층 구조를 만들어 낼 수 있다. 부모-자식 관계를 이용하면 자식 게임 오브젝트를 부모 게임 오브젝트의 좌표계에 상대적으로 배치할 수 있다. 이때, 자식 게임 오브젝트는 부모 게임 오브젝트를 기준으로 상대적인 위치와 회전을 가진다. 이러한 부모-자식 구조는 게임 오브젝트의 구조화와 관리를 용이하게 하며, 특히 게임 오브젝트의 그룹화에 유용합니다. 또한, 부모-자식 구조를 이용하여 특정 게임 오브젝트를 제어하거나 다른 게임 오브젝트와의 상호작용을 구현할 수도 있습니다.

 우리는 여기서 프리팹 인스턴스 생성 시 hierarchy(계층창)에 생성되는 것을 정리 혹은 부모관계가 아닌 것을 오브젝트를 이어주는 것을 이용한다.

parent&SetParent

     parent와 SetParent는 둘 다 부모를 지정해 주는 키워드와 함수이다. 둘 다 transform 하위에 존재하며 아래와 같이 접근 가능하다. parent는 해당 부모를 (get, set)이 가능하고 SetParent은 직접 부모를 set만 가능하다.

obj.transform.parent = GameObject.Find("부모로 지정하고 싶은 객체").transform;
obj.transform.SetParent(character);

    만약 "부모로 지정하고 싶은 객체"가 해당 코드를 적은 스크립트가 적용이 된 오브젝트일 경우 "obj.transform.parent = transform;"로 짧게 지정할 수 있다.

Destroy

    생성만 되고 삭제를 하지 않으면 컴퓨터의 계산량이 낭비되기에 필요 없어지면 항상 삭제하는 것을 잊지 말자.

public static void Destroy(Object obj, float t = 0.0F);
  • obj : 삭제할 오브젝트
  • t : delay 시간, 디폴트 값이 있으므로 생략 가능 E.g. t = 5.0f 하면 5초 후 제거

예시

Base

     스페이스바를 클릭하면 캐릭터에서 무기가 생성이 되고 오른쪽으로 날아가는 기능이다. Rigidbody를 이용한 이유는 날아가는 무기의 transform이 아닌 속도로 이동하게 하기 위함이다. 3D에서도 사용 가능하다.

1. 캐릭터가 무기 소환

    Quaternion.Euler(0f, 0f, -90f)은 직접 프리팹의 Rotation을 지정해준 함수이다.

public class Character : MonoBehaviour
{
    public GameObject weapon;
    public float projectileSpeed = 10f;
    public float fireRate = 0.5f;

    private float nextFireTime = 0f;
    void Update()
    {
        if (Input.GetKey(KeyCode.Space) && Time.time > nextFireTime)
        {
            nextFireTime = Time.time + fireRate;
            GameObject obj = Instantiate(weapon, transform.position, Quaternion.Euler(0f, 0f, -90f));
            obj.transform.parent = transform;
            Rigidbody2D rb = obj.GetComponent<Rigidbody2D>();
            rb.velocity = new Vector2(projectileSpeed, 0f);
            Destroy(obj, 10);
        }
    }
}

2. 캐릭터가 무기 스크립트 호출 후 무기 스크립트에서 소환

    아래 주석 처리로 부모를 지정해 줄 수 있다.

public class Character : MonoBehaviour
{
    public GameObject weapon;
    public float projectileSpeed = 10f;
    public float fireRate = 0.5f;
    public Knife knife;

    private float nextFireTime = 0f;
    void Update()
    {
        if (Input.GetKey(KeyCode.Space) && Time.time > nextFireTime)
        {
            nextFireTime = Time.time + fireRate;
            knife.Spawn(weapon, projectileSpeed, transform);
        }
    }
}
public class Knife : MonoBehaviour
{
    public void Spawn(GameObject weapon, float speed, Transform character)
    {
        GameObject obj = Instantiate(weapon, character.position, Quaternion.Euler(0f,0f,-90f));
        //obj.transform.SetParent(character);
        //obj.transform.parent = GameObject.Find("Character").transform;
        Rigidbody2D rb = obj.GetComponent<Rigidbody2D>();
        rb.velocity = new Vector2(speed, 0f);
        Destroy(obj, 10);
    }
}

부모 설정

   왼쪽은 부모 설정을 하지 않아 계층창에 클론들이 생성이 된 상태, 오른쪽은 부모 설정을 하여 "Character"부모 아래에 클론들이 정렬이 된 상태이다.


주섬주섬

 작업을 하다 보면 계층창에 많은 오브젝트들이 생성이 되는 데, 무엇이 어떤 기능을 하고 게임을 진행할 때 생성된 것들을 정리하여 보기 위해 부모 설정은 중요하다.

참고

 

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 매뉴얼

트랜스폼(Transform) 은 게임 오브젝트의 포지션, 회전, 스케일, 부모-자식 상태를 저장하기 위해 사용하며 따라서 매우 중요합니다. 게임 오브젝트에는 항상 하나의 트랜스폼 컴포넌트가 있습니다

docs.unity3d.com

반응형

'Unity > 함수' 카테고리의 다른 글

이벤트 함수  (0) 2023.06.02

댓글