Timeline 바인딩 잔여 키 때문에 에셋 번들에 엉뚱한 리소스가 들어가는 문제
특정 텍스처 파일이 에셋 번들에 중복으로 들어가는 현상을 발견했다. 이 리소스는 어떤 팝업 프리팹과 아무 관련이 없는데도 그 팝업 번들에 auto로 include되고 있었다.
에셋 참조 추적 도구(FR2)로 해당 리소스를 따라가 봐도 참조 관계에서는 원인을 찾지 못했다.
원인 찾기
섹션 제목: “원인 찾기”연관된 프리팹을 하나씩 따라가며 설정을 바꿔 봤다.
- 다른 팝업 프리팹에 붙어 있던 불필요하다고 판단한 에셋 라벨 제거(Dynamic, layout, Text): 실패
- 텍스처의 wrap mode를 repeat일 필요가 없다고 판단해 repeat → clamp로 변경: 실패
- 문제의 팝업 프리팹에서 비교적 최근 추가된 타임라인 오브젝트를 제거한 뒤 번들 빌드: 성공
3번을 더 좁혔다.
- 분할 정복으로 오브젝트를 나눠 번들 빌드를 반복한 결과, PlayableDirector 컴포넌트의 Timeline 에셋을 포함해 빌드하면 문제가 재현됐다.
- Inspector의 Normal 모드에서는 바인딩이 정상으로 표시됐지만, Debug 모드에서 보면 Scene Binding 항목들이 key-value로 남아 있었다. 바인딩 개수도 Normal 8개, Debug 28개로 달랐다.
화면에는 보이지 않는 옛 Scene Binding이 리소스를 참조하고 있어 번들에 딸려 들어갔다.
PlayableDirector와 짝인 TimelineAsset을 재사용하려고 쓰던 MenuItem DuplicateWithBindings에, 복제 시 Scene Binding을 의도적으로 비우는 로직을 추가했다. 비운 뒤 SetGenericBinding을 하면 바인딩이 자동으로 다시 매핑되는 것을 확인했다.
/** 추가된 로직*/var serializedObject = new SerializedObject(newPlayableDirector);{ var sceneBindings = serializedObject.FindProperty("m_SceneBindings"); sceneBindings.ClearArray();}serializedObject.ApplyModifiedProperties();
/** 이어지는 로직*/var oldBindings = playableAsset.outputs.ToArray();var newBindings = newPlayableAsset.outputs.ToArray();
for (int i = 0; i < oldBindings.Length; i++){ newPlayableDirector.SetGenericBinding(newBindings[i].sourceObject, playableDirector.GetGenericBinding(oldBindings[i].sourceObject) );}수정 후 번들 빌드에서 해당 리소스가 더 이상 포함되지 않는 것을 확인했다.
추가로, key가 null로 남은 의미 없는 Scene Binding 항목을 지우는 MenuItem(Clear Empty Bindings)도 만들었다.