ItemManagerSubsystem을 선언해 아이템 관련 정보를 싱글톤으로 가져오게끔 구현했다.
블루프린트까지 만들 필요는 없다고 생각해 DataTable을 파일 경로를 통해 할당해주었다.
여기서 강참조로 할당하게 될 경우 게임 시작과 동시에 로드하게 되면서 많은 시간이 걸리게 될 것이고, 당장 사용하지 않는 상황에도 메모리를 차지하고 있게 된다.
그 때 쓰는 게 TSoftObjectPtr이다.
필요할 때 메모리에 로드해 사용할 수 있어 메모리 관리에도 효율적이고 과부하도 피할 수 있다.
TSoftObjectPtr<UDataTable> ItemDataTable
= TSoftObjectPtr<UDataTable>(FSoftObjectPath(TEXT("에셋 경로")));
이렇게 DataTable을 선언, 경로로 참조했다.
UDataTable* UItemManagerSubsystem::GetItemDataTable()
{
if (ItemDataTable.IsValid())
return ItemDataTable.Get();
return ItemDataTable.LoadSynchronous();
}
필요할 때 GetItemDataTable을 호출해 사용한다.
번거로운 방법이지만 DataTable은 가진 변수가 많아 꼭 약참조로 비동기로드해주는 게 좋아보인다.
번거로움에도 DataTable을 사용하는 이유는 엑셀과 연동도 가능하고, 기획자가 언리얼 이해도가 조금만 있어도 빠르고 쉽게 편집이 가능하기 때문이다.
ㅡ
여기부턴 구현 중 겪은 오류와 해결에 대한 내용이다.
프로젝트 실행 시 75%에서 멈추는 현상
DataTable 할당을 헤더파일에서 바로 하지 않고 생성자에서 시도했는데, 경로를 잘못 적어 생성자에 오류가 있는 상황이었다. 이 때 Local Windows Debugger로 프로젝트를 실행하면 75%에서 멈추게 된다.
프로젝트 파일로 직접 실행하면 또 문제 없이 실행돼서 이유를 찾는 데에 시간이 조금 걸렸다.
로컬 윈도우 디버거로 실행할 수 없는 현상
75%에서 멈출 때 리빌드를 시도하면 이렇게 되는 것 같다.
해결하려면 생성자 오류를 수정하고, 리빌드 과정을 거친 뒤
시작 프로젝트 구성으로 가서 자신의 프로젝트를 선택해주면 된다.