Unity - Prefab


Prefab : 게임 오브젝트를 에셋화하기

유니티에서 게임 오브젝트는 씬에 배치될 수 있는 오브젝트를 의미한다. 오브젝트에 어떤 컴포넌트가 붙는가에 따라서 그 게임 오브젝트의 역할이 결정되는데, 씬에 하나만 배치되는 오브젝트는 컴포넌트를 직접 부착해서 배치할 수는 있지만 똑같은 오브젝트를 많이 배치해야 되는 경우에 매번 배치할 때마다 필요한 컴포넌트를 부착하는 작업은 매우 비효율적이다.

일일이 게임 오브젝트를 생성하고 컴포넌트를 붙이는 비효율적인 작업을 피하기 위해 만든 게임 오브젝트를 복사해서 배치할 수도 있지만 만약 모든 오브젝트들의 크기를 2배로 키워야 한다면 모든 오브젝트들을 또 일일이 스케일 값을 바꿔줘야 한다.

비효율적인 작업들

  1. 새 오브젝트마다 컴포넌트 붙이고 설정하기
  2. 매치된 게임 오브젝트 복제하기 유니티 엔진에서는 복제하고자 하는 게임 오브젝트를 선택하고 우클릭하여 ‘Duplicate’를 누르거나 Ctrl+D 단축키를 눌러서 복제할 수 있다. 근데 이 복사한 애들을 모두 한꺼번에 수정할 작업이 생긴다면 정말 귀찮아질 것이다.
  3. 코드에서 동적으로 생성하기 코드 상으로 오브젝트를 생성하는 코드를 만들어 냈다 하더라도 이 오브젝트를 수정할 때마다 코드를 수정해야 한다.

Prefab을 이용하자

위의 비효율적인 작업들을 피하기 위해 있는 것이 Prefab이다. Prefab은 게임 오브젝트와 거기에 붙여진 컴포넌트와 그 properties들을 에셋의 형태로 저장한다.

Prefab 만들기

9924FC3E5DBAA8B023

하이어라키 뷰에서 프리팹으로 만들고자 하는 게임 오브젝트를 선택해서 프로젝트 뷰로 끌어다 놓기만 하면 된다. 프리팹이 된 게임 오브젝트는 앞의 아이콘이 무채색 육면체에서 파란 육면체로 바뀐다.

배치된 게임 오브젝트 한꺼번에 변경하기

993B0A355DBAA9A115

씬에 배치된 모든 오브젝트의 크기를 변경하고 싶을 수 있다. 프로젝트 뷰에서 원본 프리팹을 선택하고 프리팹의 크기를 변경해주면 씬에 배치된 모든 프리팹 인스턴스의 크기가 함께 변경된다. 아지만 씬에 배치된 각각의 인스턴스 프로퍼티가 수정된 상태에서는 적용되지 않는다.

프리팹 인스턴스에서 편집

994EC13B5DBAAAE806

씬에 배치된 프리팹 인스턴스를 수정하고 이것을 원본 프리팹에 적용할 수도 있다. 씬에 배치된 프리팹 인스턴스 게임 오브젝트를 선택하면 인스펙터 뷰의 게임 오브젝트 이름 아래에 Prefab : Open, Select, Override 버튼이 있다.

Open을 선택하면 선택된 프리팹의 원본만을 수정할 수 있는 씬으로 이동한다. 여기서는 프리팹 원본의 깊은 자식 오브젝트까지 열어서 수정할 수 있다. 수정된 프리팹의 내용은 자동으로 저장되며 하이어라키 뷰의 프리팹 아이콘 옆의 < 버튼을 클릭하면 다시 원래 씬으로 돌아올 수 있다.

Select 버튼을 클릭하면 프로젝트 뷰의 원본 프리팹이 바로 선택된다.

Override 버튼은 프리팹 인스턴스에 원본 인스턴스와 달라진 점이 있다면 그 내용이 나타난다. 여기서 Revert All을 선택하면 프리팹 인스턴스의 변경 사항이 초기화되고 프리팹 원본 값으로 돌아간다. Apply All을 선택하면 프리팹 인스턴스의 수정사항이 반대로 프리팹 원본에 덮어 씌워진다.

프리팹 인스턴스화

프로젝트 뷰에 존재하는 프리팹 원본은 에셋 상태로 이 상태 그대로에서는 게임 씬에서 보거나 사용할 수 없다. 이것을 게임 씬에 배치하고 사용할 수 있게 생성하는 과정을 인스턴스화라고 한다. 프리팹 인스턴스화는 게임 오브젝트의 Instantiate()함수를 이용해서 할 수 있다.

프로젝트 뷰에 있는 게임 게임 오브젝트는 크게 두 가지 방법으로 가져올 수 있다.

Resources 폴더에서 가져오기

첫 번째 방법은 Resources 폴더에서 가져오는 것이다. 이 방법은 어느 경로든 무관하게 가져오고자 하는 프리팹이 프로젝트 뷰에서 Resources 폴더 안에 있기만 하면 된다. 단, Resources 폴더에 있는 파일들을 게임이 실행되면 무조건 메모리에 적재되기 때문에 메모리 이슈를 일으키고 싶지 않다면 필요한 에셋만을 Resources 폴더에 넣어두는 것이 좋다.

public static BlackBox CreateNewBlackBox()
{
    var boxPrefab = Resources.Load<BlackBox>("Elegance Black Box");
    return Instantiate(boxPrefab);
}

씬에 배치된 게임 오브젝트의 컴포넌트의 프로퍼티로 참조하기

public class BoxSpawn : MonoBehaviour
{
    [SerializeField]
    private GameObject boxPrefab;

    private void Start()
    {
        Instantiate(boxPrefab);
    }
}

두 번째 방법은 씬에 배치된 게임 오브젝트에 부착도니 컴포넌트의 프로퍼티로 프리팹 원본을 참조하고 있다가 생성하는 방법이다.

프리팹의 장점

  1. 재사용이 굉장히 편하다
  2. 씬에 흩어져 배치된 프리팹의 인스턴스들을 수정하기 쉽다
  3. 쉽게 게임 요소들을 수정할 수 있다.

출처