빠른 흐름
Prefab asset
-> Scene instance
-> 필요하면 instance override
-> 다른 공통 설정이 필요하면 Prefab Variant기본 흐름
asset, instance, override의 구분
Prefab을 이해할 때 가장 중요한 구분은 "프로젝트 창의 asset"과 "씬 안의 instance"입니다. asset은 원본 템플릿이고, instance는 그 템플릿을 장면 안에 배치한 실제 오브젝트입니다. scene instance에서 값을 바꾸면 그것은 원칙적으로 override입니다. 즉, 원본 Prefab과 다르게 이 장면에서만 덮어쓴 값이라는 뜻입니다. 이런 감각이 없으면 "왜 다른 씬에는 값이 안 바뀌지?" 같은 혼란이 자주 생깁니다. [SerializeField] private GameObject enemyPrefab;처럼 참조를 받아 런타임에 Instantiate하는 패턴은 여전히 기본이지만, 이 코드는 "생성 방법"일 뿐이고 실제 유지보수성은 Prefab asset 설계에서 결정됩니다.
Prefab Variant를 쓰는 경우
여러 Prefab이 공통 구조는 유지하되 일부 기본값만 다르게 가져야 하면 Prefab Variant가 잘 맞습니다. 예를 들어 EnemyBase에서 MeleeEnemy, RangedEnemy, BossEnemy를 variant로 뻗으면 구조는 공유하고 값은 분화할 수 있습니다. 반대로 구조 자체가 크게 달라졌다면 Variant보다는 새 Prefab이 더 낫습니다. 억지로 같은 계보에 묶어 두면 상속 관계처럼 보이지만 실제로는 관리만 복잡해질 수 있습니다. 따라서 Prefab 워크플로우는 Instantiate만 아는 것으로 끝나지 않고, asset/instance/override/variant를 구분하는 mental model이 핵심입니다.
어떤 선택이 잘 맞는가
같은 구조를 여러 씬에서 그대로 재사용하고 싶다면 일반 Prefab이 기본 선택입니다. 버튼, 적, 총알, 상호작용 오브젝트 대부분은 여기서 시작합니다. 특정 씬에서만 약간 다른 값이 필요하다면 scene instance override가 더 단순하지만, override가 많아질수록 추적이 어려워집니다. 공통 구조를 유지한 채 여러 기본형을 만들어야 한다면 Variant가 더 낫습니다. 실무에서는 "장면별 override", "Variant", "런타임 instantiate"를 경쟁 관계가 아니라 서로 다른 층으로 보는 편이 좋습니다.
| 상황 | 보통 더 잘 맞는 선택 |
|---|---|
| 여러 씬에서 같은 구조 재사용 | Prefab asset |
| 한 씬에서만 값이 조금 다름 | scene instance override |
| 공통 구조를 가진 파생형 여러 개 | Prefab Variant |
| 플레이 중 반복 생성 | Instantiate + 필요하면 pooling |
| 구조가 완전히 달라짐 | 새 Prefab 분리 |
체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 여러 씬에서 같은 구조 재사용 | Prefab asset |
| 한 씬에서만 값이 조금 다름 | scene instance override |
| 공통 구조를 가진 파생형 여러 개 | Prefab Variant |
| 플레이 중 반복 생성 | Instantiate + 필요하면 pooling |
| 구조가 완전히 달라짐 | 새 Prefab 분리 |
| 비교 | 더 잘 맞는 쪽 | 이유 |
|---|---|---|
| 장면별 작은 차이 vs 공통 파생형 | scene override / Variant | override는 국소 수정, Variant는 재사용 가능한 기본형 |
| 런타임 생성 vs 장면 배치 | Instantiate / scene instance | 수명주기와 소유권이 다름 |
| 값만 다름 vs 구조도 다름 | Variant / 새 Prefab | 상속처럼 억지로 묶으면 관리가 더 어려워짐 |
주의할 점
씬 인스턴스에서 수정한 값은 원본 Prefab asset에 반영되지 않습니다. "Apply to Prefab"을 하지 않으면 다른 씬에는 적용되지 않습니다.
// ❌ 씬 인스턴스의 Inspector 값을 변경하고 "원본이 바뀐 줄" 알고 있는 경우
// → 다른 씬에서는 old 값이 여전히 쓰임
// ✅ 원본을 바꾸려면: Hierarchy에서 Prefab 선택 → "Open Prefab" 또는
// Inspector 상단 "Overrides → Apply All"로 원본에 반영
// ✅ 인스턴스 override 확인: Inspector에서 굵게 표시된 값 = override된 값
// bold 표시 없음 = Prefab 원본과 동일한 값
// ❌ 씬마다 override가 너무 많아 원본 의미가 사라짐
EnemyBase.prefab
- Scene A: speed, hp, weapon, VFX 전부 override
- Scene B: 또 다른 값 전부 override
// → 실제로는 Variant나 새 Prefab이 더 맞는 구조참고 링크
3 sources