잘못된 부분
FSoftObjectPath SkeletalMeshPath(Mesh.ToSoftObjectPath());
USkeletalMesh* SkeletalMesh = Cast<USkeletalMesh>(SkeletalMeshPath.TryLoad());
if (SkeletalMesh != nullptr)
{
MeshesToMerge.Add(SkeletalMesh);
}
수정된 부분
TSoftObjectPtr<USkeletalMesh> MeshPtr = MeshArray.Get(Index);
if (!MeshPtr.IsNull())
{
USkeletalMesh* SkeletalMesh = MeshPtr.LoadSynchronous();
if (ensureAlways(SkeletalMesh))
{
MeshesToMerge.Add(SkeletalMesh);
}
}
무엇이 잘못됐나?
FSoftObjectPath SkeletalMeshPath(Mesh.ToSoftObjectPath());
USkeletalMesh* SkeletalMesh = Cast<USkeletalMesh>(SkeletalMeshPath.TryLoad());
는 LoadSynchronous에서 내부적으로 처리하고 있는 로직이다.
UObject* LoadSynchronous() const
{
UObject* Asset = Get();
if (Asset == nullptr && !IsNull())
{
ToSoftObjectPath().TryLoad();
// TryLoad will have loaded this pointer if it is valid
Asset = Get();
}
return Asset;
}
따라서 한 줄로 간편하게 쓸 수 있는 LoadSynchronous() 를 사용한다. 또한 어떤 값이 null이 아니면 안될 때는 디버그하기 쉽게 ensureAlways를 사용하여 assert를 내주자.
앞으로…
- 앞으로 모르는 함수를 사용할 땐 꼭 함수 내부를 보고 어떻게 동작하는지 확인하자.
- 우리 코드에서 비슷한 내용을 찾아 어떻게 사용하고 있는지 참고한다.
- n == nullptr 이런식으로 null 체크를 할 때, 만약 이 부분이 null이면 안되는 건지 아니면 아니어도 그냥 넘어갈 수 있는지 구별해야한다. 다양한 assert 구문을 알아두면 좋을 것 같다.