I'm FanJae.

[20260526] Unity 정리 ( Prefab ) 본문

Unity/Unity 초격차캠프

[20260526] Unity 정리 ( Prefab )

FanJae 2026. 5. 26. 21:42

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 → 변경사항을 취소하고 원본 값으로 복구

Comments