내일배움캠프를 진행하던 도중 기존에 사용하던 프로젝트를 복사해서 사용할 일이 생겼다.
새로 프로젝트를 만들고 나서 실습에서 사용했던 Asset은 Migrate로 가져왔고, C++과 헤더가 들어있는 Source 폴더는 복사해서 가져왔다.
Source는 단순히 복사해서 가져오는 것이기 때문에 모든 파일의 내용이 이전 프로젝트 명으로 설정되어 있어서, Target, Build, 헤더 파일의 프로젝트 명을 현재 프로젝트 명으로 바꿔 주었다.
이후 BP의 Parent Class를 변경된 클래스로 바꿔주려고 했으나, Parent Class에 C++ 클래스가 안 뜨는 현상이 발생했다.
에디터를 껐다가 다시 켜도, 임시 폴더를 다 삭제했다가 Generate 후 다시 빌드 해도 Parent Class가 보이지 않았다.
이유를 모르겠어서 구글에 찾아본 결과, Source를 복사하여 가져오는 과정에서 클래스들이 리플렉션 시스템에 제대로 등록되지 않아 에디터에 안 보일 가능성이 높다고 판단했다.
가져온 클래스 기반으로 BP를 다시 만들어도 되지만, 세부 값들을 다시 조정해야하는 불편함이 있었기에 다른 방법을 더 찾아보았다.
그러던 중 언리얼 포럼에서 다음과 같은 글을 발견했다.
https://forums.unrealengine.com/t/migrate-blueprint-with-c-parent-class/332831/11

DefaultEngine.ini 파일에 [CoreRedirects] 섹션을 추가하고, Redirect 코드를 추가해주면 된다는 내용이다.
왜 Redirect가 필요한지 확인하기 위해 궁금하여 uasset 파일을 헥스 에디터로 열어봤더니, Parent Class 값에 대한 정보를 찾을 수 있었다.

/Script/이전프로젝트명.클래스이름 이런 값으로 Parent Class를 저장하고 있기 때문에, Chapter03 이 부분을 새로운 프로젝트 명으로 바꿔주면 된다는 것이다.
그래서 위 글을 참고하여 다음 코드를 DefaultEngine.ini 에 추가했다.
[CoreRedirects]
+ClassRedirects=(MatchSubstring=True,OldName="/Chapter03",NewName="/NBC_Work8")
+EnumRedirects=(MatchSubstring=True,OldName="/Chapter03",NewName="/NBC_Work8")
+FunctionRedirects=(MatchSubstring=True,OldName="/Chapter03",NewName="/NBC_Work8")
+StructRedirects=(MatchSubstring=True,OldName="/Chapter03",NewName="/NBC_Work8")
이후 다시 Generate 하고 빌드 후 에디터를 열어 BP Asset을 살펴보니 정상적으로 Parent Class가 변경된 것을 확인할 수 있었다.
결론적으로, 기존 프로젝트에서 C++/헤더를 복사해올 때 블루프린트의 Parent Class 경로가 /Script/<OldModule>.<Class> 로 저장되어 있기 때문에, 새 프로젝트 모듈명으로 매칭되지 않아 Parent Class가 깨질 수 있다.
이 경우 DefaultEngine.ini에 [CoreRedirects] 섹션을 추가하여 /Script/OldModule → /Script/NewModule 로 Redirect 해주면 문제를 해결할 수 있다.
다만, Core Redirect는 기존 자산을 호환하기 위한 기능이므로, 장기적으로는 프로젝트 모듈과 C++ 클래스를 새로 정리하는 편이 더 안전할 것이다.
시간이 되면 다른 해결 방법이 있는지 다시 찾아봐야겠다.
Core Redirect에 대한 자세한 내용은 아래 Unreal Document 참고 바란다.