01 프리팹(Prefab) 개요
게임 내에서 오브젝트를 복제, 생성하기 위해서는 원본이 되는 게임 오브젝트가 필요하다. 이때, 원본 오브젝트는 게임 내에 있는 오브젝트를 사용하는 것이 아닌 프로젝트 뷰에 파일로 저장해둔 프리팹을 이용한다.
예를 들어, 적 캐릭터를 복제해서 사용한다고 할 때 적을 원본으로 사용한다면 플레이어에 의해 원본으로 사용되던 적이 죽게되면 더이상 복제를 할 수 없게된다. 따라서 안전하게 보관되어 있는 파일 형태의 프리팹을 복제해서 사용하는 것이다.
02 프리팹(Prefab) 생성
✅ 프리팹이란?
게임 (Hierarchy View)에 존재하는 게임 오브젝트를 Project View에 파일로 저장해둔 것
✅ 프리팹 생성 방법
1. 원하는 형태로 게임 오브젝트를 꾸며준다.
2. Hierarchy View의 게임 오브젝트를 Project View로 드래그 & 드롭한다.
3. Hierarchy View에 있는 게임 오브젝트를 삭제한다.
위와 같은 방식으로 Box 라는 이름의 게임 오브젝트를 생성 후, Hierarchy View에서 Project View로 드래그 & 드롭한 후 Project View에서 해당 오브젝트를 확인해보면 .prefab이라는 이름이 붙은 것을 볼 수 있다. 이제 이 프리팹을 복제해서 Hierarchy View에 생성할 수 있다.
03 Instantiate (원본 오브젝트 정보)
✅ Instantiate (GameObject original);
: original 게임 오브젝트(프리팹)을 복제해서 생성
→ 복제되는 오브젝트의 모든 컴포넌트 정보가 원본과 완전히 동일
ObjectSpawner라는 이름의 C# 스크립트를 생성하여 아래와 같이 프리팹 복제를 위한 코드를 작성해준다.
이후 빈 오브젝트를 생성하고 Component 부분에 작성한 ObjectSpawner 코드를 넣어주면 Inpector View에 삽입한 스크립트에 복제할 오브젝트를 선택할 수 있는 부분을 볼 수 있다.
복제할 오브젝트로 Box를 선택하고 게임을 실행하면, 프리팹을 복제해서 만든 Box(Clone)이라는 오브젝트가 하나 생성된 것을 볼 수 있다. 이후 실행을 멈추면 해당 오브젝트는 사라진다.
04 Instantiate(원본, 위치, 회전)
✅ Instantiate (GameObject original, Vector3 position, Quaternion rotation);
: original 게임 오브젝트(프리팹)를 복제해서 생성하고, 생성된 복제본의 위치를 position으로, 회전을 rotation으로 결정
위치도 함께 설정하여 프리팹을 복제하기 위해 아래와 같이 코드를 작성해주었다.
게임을 실행해보니 위의 코드에서 설정해준 위치 값으로 Box 오브젝트가 2개 복제되는 것을 볼 수 있었다.
05 쿼터니온 (Quaternion)과 오일러 (Euler)
📌 오브젝트 회전 관련 개념
1. 오일러 (Euler)
: 3차원의 3개 각도를 표현하기 위해 사용하는 3x3 크기의 행렬
- 장점) 우리가 알고있는 0 ~ 360의 각도를 표현할 수 있다
- 단점) 지속적으로 회전을 하는 연산을 할 때 쿼터니온보다 연산속도가 느리고, 짐벌락 현상이 발생할 수 있다
(* 짐벌락 : 세 개의 축이 서로 종속적인 관계를 가지고 있기 때문에 발생하는 문제로 회전 연산 도중 축이 하나 사라져 3차원의 오브젝트가 일그러지는 현상)
2. 쿼터니온 (Quaternion)
: 사원수로 3개의 백터 요소와 하나의 스칼라요소로 구성 (4개의 -1 ~ 1 사이의 값)
- 장점) 연산 속도가 빠르고, 짐벌락 현상이 발생하지 않는다
- 단점) 우리가 알고있는 0 ~ 360의 각도가 아니기 때문에 특정 각도를 표현하기 힘들다
▶ 유니티 (Unity)
- transform.rotation : 게임 오브젝트의 쿼터니온 회전 정보
- transform.localScale : 게임 오브젝트의 오일러 회전 정보
→ Inspector View에 보이는 Transform의 rotation은 개발자의 편의를 위해 오일러로 표현
▷ Quaternion q = Quaternion.Euler(0, 0, 0);
: 오일러 회전 정보를 입력해서 쿼터니온 회전 값으로 변경
▷ transform.Rotate(new Vector3(1, 0, 0));
: "x축으로 빙글빙글 돌아라"와 같이 지속적인 회전 함수
다음으로 회전 실습을 위해 아래와 같이 스크립트 코드를 수정할 수 있다.
해당 게임을 실행하니 아래와 같이 복제된 프리팹 즉, Box 오브젝트가 45도 회전되어 나타나는 것을 볼 수 있었다.
06 GameObject go = Instantiate();
✅ GameObject clone = Instantiate(GameObject original, Vector3 position, Quaternion rotation);
: original 게임 오브젝트 (프리팹)를 복제해서 생성하고, 생성된 복제 오브젝트의 정보를 clone에 저장. 현재 코드에서 clone과 방금 생성된 박스 오브젝트는 동일하다.
→ clone의 정보가 바뀌면 Hierarchy View에 생성된 오브젝트의 정보가 바뀐다
아래와 같이 복제된 오브젝트에 대해 이름, 색상, 위치, 크기 등을 변경하는 코드를 작성할 수 있다.
게임을 실행하니 아래와 같이 스크립트 코드에서 지정한 게임 오브젝트의 이름, 색상, 위치, 크기로 변경된 것을 볼 수 있다.
출처 : 따라하면서 배우는 고박사의 유니티 기초(https://inf.run/sgcy)
'Study > Unity' 카테고리의 다른 글
[Unity 2D Basic] 게임오브젝트 삭제 함수 (0) | 2024.04.16 |
---|---|
[Unity 2D Basic] Instantiate() 활용 예제 (0) | 2024.04.16 |
[Unity 2D Basic] 게임 오브젝트 물리와 충돌 (0) | 2024.04.10 |
[Unity 2D Basic] 게임 오브젝트 이동 (0) | 2024.04.10 |
[Unity Introduction] 유니티 이벤트 함수 (0) | 2024.04.09 |