2022.2의 새로운 프리팹 기능

씬 개발 팀이 프리팹 업데이트를 공개한 이후로 시간이 꽤 흘렀습니다. 지난 몇 번의 릴리스를 거치면서 사용자 여러분께서 보고해 주신 수많은 버그를 수정하고 프리팹 시스템의 여러 부분을 개선했습니다. 이제 2022.2에서 베타 버전으로 제공되는 여러 개선 사항과 업데이트의 장점을 살펴보겠습니다.
이제 씬에 있는 프리팹 인스턴스나 다른 프리팹 내부에 중첩된 프리팹 인스턴스의 프리팹 에셋을 교체할 수 있습니다. 이 기능은 씬에서 프리팹 인스턴스의 위치, 회전, 스케일을 유지한 채로 새로운 프리팹 에셋의 콘텐츠를 병합합니다. 이때 이름 기반 매칭(기본값)를 통해 최대한 많은 오버라이드와 레퍼런스를 유지합니다. 구체적으로 제공되는 기능은 다음과 같습니다.
- 프리팹 인스턴스에 대한 인스펙터에는 프리팹 에셋을 대체하는 데 사용할 수 있는 새로운 오브젝트 필드가 있습니다.
- 계층구조에는 인스턴스의 프리팹 에셋을 유사하게 대체할 수 있는 컨텍스트 메뉴가 있습니다.
- 마지막으로 일반 게임 오브젝트는 계층구조의 컨텍스트 메뉴를 통해 또는 Ctrl/Cmd 수정자 키로 드래그 앤 드롭하여 프리팹 인스턴스로 변환할 수 있습니다.



이 기능은 UI에서만 사용할 수 있는 것이 아니라, 유니티가 구축하는 대부분의 기능과 마찬가지로 오브젝트 매칭 방식과 오버라이드 처리 방식을 관리할 수 있는 API가 제공됩니다. 참조 PrefabUtility.ReplacePrefabAssetOfPrefabInstance와 PrefabUtility.ConvertToPrefabInstance.
가장 많은 요청을 받은 개선 사항 중에는 추가된 게임 오브젝트와 컴포넌트의 순서를 변경하는 기능도 있었습니다. "추가된 게임 오브젝트 및 컴포넌트"는 프리팹 인스턴스의 일부가 아니지만 씬의 프리팹 인스턴스나 변형 또는 중첩된 프리팹 내부에 추가된 게임 오브젝트 및 컴포넌트를 의미합니다. 2022.1부터는 추가된 게임 오브젝트의 순서를 드래그 앤 드롭으로 변경할 수 있습니다. 추가된 게임 오브젝트끼리 변경할 수도 있고 프리팹 인스턴스에 있는 게임 오브젝트와 변경할 수도 있습니다. 이 기능을 준비하려면 실행 취소 시스템의 대대적인 리팩토링이 필요했습니다.
에디터 스크립트에서 추가된 게임 오브젝트의 순서를 바꾸려면 추가된 게임 오브젝트의 트랜스폼에 형제 인덱스를 설정하기만 하면 됩니다. 인스펙터에서 추가된 컴포넌트를 재정렬하는 기능은 2022.2에 포함됩니다. 컴포넌트 재주문을 위한 공개 API는 없습니다.
게임 오브젝트와 컴포넌트의 완벽한 패리티(기능상의 동등함)를 위해 필요한 마지막 기능은 오버라이드로 프리팹 인스턴스에서 게임 오브젝트를 삭제하는 기능이었습니다. 오버라이드로 게임 오브젝트를 삭제하는 기능은 2022.2에 추가되었습니다. 이 옵션을 사용하면 게임 오브젝트를 삭제했을 때 프리팹 에셋에서 되돌리거나 프리팹 에셋에 적용하는 일반적인 워크플로가 예상대로 작동합니다.
에디터 스크립트의 경우 Object.DestroyImmediate 를 사용하여 프리팹 인스턴스 오브젝트를 파괴하고 씬 파일에 저장된 오버라이드로 파괴를 기록합니다.
유니티는 특정 프리팹 에셋의 배리언트 상속 트리에 관한 문의를 자주 받습니다. 2022.2에서는 인스펙터에 프리팹 패밀리 팝업을 추가했습니다. 팝업의 콘텐츠는 프로젝트 브라우저에서 선택한 프리팹 에셋에 따라 달라집니다. 프리팹 에셋을 선택하고 프리팹 패밀리 팝업을 열면 현재 프리팹의 모든 상위 오브젝트와 모든 직계 자식 오브젝트가 나열됩니다.

상속 트리에 관한 문의 외에도, 씬에 저장되었지만 사용하지는 않으며 스크립트에서 프로퍼티를 제거한 탓에 액세스할 수도 없는 오버라이드를 어떻게 제거할 수 있는지에 관한 질문도 많이 받았습니다. 최악의 경우 이러한 프로퍼티가 최종 빌드에 포함되어 스토리지 기기와 메모리 공간을 차지하지만 실제로는 사용하지 않는 에셋을 참조할 수도 있습니다.
이제 오버라이드는 다음과 같은 항목에 대해 사용되지 않는 것으로 표시됩니다.
- null 타겟 오브젝트
- 알 수 없는 프로퍼티 경로(스크립트화된 FormerlySerializedAsAttribute 사용법이 적용되지 않음)
- 제거된 컴포넌트
- 제거된 게임 오브젝트
- 배열 차원 변경(예: 머티리얼 배열)
계층구조에서 하나 이상의 프리팹 인스턴스를 선택하고 오버라이드 드롭다운을 열면 이제 에디터에 사용하지 않은 오버라이드가 있는지 여부가 표시됩니다. 그런 다음 새로운 미사용 오버라이드 드롭다운을 사용하여 씬에서 제거할 수 있습니다.

또한 계층구조의 씬 컨텍스트 메뉴를 통해 씬에서 사용하지 않는 오버라이드를 모두 제거하거나 프리팹 인스턴스를 임의로 선택할 수 있는 컨텍스트 메뉴를 통해 제거할 수 있습니다.

사용하지 않는 오버라이드가 자동으로 제거되지는 않습니다. 결과적으로 사용하지 않는 오버라이드가 남아 있는 이유를 알 수 없기 때문입니다. 스크립트에서 프로퍼티를 제거하거나 에셋을 삭제해도 사용하지 않는 오버라이드는 자동으로 제거되지 않습니다. 나중에 제거를 실행 취소하거나 오버라이드를 복원하려고 할 수 있기 때문입니다.
궁금한 점이 있으신가요? "'모두 적용'을 누른 후에도 여전히 프리팹 인스턴스에 오버라이드가 있는 이유는 무엇인가요?" 그 이유는 해당 오버라이드를 프리팹 에셋에 적용할 수 없기 때문입니다. 일반적으로 이런 오버라이드는 프리팹 에셋에서 참조할 수 없는 씬의 다른 오브젝트에 대한 레퍼런스입니다. 이제 일반적으로 적용할 수 없는 오버라이드는 인스펙터에서 짙은 파란색 바로 표시됩니다. 이러한 오버라이드는 적용할 수 없고 되돌릴 수만 있습니다.
이제 프리팹 모드를 열 때 기본 동작을 컨텍스트에서가 아닌 격리 상태에서로 변경할 수 있습니다. 편집기 환경설정 > 일반 > 기본 프리팹 모드로 이동하여 이 변경을 수행합니다.

이제 2022.2에서 프리팹 모드를 종료할 때 실행 취소가 하나의 실행 취소 작업으로 기록됩니다. 따라서 프리팹 모드를 종료한 후 실행 취소하면 프리팹에 대한 모든 변경 사항을 되돌리게 됩니다.
여러 릴리스에 걸쳐 씬 로드와 프리팹 모드에서의 프리팹 로드 중 오류 처리 및 보고를 대폭 개선했으며, 이제 오류와 관련된 프리팹이나 누락된 프리팹의 GUID가 표시됩니다. 실제로 씬을 로드하는 동안 누락된 프리팹의 에셋을 처리하는 방식이 전보다 더 안전하고 안정적입니다.
오류 처리를 더욱 개선하고 프로젝트에 잘못된 데이터가 유입되는 것을 방지하기 위해 수정할 수 없는 오류가 발생하면 프리팹 임포터에서 생성되는 깨진 프리팹 에셋 유형(Broken Prefab Asset Type)을 추가했습니다.
가장 일반적인 경우는 프리팹 변형이 삭제되어 부모 프리팹을 잃어버린 경우입니다. 이 경우 의미 있는 프리팹 배리언트를 생성할 수 없으므로 대신 깨진 프리팹 에셋이 생성됩니다. 이 새로운 에셋을 프로젝트 브라우저에서 선택하면 오류에 관한 정보가 인스펙터에 표시됩니다. 프리팹 부모가 누락된 경우에는 누락된 프리팹의 GUID가 표시됩니다. 프리팹 배리언트 체인이 끊어진 경우에는 부모가 누락된 배리언트를 찾을 때까지 인스펙터에서 체인의 상위 항목으로 이동할 수 있습니다.

연결 해제된 프리팹 인스턴스 개념은 2022.1부터 더 이상 존재하지 않습니다. 연결이 끊긴 프리팹 인스턴스 로드는 여전히 지원되지만, 씬 로드 중에 에디터가 이를 발견하면 연결이 끊긴 프리팹 인스턴스는 모든 프리팹 정보가 제거되고 일반 게임 오브젝트가 됩니다.
지금까지 오랫동안 사용자 여러분이 시간을 들여 보고해 주신 여러 버그를 수정했습니다. 일부 버그는 기존 프리팹 시스템에서 발생한 것이었지만, 대부분의 버그는 개선된 프리팹을 도입한 후에 드러났습니다.
사용자 여러분도 최신 프리팹 시스템의 안정성을 기쁘게 받아들여 주실 것이라고 확신합니다. 새로운 프리팹 시스템으로 원활하고 효율적으로 작업해 보세요.
프리팹 관련 질문이나 의견이 있으신가요? 포럼에 참여하여 의견을 공유하세요.
