[Unity] 프리팹(Prefab) 정리

Lumos Velog·2025년 7월 8일
0

프리팹(Prefab)

유니티에서 하나의 오브젝트 또는 오브젝트 집합(자식 오브젝트까지 포함)을 에셋 형태로 저장한 템플릿이다.
프리팹은 단순 복사본이 아니라, ‘원본-복제본’ 관계로서
원본 프리팹의 구조와 속성, 컴포넌트 설정이 모든 인스턴스에 공유된다.
그렇게 함으로써 복잡한 구조(부모-자식 오브젝트, 여러 컴포넌트, 각종 값 설정 등)를 한 번만 만들어두고 다양한 위치, 다양한 상황에서 재사용하거나 동적으로 생성할 수 있게 하는 시스템이다.




동작 원리

  • 인스턴스화와 원본 유지
    프리팹은 프로젝트 뷰(Assets 폴더)에 프리팹 에셋 파일(.prefab)로 존재한다.
    씬에 드래그해서 올리거나 코드로 Instantiate하면,
    프리팹 에셋을 바탕으로 새로운 오브젝트 인스턴스가 생성된다.
    이때, 씬에 생성된 오브젝트는 ‘프리팹 인스턴스’이며 프리팹 원본과 연결이 계속 유지된다. 즉, 프리팹 원본을 수정하면, 그 영향을 원본과 연결된 모든 인스턴스가 받는다.
    (단, 인스턴스에서 오버라이드한 속성은 유지된다.)

  • 오버라이드와 적용(Apply/Revert)
    프리팹 인스턴스의 속성을 바꾸면 해당 변경점은 에디터에서 노란색 ‘오버라이드’ 표시로 나타난다.
    이 상태에서 ‘Apply’를 누르면 원본 프리팹에도 적용된다.
    Revert’를 누르면 변경점을 취소하고, 원본 프리팹과 동일하게 되돌린다. 실제로 사용할때는 인스턴스에만 적용할 내용(일회성 효과 등)은 오버라이드로 남긴다. 모든 인스턴스에 적용할 내용(구조, 초기값 등)은 반드시 원본에 반영해야 불필요한 일을 줄일 수 있다.

  • 프리팹 내부 구조
    프리팹은 단일 오브젝트뿐 아니라 여러 자식 오브젝트와 컴포넌트, 컴포넌트 안의 서브 필드까지 모두 저장한다.
    계층 구조(Transform 계층) 전체가 저장되므로 복잡한 캐릭터, UI 패널, 환경 오브젝트, 몬스터 등 모든 것에 사용 가능하다.



프리팹 활용 예시

에디터에서 프리팹 만들기
씬에 원하는 오브젝트 만들기 (예: Bullet, Enemy, Item 등) > 프로젝트 창(Assets)으로 드래그하여 .prefab 파일로 만들기


인스턴스화
보통 Instantiate로 동적으로 오브젝트를 만든다. 스크립트로 생성된 오브젝트도 프리팹 원본의 구조와 값을 그대로 가진다.

[SerializeField] GameObject enemyPrefab;
void SpawnEnemy(Vector3 pos)
{
    GameObject newEnemy = Instantiate(enemyPrefab, pos, Quaternion.identity);
}

프리팹 Variant
Variant를 사용하면 원본 프리팹의 구조와 속성을 대부분 물려받으면서,
일부만 다르게 커스터마이징할 수 있다. 잘 사용하면 불필요한 작업을 많이 줄일 수있지만 반대로 실수를 하게 될 일도 많아진다. 클래스의 상속관계를 생각하면서 작업하면 이해하기 쉽다.

예시: Monster_A(기본 몬스터 프리팹) → Monster_B(Variant)에서 체력, 색상만 다르게




주의사항

  • 프리팹 내에서 씬 오브젝트 직접 참조 금지
    프리팹 내부에 있는 컴포넌트 필드에 씬 안의 오브젝트를 직접 할당하지 말 것. 프리팹은 에셋이므로, 씬의 오브젝트가 인스턴스화 시점에 존재하지 않을 수 있기 때문에 참조가 깨지게 된다.
    씬 오브젝트 참조가 필요하다면 Awake/Start/LateStart 등에서 Find, Tag, Manager 통해 런타임에 할당하도록 구성할 것.

  • 프리팹 끼리의 참조
    프리팹 내부에서 다른 프리팹(에셋)을 SerializeField로 참조하는 건 문제는 없다. 그렇지만 상호 참조를 하는 구조는 예기치 않은 동작을 일으킬 수 있기 때문에 주의가 필요하다.

  • 프리팹을 참조
    Instantiate 후 간혹 새로 인스턴스화 한 객체가 아닌 원본 프리팹을 참조하여 변경하는 실수를 하게 될 때가 있어 주의가 필요하다.

  • 오브젝트 풀링
    Instantiate/Destroy를 반복하면 퍼포먼스 저하가 있기 때문에 자주 생성 파괴를 하는 프리팹이라면 오브젝트 풀링을 통해 생성하는게 좋다.

  • 버전 관리 및 충돌
    프리팹 파일은 텍스트 형태지만 구조가 복잡해 깃 충돌 발생 시 수동으로 머지(merge)하는 것이 매우 어렵다. 여러 명이 동시에 프리팹을 수정하지 않도록 브랜치, 락, 담당자 지정 등 정책을 세워야 한다.

  • Apply/Revert 실수
    Apply 버튼을 잘못 눌러 의도하지 않은 변경점이 전체 프리팹에 적용될 수 있다. 반드시 적용 전에는 변경점(Inspector에서 노란색/파란색 표시)을 꼼꼼히 확인할 것.

  • 프리팹 인스턴스 이름 관리
    Instantiate 시 기본 이름은 "프리팹 이름(Clone)"이다. 이름을 직접 바꿔주는 습관을 들여야
    디버깅이나 관리가 편하다.


0개의 댓글