자동차 하나를 유니티에서 만든다고 해보자. 객체지향 프로그래밍에 따라 자동차는 여러 부품들로 이루어진 객체가 하나로 뭉쳐 만들어진다. 거기에 이동, 핸들에 따른 회전 등 여러 기능들도 포함될 것이다. 이러한 완성품을 하나의 설계도를 통해 바로 만들어 주는 기능이
프리팹이다

Local Space, 전체 공간에서의 World Space 위치 정보를 동시에 가지기 때문에, 그룹화 된 오브젝트로서의 동작 제어가 간편함
드래그 & 드롭하면 자동으로 상속이 된다
부모 오브젝트를 위한 스크립트를 작성한다 public class ParentScript : MonoBehaviour
{
public GameObject Target;
public Transform TargetTransform;
private void Awake()
{
Init();
}
void Start()
{
ChildrenAction();
}
private void Init()
{
// 자식 오브젝트에 접근해서 컴포넌트 참조
TargetTransform = Target.GetComponent<Transform>();
// Target을 자식으로 지정
TargetTransform.SetParent(transform);
// 이것과 동일한 코드
// TargetTransform.parent = transform;
}
private void ChildrenAction()
{
// 하위 게임 오브젝트들에 포함된 모든 childState 컴포넌트(스클비트)를 불러와 반환
ChildState[] childState = GetComponentsInChildren<ChildState>();
// 자신을 배열들의 부모로 지정하기
for (int i = 0; i < childState.Length; i++)
{
childState[i].Parent = gameObject;
// 자식들의 이름을 설정하고, 부모의 이름을 출력하는 함수 호출
childState[i].SetName($"Child Object - {i}");
childState[i].PrintParentName();
}
}
}
자식 오브젝트를 위한 스크립트 작성 public class ChildState : MonoBehaviour
{
public GameObject Parent;
public void SetName(string name)
{
gameObject.name = name;
}
public void PrintParentName()
{
Debug.Log($"{gameObject.name}의 부모 오브젝트는 {Parent.name}");
}
}
드래그 & 드롭으로 추가한다
부모는 빈 오브젝트다 상속을 받지 않은 Body를 Target으로 등록
자식과 Body는 다음과 같이 스크립트만 추가

접근성이 안좋아짐가독성이 떨어짐(최하위 객체가 최상위 객체로 접근하는 과정)의존성 증가하위 오브젝트의 데이터를 얻기 위해 각 오브젝트들을 탐색하다보니 시간이 길어져서 성능 하락이 발생한다하위 객체는 상위 객체들의 정보도 가지게 된다// 해당 GameObject에 연결된 타입 T의 컴포넌트를 반환
// 컴포넌트가 여러 개 있다면, 첫 번째 발견된 컴포넌트를 반환
// 해당 타입의 컴포넌트가 없으면 null을 반환
Component comp = GameObject.GetComponent<T>();
// 해당 GameObject에 연결된 모든 타입 T의 컴포넌트들을 배열로 반환
// 해당 타입의 컴포넌트가 없으면 빈 배열을 반환
Component[] comps = GameObject.GetComponents<T>();
// 해당 GameObject와 그 자식들을 순회하며 타입 T의 첫 번째 컴포넌트를 반환
// 컴포넌트가 없으면 null을 반환
Component comp = GameObject.GetComponentInChildren<T>();
// 해당 GameObject와 그 자식들을 순회하며 타입 T의 모든 컴포넌트들을 배열로 반환
// 해당 타입의 컴포넌트가 없으면 빈 배열을 반환
Component[] comps = GameObject.GetComponentsInChildren<T>();
// 해당 GameObject와 그 부모들을 순회하며 타입 T의 첫 번째 컴포넌트를 반환
// 만약 그러한 컴포넌트가 없으면 null을 반환
Component comp = GameObject.GetComponentInParent<T>();
// 해당 GameObject와 그 부모들을 순회하며 타입 T의 모든 컴포넌트들을 배열로 반환
// 해당 타입의 컴포넌트가 없으면 빈 배열을 반환
Component[] Comps = GameObject.GetComponentsInParent<T>();
게임 오브젝트, 템플릿, 설계도프리팹으로 게임 오브젝트를 설정, 저장, 생성 가능프로토타입 패턴으로 프리팹을 구현했다
하이라키 창의 게임 오브젝트를 프로젝트 창으로 드래그 & 드롭하여 프리팹 생성
프로젝트 창에서 프리팹 만들기로 가능하다프리팹은 에디터 에서만 만들 수 있다게임 오브젝트게임 오브젝트, 컴포넌트, 스크립트, 변수의 값들이 저장되어 있다컴포넌트, 속성 값, 자식 게임 오브젝트를 가지고 있음씬에 추가할 경우 프리팹 인스턴스로 생성프리팹 에셋의 변경사항은 프리팹 인스턴스에게 자동으로 반영프리팹 인스턴스에 변경사항이 있을 경우, 해당 변경사항은 프리팹 에셋에는 영향을 주지 않음런타임 중 프리팹에셋을 이용하여 프리팹 인스턴스를 생성 가능public GameObject gameObjectPrefab; // 프리팹 참조변수
public Component componentPrefab; // 프리팹의 컴포넌트 참조변수
public void Instantiate()
{
// Instantiate을 통해 프리팹인스턴스 런타임 생성
GameObject instance = Instantiate(gameObjectPrefab, Vector3.zero, Quaternion.identity);
Component component = Instantiate(componentPrefab, Vector3.zero, Quaternion.identity);
}프리팹을 씬 창으로 드래그&드롭만 해도 만들 수 있다
인스펙터 창에서 Overrides를 누르고, Apply All을 누르면 수정 내용이 전부 저장된다Revert All을 누르면 프리팹의 설정을 인스턴스로 가져온다
더블 클릭 하면 프리팹 전용 편집 모드로 들어가게 된다

Open을 누르면 해당 게임 오브젝트만 하이라이트 된다. 수정을 하고 나가면 같은 프리팹에도 모두 수정사항이 적용된다. 프리팹 편집 모드와 동일한 기능
Unpack을 누르면 프리팹을 풀 수 있다