이렇게, Tank의 각 요소들을 만들고, Tank라는 빈게임오브젝트로 그룹화를 시켜주는 방식이다.
이렇게 한 후, 부모 객체(Tank)에 저번에 만들었던 PlayerController.cs 컴포넌트를 추가해주면 산하관계에 있는 자식 오브젝트들도 함께 회전하고 이동하게 된다.
단, 이때의 각 자식 오브젝트들의 transform좌표는 변하지 않는다! (Local 좌표로 인식하기 때문)
-> 이것이 산하관계의 특징이다.
이를 활용해서 Player가 검을 휘두르는 등의 액션을 쉽게 만들 수 있다!
이렇게 그룹화하여 만든 객체가 여러 개 필요하게 된다면...?
ctrl+D로 복사해서 배치하는 식의 방식은 매우 비효율적이다.
이들을 하나의 객체로 만들어놓고, 필요할 때마다 가져와서 사용할 수 있도록
Unity는 Prefab 기능을 제공하고 있다.
ㄴ Assets - Prefabs 폴더 생성 - 부모 객체 Drag & Drop
이렇게 해주면 손쉽게 Prefab화할 수 있다. 하나의 객체라는 의미로 아이콘이 파란색으로 채워진 것을 확인할 수 있다.
현재 하이어라키에서 삭제한다고 해도 Prefabs에 저장되어 있기 때문에 언제든지 가져와서 사용할 수 있다.
c# 구조로 생각해보면 다음과 같다.
Tank라는 클래스(설계도)를 만들어 놓고, 필요할 때 new Tank()로 인스턴스화(설계도로 만든 인스턴스)하여 사용하는 것처럼, 필요한 기능을 모두 담은 Tank 프리팹을 만들어놓고, 필요할 때 하이어라키에 가져와서(인스턴스화) 사용하는 것이다!
ㄴ 여기에서 수정하면 AutoSave기능으로 자동저장된다
-> 모든 Prefab 인스턴스에도 자동 적용됨.
ㄴ 이렇게 기본값이 아닌 따로 설정해준 값으로 오버라이드된 인스턴스는 원본 Prefab의 값을 변경하더라도 수정 적용되지 않는다!
* 변경된 속성 확인하는 방법
볼드체로 된 속성을 보는 방법도 있지만, 보기 힘드니까 해당 인스턴스에 Overrides 토글을 클릭하면 기본값과 현재 인스턴스에서 변경된 값을 살펴볼 수 있다.
ㄴ 다시 기본값으로 적용하고 싶으면 Revert 버튼 클릭.
c# 코드로 구현하면 아래와 같다.
여러 프리팹들을 자식객체로 두고 부모 빈게임오브젝트로 그룹화하여 또다시 프리팹으로 만드는 것!
이때 하위 프리팹의 기본값이 바뀌면 Nested Prefab에 있는 해당 프리팹의 값도 수정 적용된다 (단, 오버라이드한 속성 제외)
기존에 있던 프리팹을 또다시 Prefab화 하려고 드래그하면 아래와 같은 팝업창이 뜬다.
Original Prefab: 독립적인 프리팹으로 생성
Prefab Varient: 기존 프리팹을 상속받는 또다른 프리팹으로 생성 (프리팹 변종)
C# 예시
ㄴ Varient로 만들면 이렇듯 빗금친 아이콘으로 바뀐다. 기존 프리팹의 속성값을 바꾸면 당연히 Varient 프리팹의 속성값도 수정 적용된다! (상속관계니까)
단, 마찬가지로 값을 오버라이드한다면 원본 Prefab의 값이 적용되지 않는다.