프리팹 ( Prefab )
장난감 공장에서 장난감 로봇을 생산한다고 가정한다.
로봇이라는 큰 단위로 묶여있지만 , 이 로봇이 움직이기 위해서는 머리 , 몸통 , 팔 , 다리 등으로 세분화된 요소로 나눠야한다.
또한 설계도가 존재하며 이는 대량 생산을 위한 하나의 데이터가 된다.
정성스럽게 만든 오브젝트를 동일하게 여러개 배치해야 할 경우
이 설계도를 미리 작성해 놓고 필요할 때마다 유니티에게 대량 생산하게 만들어야 한다.
프리팹과 인스턴스의 차이는 붕어빵틀과 붕어빵으로 비유할 수 있다.
붕어빵은 붕어빵틀에 각인된 형태대로 구워진다. 지느러미가 하나 더 생기거나 , 꼬리가 두 개가 되는 경우는 없다.
프리팹은 붕어빵틀과 같다. 때문에 프리팹을 만들 때에는 인스턴스가 어떤 형태를 갖게 될지 생각하며 만들어야 한다.
프리팹 ( Prefab ) 은 게임 오브젝트 ( GameObject ) 의 설계도 ( 템플릿 ) 이다.
재사용 가능한 오브젝트 저장 단위를 말한다.
씬 ( Scene ) 안에 있는 오브젝트를 파일 형태로 저장해두고, 필요할 때 여러 번 복제해서 쓸 수 있게 해주는 시스템이다.
프리팹 ( Prefab ) : 오브젝트 복제와 관리의 자동화 도구
예시 :
- 적 캐릭터 50 마리
- 총알 수백 발
- 아이템 , 버튼 UI 등
이런 오브젝트를 일일이 새로 만들지 않고
프리팹으로 한 번 만들어두면 언제든 Instantiate( ) 로 간단히 복제할 수 있다.
작동 원리
- 씬 ( Scene ) 안에서 오브젝트를 만든다.
└ Cube , Capsule , Player 등 - Hierarchy 창 → Project 창으로 드래그해서 프리팹으로 저장한다.
└ 이때 Project 창에 .prefab 파일이 생성된다. - 씬에서 프리팹을 복제하거나 , Instantiate( ) 로 동적으로 생성 가능하다
- 프리팹 원본을 수정하면 , 연결된 모든 인스턴스가 자동으로 업데이트된다.
└ ( 단, Override 설정이 되어 있으면 예외 )
이 시스템 덕분에 대규모 프로젝트에서 수십 ~ 수백 개의 오브젝트를 일관성 있게 유지한다.
| 용어 | 설명 |
| Prefab Asset | Project 뷰에 저장된 프리팹 파일 ( 원본 설계도 ) |
| Prefab Instance | 씬에 배치된 프리팹의 복제본 |
| Override | 인스턴스에서만 변경된 값 ( 원본과 다르다 ) |
| Apply | 인스턴스의 변경 내용을 원본 Prefab 에 반영 |
| Revert | 인스턴스를 다시 원본 상태로 되돌린다 |
▼예시 코드
public class EnemySpawner : MonoBehaviour
{
public GameObject enemyPrefab; // 프리팹 연결 (Inspector에서 drag & drop)
void Start()
{
for (int i = 0; i < 5; i++)
{
Instantiate(enemyPrefab, new Vector3(i * 2, 0, 0), Quaternion.identity);
}
}
}
- Instantiate( ) 함수는 프리팹을 씬에 복제할 때 사용하는 함수이다.
- 이렇게 하면 적이 자동으로 5마리 생성된다.
주의 사항
- 프리팹은 씬 안에 있는 오브젝트와 다르게 프로젝트 에셋으로 관리된다.
└ 즉, 씬이 달라도 동일한 프리팹을 공유 가능하다. - 인스턴스에서 수정한 값은 Apply 하지 않으면 원본에 반영되지 않는다.
- Instantiate( ) 는 실행 중 메모리를 새로 할당하기 때문에
└ 오브젝트 풀링 ( Object Pooling ) 과 함께 쓰면 성능 관리에 좋다. - 프리팹 안에도 다른 프리팹을 넣을 수 있는데 , 이런 구조를 Nested Prefab 이라 한다.
정리
프리팹은 오브젝트의 설계도를 저장하고 , 재사용과 일관된 관리가 가능하게 해주는 시스템이다.
참고 자료
https://docs.unity3d.com/kr/2021.3/Manual/Prefabs.html