I'm FanJae.
[20260526] Unity 정리 ( Prefab ) 본문
1. 정의
- 프리팹(Prefab)이란, 파일 형태로 재사용이 가능한 오브젝트를 말한다.
- 게임 오브젝트의 다음 정보를 하나로 저장해두고 필요할 때 동일한 형태로 생성이 가능하다.
- GameObject 구조
- Component 구성
- Component 설정 값
- 자식 오브젝트 구조
- Transform 기본 상태
- 연결된 리소스(Material, Sprite 등)
2. 필요한 이유
- 게임 개발에서는 같은 오브젝트를 여러 번 생성해야 하는 상황이 많이 발생한다.
Ex) 적 캐릭터, 총알, UI 버튼, 이펙트, 아이템 등등..
3. 적용하지 않는 경우 발생하는 문제
① 중복 작업 증가
- 같은 오브젝트를 여러 번 수동 생성해야 하는 문제가 발생한다.
② 유지 보수 어려움
- 특정 오브젝트를 수정해야 한다고 할 때를 생각 해보자.
- 만약 모두 별도의 Object라면, 하나씩 수정해야 한다.

※ 이렇게 많은 Object를 각각 수정한다고 하면 매우 번거롭다.
- Prefab의 정보를 수정하면 Hierarchy 창에 배치되어 있는 모든 오브젝트가 수정된다.

- Laser Prefab이다. 이를 수정하면, Prefab에 있는 모든 오브젝트가 수정되는 것이다.
4. 생성 및 사용 방법
① 중복 작업 증가
- Hierarchy 창의 GameObject를 Project 창으로 Drag & Drop을 하면 오브젝트가 파란색 아이콘 형태로 표시된다. 이를 진행하면, 프리팹 화가 진행된 것이다.


- 이제 PrefabTarget이라는 GameObject는 프리팹으로 복제되어, 필요할 때 마다 꺼내서 쓸 수 있다. 따라서 프리팹(Prefab)은 일종의 템플릿과 같다고 할 수 있다.
5. Inspector에서 Prefab 참조 연결 (SerializeField)
- 일반적으로 Prefab을 코드에서 생성하려면 어떤 Prefab을 생성할 것인지를 스크립트가 알고 있어야 한다.
- 보통 Inspector에서 Prefab Asset을 직접 연결한다.
[SerializeField] private GameObject coinPrefab;
- 이렇게 작성하면 변수는 private 상태를 유지하면서도 Unity Insepector에서 값을 할당하여 사용할 수 있다.
6. Instantiate로 Prefab 생성
- Inspector에서 Prefab 참조를 연결했다면, 코드에서는 Instantiate()를 사용해서 오브젝트를 생성할 수 있다.
Instantiate(coinPrefab, spawnPosition, Quaternion.identity);
- 이때 각 인자의 의미는 다음과 같다.
coinPrefab → 생성할 Prefab
spawnPosition → 생성 위치
Quaternion.identity → 기본 회전값
- 예를 들어, 코인을 랜덤 위치에 생성한다면 이와 같은 형태로 작성이 가능하다.
[SerializeField] private GameObject coinPrefab;
private void SpawnCoin()
{
Vector3 spawnPosition = new Vector3(Random.Range(-5f, 5f),1f, Random.Range(-5f, 5f));
Instantiate(coinPrefab, spawnPosition, Quaternion.identity);
}
- 이처럼 Instantiate()를 이용하면, 필요할 때 마다 Prefab을 생성하여 사용할 수 있다.
7. 생성된 Prefab 인스턴스 관리
- Instantiate()로 생성된 오브젝트는 씬에 실제로 존재하는 GameObject가 된다. 따라서 별도로 제거하지 않으면 계속 씬에 남아 있게 된다.
- 이때, 일정 시간이 지나면 사라져야 하는 오브젝트는 Destroy()를 사용해 제거할 수 있다.
[SerializeField] private float lifeTime = 5f;
private void Start()
{
Destroy(gameObject, lifeTime);
}
- 오브젝트가 생성된 후 lifeTime(5초) 뒤에 자기 자신을 제거한다. 총알 Prefab에 붙이는 방식으로 응용하여 사용할 수 있다.
public class Bullet : MonoBehaviour
{
[SerializeField] private float lifeTime = 2f;
private void Start()
{
Destroy(gameObject, lifeTime);
}
}
- 이렇게 하면 총알이 발사된 뒤 일정 시간이 지나면 자동으로 제거되게 만들 수 있다. 다만, Instaniate()와 Destroy()가 매우 자주 반복되는 경우 성능 문제가 생길 수 있다.
- 이런 경우에는 Destroy() 대신, 오브젝트 풀링과 같은 기법을 사용하는 것이 좋은데, 오브젝트 풀링과 같은 기법은 추후에 다룬다.
8. Prefab Override
- Prefab을 씬에 배치하면 그것은 원본 Prefab의 복사본이다.
- 즉, Prefab의 Instance이다. 이 인스턴스의 값을 수정하면 원본과 다른 상태가 되는데 이를 Prefab Override라고 한다. 원본 Prefab이 다음과 같다고 가정한다.
Enemy Prefab
HP = 100
Speed = 3
- 씬에 있는 특정 Enemy 인스턴스 하나만 값을 바꾸는 것도 가능하다.
Enemy Instance
HP = 200
Speed = 3
- 이 경우, Override 상태가 되는데, Inspector의 Overrides 메뉴에서 다음 작업을 하는 것이 가능하다.
Apply → 변경사항을 원본 Prefab에 반영
Revert → 변경사항을 취소하고 원본 값으로 복구

'Unity > Unity 초격차캠프' 카테고리의 다른 글
| [20260527] Unity 정리 ( Unity Raycast 응용 : LayerMask, Tag, Raycast를 이용한 상호작용 ) (0) | 2026.05.27 |
|---|---|
| [20260526] Unity 정리 ( Raycast I ) (0) | 2026.05.26 |
| [20260522] Unity 정리 ( Collider 충돌 처리 기초 - Collision, Trigger ) (0) | 2026.05.22 |
| [20260522] Unity 정리 ( Unity 물리 엔진 기초 - Rigidbody ) (0) | 2026.05.22 |
| [20260521] Unity 정리 ( Unity 회전 처리 기초 - Euler, Quaternion, LookAt, RotateAround ) (0) | 2026.05.22 |