[Unity] Instantiate()

남이섬·2023년 3월 8일
0

Instantiate

original 게임오브젝트(프리팹)를 복제해서 생성
(복제되는 오브젝트의 모든 컴포넌트 정보가 원본과 완전히 동일)

Instantiate(GameObject original, Vector3 position, Quaternion rotation)

생성된 복제본의 위치를 position으로, 회전을 rotation으로 설정

회전정보를 나타내고 연산하는 방식에는 쿼터니온오일러 두가지 방식이 있다

오일러 & 쿼터니온

오일러 (Euler)

3차원의 3개 각도를 표현하기 위해 사용하는 3x3 크기의 행렬
즉, 360 각도 표현 방식
회전 순서에 따라 겨로가가 달라지기 때문에 회전 순서에 주의해야 함
(유니티에서는 따로 계산할 일이 없기 때문에 걱절할 필요 없다)

장점: 우리가 알고 있는 0~360의 각도를 표현 할 수 있다
단점: 지속적으로 회전을 하는 연산을 할 때 쿼터니온 보다 연산속도가 느리고, 짐벌락 현상이 발생할 수 있다

짐벌락
세 개의 축이 서로 종속적인 관계를 가지고 있기 때문에 발생하는 문제로 회전 연산 도중 축이 하나 사라져 3차원의 오브젝트가 일그러지는 현상

쿼터니온 (Quaternion)

사원수로 3개의 백터 요소와 하나의 스칼라 요소로 구성 (4개의 -1 ~ 1 사이의 값)

장점 : 연산속도가 빠르고, 짐벌락 현상이 발행하지 않는다
단점 : 우리가 알고 있는 0~360의 각도가 아니기 때문에 특정 각도를 표현하기 힘들다

현재 Instantiate의 세번째 매개변수에 사용되는 회전 정보는 쿼터 아이언으로 나타내기 때문에 특정 각도를 입력하는 것이 어렵다

Quaternion.Euler(0, 0, 1)

위와 같은 함수를 사용하여 각도 값을 표현하게되면 쿼너니언 값으로 변형 시켜 준다

유니티

  • transform.rotation : 게임오브젝트의 쿼터니온 회전 정보
  • transform.localScale : 게임오브젝트의 오일러 회전 정보

Inspector View에 보이는 Transform의 rotation은 개발자의 편의를 위해 오일러로 표현

Quaternion q = Quaternion.Euler(0, 0, 0);
오일러 회전 정보를 입력해서 쿼터니온 회전 값으로 변경

transform.Rotate(new Vector3(1, 0, 0));
x축으로 빙글빙글 돌아라와 같이 지속적인 회전 함수

clone

GameObject clone = Instantiate(GameObject original, Vector3 position, Quaternion rotation);

original 게임오브젝트(프리팹)를 복제해서 생성하고, 생성된 복제 오브젝트의 정보를 clone에 저장 현재 코드에서 clone과 방금 생성된 박스 오브젝트는 동일하다
(clone의 정보가 바뀌면 Hierarchy View에 생성된 오브젝트의 정보가 바뀐다)

clone 코드 정보 변경 코드 예제

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectSpawner : MonoBehaviour
{
    [SerializeField]
    private GameObject boxPrefab;

    private void Awake()
    {
        // 회전 값 설정
        Quaternion rotation = Quaternion.Euler(0, 0, 45);

        // clone 변수에 Instantiate를 생성하여 할당
        // 방금 생성된 복제 정보 받아서 설정
        GameObject clone = Instantiate(boxPrefab, Vector3.zero, rotation);

        // 방금 생성된 게임 오브젝트의 이름 변경
        clone.name = "Box001";

        // 방금 생성된 게임 오브제트의 생상 변경
        clone.GetComponent<SpriteRenderer>().color = Color.black;

        // 방금 생성된 게임 오브젝트의 위치 변경
        clone.transform.position = new Vector3(2, 1, 0);

        // 크기 변경
        clone.transform.localScale = new Vector3(3, 2, 1);
    }
}

코드 예제

Box Prefab

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectSpawner : MonoBehaviour
{
    [SerializeField]
    private GameObject boxPrefab;

    private void Awake()
    {
        Instantiate(boxPrefab);
    }
}

매개변수

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectSpawner : MonoBehaviour
{
    [SerializeField]
    private GameObject boxPrefab;

    private void Awake()
    {
        Instantiate(boxPrefab, new Vector3(3, 3, 0), Quaternion.identity);   
    }
}

회전값

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectSpawner : MonoBehaviour
{
    [SerializeField]
    private GameObject boxPrefab;

    private void Awake()
    {
        Quaternion rotation = Quaternion.Euler(0, 0, 45);
        Instantiate(boxPrefab, new Vector3(2, 1, 0), rotation);   
    }
}
profile
즐겁게 살자

0개의 댓글