게임 오브젝트 생성 메소드 Instantiate()

Woogie_·2024년 6월 19일

Unity

목록 보기
5/20

프리팹 (Prefab)

프리팹(Prefab) 이란?
게임 내에 존재하는 게임 오브젝트를 Project View로 Drag&Drop 해 파일 형태로 저장하는 것 (프리팹 = Project View에 있는 파일 형태의 게임 오브젝트)
  • 1초마다 적을 생성한다고 했을 때 생성하려고 하는 적 원본을 게임 내에 존재하는 오브젝트로 사용했을 때 만약 이 오브젝트가 사망한다면 더 이상 적을 생성할 수 없게 된다.
  • 그래서 우리는 안전 공간인 Project View에 적 원본 프리팹 파일을 생성하고, 이 프리팹을 복제해서 게임에 등장하는 적을 생성한다.
  • 또한 A 프로젝트에서 만든 게임 오브젝트르 B 프로젝트에서 사용할 때 파일로 옮겨 사용할 수 있도록 프리팹을 사용하기도 한다.

  • 프리팹으로 저장해두고 Instantiate() 메소드를 이용해 오브젝트를 복제 생성하기 위해 2D Square 오브젝트를 생성 ([GameObject - 2D Object - Sprites - Square])

  • Hierarchy View에 있는 Square 오브젝트를 Project View로 Drag & Drop해 프리팹을 생성하고, Hierarchy View에 있는 Square 오브젝트는 삭제

게임 오브젝트 생성 메소드 Instantiate()

  • 유니티 엔진을 이용해 게임을 개발할 떄 유니티 에디터에서 메뉴에 있는 다양한 게임 오브젝트나 사용자가 제작한 오브젝트를 게임에 미리 배치해 둘 수 있다
  • 하지만 주기적으로 등장하는 적, 플레이어가 공격 버튼을 눌렀을 때 생성하는 발사체, 상자를 개봉했을 때 나오는 아이템 등과 같이 조건을 만족했을 때 생성하는 오브젝트는 미리 배치해두는 것이 아닌 게임 플레이 도중에 생성한다.
  • 이렇게 게임 플레이 도중에 코드를 이용해 오브젝트를 생성하는 메소드가 Instantiate() 메소드
== built-in method ==
Instantiate(GameObject original);
original과 완전히 동일한 게임 오브젝트를 게임 월드에 생성
  • Instantiate() 메소드의 첫 번째 매개변수에 복제할 원본 오브젝트를 입력하면 원본 오브젝트와 완전히 동일한 정보를 가지는 게임오브젝트가 생성

  • 게임 플레이 도중에 Instantiate() 메소드를 호출해 오브젝트를 생성하는 ObjectSpawner 스크립트를 생성

  • 복제할 오브젝트 정보를 담고 있는 GameObject 타입의 squarePrefab 변수를 선언

  • 게임이 실행된 직후 호출하는 Awake() 메소드 내부에 Instantiate(squrePrefab); 메소드를 호출
  • 게임이 실행되면 squarePrefab 변수에 저장되어 있는 프리팹과 동일한 게임 오브젝트를 1개 생성해 Hierarchy View에 배치

  • 작성한 스크립트를 실행하기 위해 빈 오브젝트를 생성하고, ([GameObject - Create Empty]) 이름을 ObjectSpawner로 변경한 후 ObjectSpawner 컴포넌트를 추가한다.

  • ObjectSpawner 컴포넌트의 SquarePrefab 변수에 Square 프리팹을 등록한다.

  • 게임을 실행하면 게임이 실행된 직후 원본 Square 프리팹의 정보와 완전히 동일한 오브젝트가 1개 생성

  • Instatntiate() 메소드는 매개변수에 따라 10종류의 메소드가 있다.
== built-in method ==
Instantiate(GameObject original, Vector3 position, Quaternion rotation);
복제 생성하는 오브젝트의 위치(position), 회전(rotation)을 설정할 수 있다.
  • 첫번째 매개변수에 복제할 오브젝트 원본, 두 번째 매개변수에 생성되는 오브젝트의 위치, 세 번쨰 매개변수에 생성되는 오브젝트의 쿼터니온 회전 정보를 입력

    해석에 사용된다.

  • Awake() 메소드 내부에 Quaternion 타입의 변수 rotation을 선언하고, Quaternion.Euler() 메소드를 이용해 (0, 0, 45) 각도를 저장

  • Instantiate() 메소를 호출할 때 두 번째 매개변수에 new Vector3(2, 2, 0)으로 오브젝트의 위치는 (2, 2, 0), 세 번째 매개변수에 rotation으로 오브젝트의 회전은 (0, 0, 45)로 설정

오일러 (Euler)

  • 3차원의 3개 각도를 표현하기 위해 사용하는 3x3 크기의 행렬 회전 순서에 따라 결과가 달라지기 때문에 회전 순서에 주의해야 함

  • (유니티에서는 따로 계산할 일이 없기 때문에 걱정할 필요 없음)

  • 장점 : 우리가 알고 있는 0 ~ 360의 각도를 표현할 수 있다

  • 단점 : 지속적으로 회전을 하는 연산을 할 때 쿼터니온 보다 연산속도가 느리고, 짐벌락 현상이 발생할 수 있다.


출처 : 위키 백과

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

쿼터니언 (Quaternion)

  • 오일러의 단점을 보완하는 개념

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

  • 장점 : 연산속도가 빠르고, 짐벌락 현상이 발생하지 않는다

  • 단점 : 우리가 알고 있는 0 ~ 360의 각도가 아니기 때문에 특정 각도를 표현하기 힘들다

유니티(Unity)

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

  • transform.eulerAngles : 게임오브젝트의 오일러 회전 정보

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

  • Quaternion q = Quaternion.Euler(0, 0, 0);

  • 오일러 회전 값을 입력해 쿼터니언 회전 값으로 변경

  • transform.Rotate(new Vector3(1, 0, 0));

  • "매 프레임 X축 양의 방향으로 1도씩 돌아라"와 같이 지속적인 회전 메소드

  • 게임을 실행하면 원본의 위치와 회전이 아닌 (2, 2, 0)의 위치에 (0, 0, 45)만큼 회전되어 생성
== built-in method==
GameObject clone = Instantiate(..);
방금 생성한 오브젝트 정보를 반환 받아 변수에 저장 및 제어할 수 있다.
  • 오브젝트를 생성하고, 생성한 오브젝트를 제어하는 상황이 발생할 수 있다.
  • 이럴 때는 Instantiate() 메소드로부터 오브젝트 정보를 반환 받아 방금 생성한 오브젝트를 제어할 수 있다

  • Instantiate()로 생성한 오브젝트 정보를 clone 변수에 저장

  • clone.name = "Square001"; 로 생성한 오브젝트의 이름을 설정하고 clone.GetComponent SpriteRenderer().color = Color.black; 으로 생성한 오브젝트의 SpriteRenderer 컴포넌트에 접근해 색상을 검은색으로 설정

  • clone.transform.position = Vector3.zero; 로 Transform 컴포넌트에 접근해 위치를 (0, 0, 0)으로 설정

  • 게임을 실행하면 (0, 0, 0) 위치, (0, 0, 45) 회전 값을 가지는 검은색 오브젝트 생성
  • Hierarchy View를 보면 오브젝트의 이름이 "Square001"로 변경되어 있다.
profile
상상을 구현하는 개발자

0개의 댓글