언리얼 C++ 프로그래밍

[언리얼 C++] 리디렉터 (Redirector)

언린이 2021. 8. 25. 09:41

언리얼에서 리디렉터는 이동된 애셋을 가리키던 레퍼런스를 현재 위치로 고쳐주는 오브젝트입니다.

 

언리얼 에디터에서 애셋을 이동시키거나 이름을 바꾸면 원래의 장소에 리디렉터가 남습니다. 이를 통해 현재 로드되지는 않았지만 이 애셋을 참조하는 패키지가 그 애셋의 새 위치를 알게 됩니다.

작명 규칙을 조기에 정해두고 이를 고수하면 리디렉터로 많은 문제점들을 예방할 수 있습니다.

 

 

1. 에디터에서 리디렉터 고치기

에디터에서 리디렉터를 확인하려면 컨텐츠 브라우저에서 리디렉터 표시 필터를 켭니다. 그러면 그 리디렉터를 가리키는 모든 패키지를 다시 저장한 뒤, 그것을 참조하는 모든 것들을 다시 저장할 수 있다면 리디렉터를 삭제합니다.

 

 

2. ResavePackages 커맨드렛

ResavePackages 커맨드렛은 -fixupredirects 옵션과 함께 실행하여 프로젝트의 모든 리디렉터 고치기를 시도할 수 있습니다.

 

UE4Editor.exe <GameName or uproject> -run=ResavePackages -fixupredirects -autocheckout -projectonly -unattended

위 코드는 명령줄 예제입니다.

명령줄은 사용자가 로컬 머신에서 실행시키는 것입니다. 고칠 필요가 있는 모든 파일을 체크아웃하며, 사용자가 제출합니다. 자동화 프로세스에서 자동 체크인 옵션을 사용하면 파일을 자동으로 체크인해줍니다.

 

 

3. 주의사항

  • 이름 변경
    오브젝트를 새로 만들고 이름을 변경한 다음, 원래의 것과 같은 이름의 새 오브젝트를 만들면 오류가 발생합니다. 처음 오브젝트 이름 변경시 리디렉터가 생성되었는데, 리디렉터와 리소스는 이름이 같을 수 없기 때문입니다.

  • 허상 리디렉터
    리디렉터 관련해서 알려진 문제가 몇 가지 있습니다.
    • 시나리오 1
      • 오브젝트 이름을 A에서 B로 바꿉니다.
      • B를 삭제합니다.
      • B가 사용되고 있으므로 삭제할 수 없다는 오류 메시지가 뜹니다. 이름 변경 도중 생성된 리디렉터가 아직 B를 가리키고 있기 때문입니다.
    • 시나리오 2
      • 오브젝트 이름을 A에서 B로 바꿉니다.
      • 오브젝트 이름을 B에서 A로 다시 바꿉니다.
      • A를 삭제합니다.
      • 첫 이름 변경에서 생성된 리디렉터는 소멸되지만, B에서 A로 바꿀때 리디렉터가 새로 생성됩니다. 그 결과 A는 참조되고 있기 때문에 지울 수 없을 것입니다.

에디터 혹은 SavePackages로 리디렉터를 고친 후 삭제하면 이러한 문제들은 해결될 것입니다.