Unit 클래스
유닛을 초기에는 SkeletalMesh에 맞춰 애님 인스턴스를 지정하기 위해 분리하여 관리하였다.
하지만, UAssetManager를 통해 Asset을 불러와 지정할 수 있기에 통합해도 된다고 생각했다.
각 유닛에는 추가적으로 부착되는 SkeletalMeshComponent가 있어 이에 대한 조정이 필요했다.
따라서, Rank에 따라 각 부위에 대한 AssetLoad를 요청하고 모든 Asset이 로딩되었다면 Callback을 주어 DeferredSpawn이 완료하게 되었다.
UnitMeshHandle = UAssetManager::Get().GetStreamableManager().RequestAsyncLoad(UnitMeshes[UnitMeshIdx], FStreamableDelegate::CreateUObject(this, &AURRCharacterUnit::UnitMeshLoadCompleted));
UnitMaterialHandle = UAssetManager::Get().GetStreamableManager().RequestAsyncLoad(UnitMaterials[Rank], FStreamableDelegate::CreateUObject(this, &AURRCharacterUnit::UnitMaterialLoadCompleted));
AnimInstanceHandle = UAssetManager::Get().GetStreamableManager().RequestAsyncLoad(AnimInstances[AnimInstanceIdx], FStreamableDelegate::CreateUObject(this, &AURRCharacterUnit::AnimInstanceLoadCompleted));
AttackMontageHandle = UAssetManager::Get().GetStreamableManager().RequestAsyncLoad(AttackMontages[Rank], FStreamableDelegate::CreateUObject(this, &AURRCharacterUnit::AttackMontageLoadCompleted));
PlaceMontageHandle = UAssetManager::Get().GetStreamableManager().RequestAsyncLoad(PlaceMontages[AnimInstanceIdx], FStreamableDelegate::CreateUObject(this, &AURRCharacterUnit::PlacedMontageLoadCompleted));
switch (rank)
{
case 0:
WeaponMeshHandle = UAssetManager::Get().GetStreamableManager().RequestAsyncLoad(WeaponMeshes[Rank], FStreamableDelegate::CreateUObject(this, &AURRCharacterUnit::WeaponMeshLoadCompleted));
AdditiveMeshHandles.Add((int)EAdditiveMeshEnum::MESH_Helmet, UAssetManager::Get().GetStreamableManager().RequestAsyncLoad(AdditiveMeshes[(int)EAdditiveMeshEnum::MESH_Helmet], FStreamableDelegate::CreateUObject(this, &AURRCharacterUnit::HelmetMeshLoadCompleted)));
LoadCompletedPart[(int)EAssetType::ASSET_MAT] = true;
LoadCompletedPart[(int)EAssetType::ASSET_BODY] = true;
LoadCompletedPart[(int)EAssetType::ASSET_ACC] = true;
break;
case 1:
...
}
Asset로딩이 완료되면 불리는 Callback함수에서는 해당 핸들에서 Asset을 받아와 캐스팅한 뒤 설정을 해주고 핸들을 해제해 주면 된다.
void AURRCharacterUnit::UnitMeshLoadCompleted()
{
if (UnitMeshHandle.IsValid())
{
USkeletalMesh* UnitMesh = Cast<USkeletalMesh>(UnitMeshHandle->GetLoadedAsset());
if (UnitMesh && GetMesh())
{
GetMesh()->SetSkeletalMesh(UnitMesh);
}
}
UnitMeshHandle->ReleaseHandle();
UnitLoadCompleted((int)EAssetType::ASSET_UNIT_MESH);
}
이렇게 진행하여 모든 유닛을 하나의 클래스로 통합하였다.
기존에는 분리된 클래스 때문에 GA나 GE등 추가적인 설정을 BP에서 해주지 않아 에러가 발생하는 경우가 있었지만,
하나의 클래스로 통합하여 BP설정을 한번만 하게 해 주었다.