유니티 프리팹 수정 - yuniti peulipaeb sujeong

동일한 오브젝트를 똑같이 만들어주어야 할 때, 이를 단순히 복사하면 된다. 그런데, 이 오브젝트에 수정이 가해지면 각각의 오브젝트 모두에 수정을 가해주어야 하는데, 이러기엔 너무 번거롭다. 하여, 동일한 오브젝트의 원본을 두고 이를 가져다 쓰는 방식을 사용하는데, 이 원본을 프리팹이라 한다.

하나의 프리팹을 통해 여러 오브젝트를 만든다.

  • 복사본을 수정해도 원본엔 영향이 없다.(복사본 수정 후 인스펙터 창의 프리팹에서 Apply를 누르면 변경사항이 프리펩에 적용된다.)
  • 원본에 가해진 수정은 복사본에 적용된다.
  • 하드디스크에 저장된다.
  • 프리펩을 저장하고 싶은 디렉터리에 드래그&드롭으로 끌어다 둔다.
  • 기존 오브젝트를 삭제하고 프리펩을 끌어다 사용하면 된다.

Unity 2020.1에서는 씬의 컨텍스트를 닫을 필요 없이 프리팹 모드를 시작할 수 있습니다. 즉, 씬에서 인스턴스를 통해 프리팹 에셋을 열면 배경이 흑백 처리된 상태에서 편집할 수 있습니다.

Unity 2018.3에 프리팹 모드가 도입되었을 때 프리팹 에셋을 단독으로 편집하기가 용이해졌습니다. 하지만 프리팹 모드는 인스턴스가 있는 컨텍스트를 고려하여 프리팹 에셋을 편집하는 데는 적합하지 않았습니다.

Unity 2020.1에는 컨텍스트 내 프리팹 모드라는 개선된 프리팹 워크플로가 도입되었습니다. 기존과 마찬가지로, 프리팹 모드에서 인스턴스가 아닌 프리팹 에셋 자체를 편집할 수 있지만, 이번에는 컨텍스트까지 동시에 볼 수 있습니다.

RPG게임을 제작하고 있다고 가정해 봅시다. 월드에는 수많은 종류의 몬스터들이 존재할 것입니다. 만약 프리팹 기능을 사용하지 않고, 몬스터들을 Scene에 배치한다고 생각해 보면 몬스터의 수 만큼 오브젝트를 생성하고 컴퍼넌트를 부착해 주어야 할 것입니다.

이는 매우 비효율적인 과정이며, 심지어 몬스터의 체력을 수정해야 하는 의뢰가 들어온다면 필드의 모든 해당하는 몬스터를 찾아서 하나씩 HP를 변경해 주어야 합니다. 하지만, 프리팹(Prefabs)을 사용하면 손쉽게 변경이 가능합니다.


#2 프리팹 생성방법

프리팹 생성 방법은 간단합니다. Hierarchy 창에서 프리팹으로 만들기를 원하는 오브젝트를 선택한 후, Assets 창으로 드래그 앤 드랍(Drag and Drop) 합니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

그러면, 다음과 같이 일반 에셋들과 구분되는, 파란색 정육면체가 생성됩니다. 이는 프리팹(Prefabs) 이라는 표시입니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

생성한 프리팹을 Scene으로 드래그 앤 드랍하면, 동일한 컴퍼넌트와 속성을 지닌 오브젝트가 여러개 생성됩니다. 이렇게 프리팹을 Scene에 배치하는 일련의 과정을 "프리팹의 인스턴스화" 라고 부릅니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

#3 프리팹 오버라이딩 (Prefabs Overriding)

Scene에 배치한 프리팹을 오버라이딩 하는 것 도 가능합니다. 단순히 컴퍼넌트의 값을 바꿔주면 되는데, 오버라이딩을 수행한 프리팹은 다음과 같이 굵은 글자로 표시됩니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

오버라이딩이 된 프리팹은, 부모 프리팹에서 값을 변경해도 오버라이딩한 값이 그대로 유지됩니다.


#4 프리팹 수정

프리팹을 더블 클릭하면, 프리팹을 수정할 수 있는 가상의 파란색 창이 열립니다. 이 곳에서 , 프리팹의 다양한 속성들을 수정할 수 있습니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

좌측 상단의 < 화살표를 누르면, 원 상태로 돌아갑니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

#5 스크립트를 이용한 프리팹 인스턴스화

마지막으로, C# 스크립트 파일을 이용해 프리팹을 인스턴스화 하는 방법에 대해 정리 하도록 하겠습니다.

 

[1] Scene 에 배치된 오브젝트를 이용하는 방법

첫 번째 방법은 Scene 에 빈 오브젝트를 배치한 뒤, 스크립트 파일을 연결하여 프리팹을 생성하는 것 입니다.우선 아래와 같이 CubeSpawner 빈 오브젝트를 생성하고, CubeSpawner에 부착할 CubeSpawner.cs 스크립트 파일을 생성합니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

CubeSpawner.cs 파일에 다음과 같이 코드를 작성합니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeSpawner : MonoBehaviour
{
    public GameObject prefabs;
    GameObject cube;

    void Start()
    {
        cube = Instantiate(prefabs);
    }

}

* Instantiate() 함수는 프리팹을 인스턴스화 하여 Scene에 배치해 주는 함수 입니다.

소스코드를 저장하고, CubeSpawner 빈 오브젝트에 스크립트 파일을 부착해 줍니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

마지막으로, CubeSpawner 빈 오브젝트를 클릭한 뒤, 인스펙터 창의 Prefabs 항목에 생성하고자 하는 프리팹을 부착해 줍니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

실행해 보면 CubeSpawner에 의해서 Cube 프리팹 하나가 자동으로 생성됩니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

 

[2] Resources 폴더를 이용하는 방법

두 번째 방법은 Resources 폴더를 이용하는 방법입니다. Resources 폴더란, 스크립트 파일 외의 것들을 저장하는 폴더인데 Resources 폴더를 생성해 주신 뒤 그 안에 Prefabs 폴더를 생성하고 , 프리팹 파일을 Prefabs 폴더 안에 넣습니다.

AnyPortrait > 메뉴얼 > 프리팹 편집하기


1.2.5

유니티로 게임을 만드는 과정에서 프리팹(Prefab)은 중요한 역할을 합니다.
게임 오브젝트를 리소스로 만들 수 있기 때문에 필수적으로 사용되는 기능입니다.
이전버전까지의 AnyPortrait로 만든 캐릭터를 프리팹으로 저장할 때 몇가지 문제점이 있었습니다.
그래서 v1.0.3 부터 프리팹에 대한 처리 방식이 변경되어 이 페이지에서 안내를 드립니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

AnyPortrait로 만든 캐릭터를 프리팹으로 저장한 화면입니다.
Hierarchy에서 푸른색 글씨로 변한 것을 볼 수 있습니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

프리팹으로 저장된 캐릭터를 편집하려고 하면 안내 메시지가 나타납니다.
AnyPortrait는 기본적으로 씬에 위치한 GameObject를 편집하는 방식으로 개발되어, 프리팹 상태일 경우 문제가 발생할 수 있기 때문입니다.
확인 버튼을 누르면 프리팹과 연결이 끊기며, 일반적인 GameObject로 변환됩니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

다시 Hierarchy를 확인하면 푸른색이 아닌 기본색으로 바뀌어 있음을 확인할 수 있습니다.
이 상태는 프리팹과 "연결이 끊긴" 상태이며, 완전히 프리팹 정보가 사라진 것은 아닙니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

모든 편집이 끝나면 Apply 버튼을 눌러서 프리팹으로 다시 저장하면 됩니다.

주의
AnyPortrait로 편집하는 도중에 프리팹으로 강제로 변환하는 경우, 에디터에서 제대로 데이터를 저장하지 못할 수 있습니다.
위에서 안내한 것과 같이, 편집 도중에는 프리팹 상태가 아니어야 합니다.
그리고, 프리팹으로 다시 변환한 이후에 꼭 저장을 하셔야 합니다.

프리팹 상태 UI (v1.2.5)

저희 팀은 여러 사용자로부터 유니티 에디터상에서 프리팹을 다루는 것에 대해서 많은 피드백을 받았습니다.
또한 Unity 2018.3에 추가된 새로운 방식의 프리팹 시스템이 AnyPortrait의 프리팹 관리 방식과 정상적으로 호환되지 않는 문제가 있었습니다.
이러한 이유로, 프리팹을 AnyPortrait의 UI에서 직접 제어하여 Apply 또는 Disconnect를 할 수 있는 기능이 v1.2.5에 추가되었습니다.
(기본적인 프리팹 관리 방식은 위의 설명과 같습니다.)

유니티 프리팹 수정 - yuniti peulipaeb sujeong

(1) 캐릭터가 프리팹 에셋(Prefab Asset)의 형태로 저장된 상태입니다.
(2) 프리팹 에셋을 프리팹 인스턴스(Prefab Instance)로서 씬에 배치합니다.
(프리팹 에셋 상태에서 편집할 수 없으므로, 항상 씬에 배치한 후 편집해주세요.)

유니티 프리팹 수정 - yuniti peulipaeb sujeong

기존과 마찬가지로 프리팹 인스턴스 상태에서 AnyPortrait 에디터를 열어서 편집을 해봅시다.
(1) 프리팹 인스턴스 상태의 캐릭터를 선택하면,
(2) 프리팹 상태에서는 편집이 될 수 없어서 자동으로 Disconnect 된다는 메시지가 나타납니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

캐릭터를 편집하고 Bake를 한 후, 다시 유니티 씬으로 돌아옵니다.
(1) 프리팹 인스턴스였던 캐릭터를 선택합니다. Hierarchy에서 해당 캐릭터 GameObject의 이름이 푸른색이 아닌 검은색으로 바뀐 것을 볼 수 있습니다. 이것은 현재 프리팹 인스턴스가 아니거나 Disconnected 상태가 되었기 때문입니다.
(2) v1.2.5에서 추가된 프리팹 상태 UI를 Inspector에서 볼 수 있습니다.
(3) 프리팹 상태 UI에 있는 Apply 버튼을 눌러서 다시 프리팹 원본과 연결된 상태로 만들어봅시다.
(Unity 2018.3보다 이전 버전이라면 (4)와 같이 Inspector 상단의 Apply 버튼을 눌러도 됩니다.)

유니티 프리팹 수정 - yuniti peulipaeb sujeong

(1) Hierarchy에서의 GameObject들의 이름이 다시 푸른색으로 바뀌었습니다. 이제 "연결된 프리팹 인스턴스 상태"로 바뀐 것입니다.
(2) 이것은 AnyPortrait의 프리팹 상태 UI에서도 확인할 수 있습니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

v1.2.5에 추가된 프리팹 상태 UI입니다.
프리팹 인스턴스인 경우에만 이 UI가 Inspector에 나타납니다.
원본인 프리팹 에셋과 동기화가 된 경우(Connected)에서는 위 이미지와 같이 푸른색으로 UI가 나타납니다.
반대로, 프리팹 에셋과 동기화가 되지 않은 경우(Disconnected 또는 Missing)에서는 아래의 이미지와 같이 붉은색의 UI가 나타납니다.

1. Source Prefab : 원본이 되는 프리팹 에셋입니다. 동기화가 되지 않았다면 어떤 상태인지 나타납니다.
2. Root GameObject : 이 프리팹 인스턴스의 루트입니다. AnyPortrait로 제작된 GameObject 뿐만 아니라, 루트 GameObject를 기준으로 동기화를 할 수 있습니다.
3. Apply : 프리팹 인스턴스의 변경 내역을 프리팹 에셋에 적용하여 동기화를 합니다. Revert를 하고자 하는 경우엔 유니티의 UI를 활용하거나 인스턴스를 삭제해주세요.
4. Refresh : 프리팹 에셋과의 동기화 상태를 다시 갱신합니다.
5. Disconnect : 프리팹 에셋과의 동기화를 해제합니다.

Unity 2018.3에 도입된 새로운 프리팹 시스템

Unity 2018.3에서는 새로운 프리팹 시스템이 도입되었습니다.
이 버전부터는 기존과 다르게 프리팹을 더 다양한 방식으로 관리하고 편집할 수 있습니다.
- 프리팹 메뉴얼 (유니티 공식 메뉴얼)

안타깝게도, 새로운 프리팹 시스템은 기존의 프리팹 시스템과 내부적으로 너무 큰 차이를 가지고 있어서,
AnyPortrait의 기존의 방식은 새로운 프리팹 시스템에 대해 호환성을 가질 수 없었습니다.
프리팹 인스턴스 상태를 유지하면서 AnyPortrait 에디터로 편집하는 것은 불가능했으며, 오직 편집된 캐릭터를 프리팹 에셋으로 덮어쓰는 방법만 유효했습니다.

하지만 위에서 소개된 프리팹 상태 UI를 이용하여 프리팹 에셋과의 연결 정보를 가능한 유지한 상태에서 동기화를 하는 것이 가능해졌습니다.
v1.2.5에서 기존의 방식과 다르게 어떻게 개선되었는지 아래의 설명을 확인해보세요.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

새로운 프리팹 시스템에서의 화면입니다.
(1) 원본이 되는 프리팹 에셋입니다.
(2) 프리팹 에셋을 씬에 배치한 프리팹 인스턴스입니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

프리팹 인스턴스를 선택하고 AnyPortrait 에디터로 편집하려고 하면, 기존과 마찬가지로 프리팹 에셋과의 연결이 해제된다는 메시지가 나타납니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

Bake를 실행하고 유니티 씬으로 돌아오면 프리팹 에셋과의 연결이 해제되었으며, 프리팹 인스턴스 상태가 아닌 것을 볼 수 있습니다.
이 상태는 프리팹 원본과의 연결 정보가 없는 상태이기 때문에, 기존의 방식에서는 다시 프리팹 에셋을 만들거나 덮어씌워야 했습니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

하지만 AnyPortrait 캐릭터를 선택하고 Inspector를 확인해보면 "프리팹 상태 UI"가 나타난 것을 볼 수 있습니다.
AnyPortrait에서는 "마지막 프리팹 연결 정보"가 기록되어, 사용자들에게 프리팹 동기화 기능들을 제공합니다.
(실제로는 유니티에서는 프리팹 연결 정보가 모두 없어져서 일반적인 GameObject로 돌아간 상태입니다.)

(1) 프리팹 상태 UI에서 (2) Apply 버튼을 눌러봅시다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

(3) GameObject들이 다시 프리팹 인스턴스로 복구되었으며, 편집된 캐릭터가 프리팹 에셋으로 적용되어 동기화가 완료된 것을 볼 수 있습니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

Unity 2018.3 및 이후 버전에서는 AnyPortrait로 편집된 캐릭터에 대해서 프리팹 연결 정보가 내부적으로 유지 되지 않지만,
AnyPortrait 자체에서 프리팹 연결 정보를 별도로 기록하여 동기화를 할 수 있습니다.
반대로, 프리팹 연결 정보를 해제할 수도 있는데, 다음의 두가지 방식이 있습니다.

(1) Disconnect 버튼을 누르면 프리팹 에셋과의 동기화를 해제합니다. 하지만 연결 정보는 삭제하지 않으므로 다시 Apply를 눌러서 동기화를 수행할 수 있습니다.
(2) Clear 버튼을 누르면 프리팹 에셋과의 동기화를 해제하면서 연결 정보를 완전히 삭제합니다. 이제 이 GameObject는 프리팹 인스턴스로서의 역할을 완전히 상실합니다.

주의 사항
1. 이 방식은 유니티에서 제공하는 기능이 아닌 AnyPortrait 자체의 기능이므로, 프리팹 원본의 변경사항이 있을 경우 올바르게 동작하지 않을 수 있습니다.
2. 별도의 방식으로 연결 정보를 기록하는 만큼, AnyPortrait v1.2.5로 업데이트 한 직후에는 프리팹 인스턴스로 복구할 수 없을 수 있습니다. 이 경우엔 프리팹 에셋을 다시 만들거나 덮어 씌워서 동기화를 한 이후에 프리팹 인스턴스를 만들어주세요.

새로운 프리팹 시스템의 가장 큰 특징 중 하나는 "프리팹 원본을 직접 편집"할 수 있다는 것입니다.
하지만, 이 시스템의 일부 기능들은 안정화되지 못한 부분이 있어서, 저희 팀이 완벽히 대응할 수 없었습니다.
따라서 현재로는 프리팹 원본을 대상으로 AnyPortrait 에디터에서 편집하는 것은 제한됩니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

(1) 프리팹 에셋 원본을 선택하고, 프리팹 원본을 편집할 수 있는 상태로 전환합니다.
(2) 프리팹 내부의 AnyPortrait 캐릭터를 선택합니다.
(3) 프리팹 에셋 원본이므로 에디터를 열 수 없다는 메시지가 나타납니다.

위와 같은 메시지는 Unity 2020.1 부터 나타나며, Unity 2018.3부터 Unity 2020.1 사이의 버전에서는 해당 메시지가 나타나지 않습니다.

하지만 이것은 해당 버전에서 "프리팹 에셋인지 프리팹 인스턴스인지 구분할 수 없기 때문"에 AnyPortrait로 편집할 수 있는 것처럼 보여질 뿐이며, 실제로 프리팹 원본을 편집하면 여러가지 문제들이 발생할 수 있습니다.
따라서 항상 아래와 같은 방법으로만 프리팹을 편집하시길 바랍니다.

유니티 프리팹 수정 - yuniti peulipaeb sujeong

(1) 편집하고자 하는 프리팹 에셋을 선택하고 씬으로 배치합니다.
(2) 씬에 배치된 프리팹 인스턴스를 선택하면 에디터로 편집하거나 Bake를 할 수 있습니다.
(3) Bake를 하거나 Refresh Meshes 버튼을 눌러서 렌더링된 캐릭터를 확인한 후, 다시 동기화를 하시길 바랍니다.