콘텐츠로 이동

Timeline 바인딩 잔여 키 때문에 에셋 번들에 엉뚱한 리소스가 들어가는 문제

특정 텍스처 파일이 에셋 번들에 중복으로 들어가는 현상을 발견했다. 이 리소스는 어떤 팝업 프리팹과 아무 관련이 없는데도 그 팝업 번들에 auto로 include되고 있었다.

에셋 참조 추적 도구(FR2)로 해당 리소스를 따라가 봐도 참조 관계에서는 원인을 찾지 못했다.

연관된 프리팹을 하나씩 따라가며 설정을 바꿔 봤다.

  1. 다른 팝업 프리팹에 붙어 있던 불필요하다고 판단한 에셋 라벨 제거(Dynamic, layout, Text): 실패
  2. 텍스처의 wrap mode를 repeat일 필요가 없다고 판단해 repeat → clamp로 변경: 실패
  3. 문제의 팝업 프리팹에서 비교적 최근 추가된 타임라인 오브젝트를 제거한 뒤 번들 빌드: 성공

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)도 만들었다.