Unity의 Prefab 차이점을 Hierarchy, Scene, Inspector에서 확인할 수 있는 에디터 확장 프로그램인 'Prefab Diff Viewer'를 만들었습니다.
왼쪽에 Hierarchy, 중앙에 Scene, 오른쪽에 변경 전후의 Inspector가 나란히 배치되어 있습니다.
최근에는 Unity 개발을 AI에게 맡기는 경우가 늘어나 C#뿐만 아니라 Prefab의 배치나 설정까지 수정하게 됩니다.
하지만 수정된 Prefab을 Unity에서 열어도 어떤 GameObject의 어떤 값이 변경되었는지 알기 어렵습니다. 시각적으로는 문제가 없어 보여도 의도하지 않은 변경 사항을 놓칠 수 있습니다.
텍스트 형태의 Prefab이라면 Git으로 차이점을 확인할 수 있습니다. 하지만 다음과 같은 YAML을 보더라도 그것이 화면의 어느 부분인지 해석해야 합니다.
Gitで確認したPrefabのYAML差分
Git으로는 값이나 참조의 변경은 추적할 수 있지만, GameObject의 이름이나 부모-자식 관계를 따라가야 합니다.
그래서 차이점을 다음과 같은 흐름으로 확인할 수 있도록 했습니다.
- Hierarchy에서 추가/삭제/변경된 GameObject를 찾고 -
- Scene에서 선택한 GameObject의 위치와 변경 후 모습을 확인하며 -
- Inspector에서 변경된 값을 좌우로 나란히 비교합니다.
왼쪽이 변경 후, 오른쪽이 변경 전입니다. Scale이나 Sprite, Color 등의 변경된 부분에 색을 입혔습니다.
예를 들어 위의 예시라면, Scale의 X·Y가 1에서 1.5로, Sprite가 enemy_slime에서 icon_heart로 변경되었음을 확인할 수 있습니다.
Unity의 텍스트 형태에서는 GameObject와 Component가 각각 YAML 문서로 저장되며 fileID로 상호 참조합니다. (Unity 공식: 텍스트 형태의 구조)
GameObject의 m_Component와 Transform의 m_Father·m_Children을 따라 Hierarchy를 구성합니다. 변경 전후에 동일한 fileID를 가진 것을 대응시키면, 이름이나 부모가 바뀌어도 같은 오브젝트로 추적할 수 있습니다.
외부 툴이 ID를 재설정한 경우에는 삭제와 추가로 처리하는 한계가 있습니다.
설정 값은 다음과 같이 프로퍼티의 경로(property path)와 값으로 전개하여 비교합니다.
m_AnchoredPosition: {x: 0, y: -192}
↓
m_AnchoredPosition.x = 0
...
Unity의 SerializedProperty.propertyPath에 맞춤으로써 YAML 차이점을 Inspector의 대응하는 칸에 연결하기 쉽게 했습니다. (Unity 공식: SerializedProperty)
또한, 숫자 값의 1과 1.0처럼 표기상의 차이만 있는 것은 일반적인 변경 사항과 구분합니다. 반면, 문자열인 `