[ProjectXZ] 모듈러 캐릭터 개발일지 3. 모듈러 시스템 개발 (ver.1)

KWONYEONGMIN·2024년 10월 7일

언리얼

목록 보기
4/15
UXZModularComponent::UXZModularComponent()
{
...
   ModuleHandlerMap.Add(EModularMeshType::Backpack, CreateDefaultSubobject<UXZSkeletalMeshModuleComponent>(TEXT("BackpackModule")));
   ModuleHandlerMap.Add(EModularMeshType::Belt, CreateDefaultSubobject<UXZSkeletalMeshModuleComponent>(TEXT("BeltModule")));
   ModuleHandlerMap.Add(EModularMeshType::Foots, CreateDefaultSubobject<UXZSkeletalMeshModuleComponent>(TEXT("FootsModule")));
   ModuleHandlerMap.Add(EModularMeshType::Hands, CreateDefaultSubobject<UXZSkeletalMeshModuleComponent>(TEXT("HandsModule")));
   ModuleHandlerMap.Add(EModularMeshType::Heads, CreateDefaultSubobject<UXZSkeletalMeshModuleComponent>(TEXT("HeadsModule")));
   ModuleHandlerMap.Add(EModularMeshType::Helmet, CreateDefaultSubobject<UXZSkeletalMeshModuleComponent>(TEXT("HelmetModule")));
   ModuleHandlerMap.Add(EModularMeshType::Vest, CreateDefaultSubobject<UXZSkeletalMeshModuleComponent>(TEXT("VestModule")));
   ModuleHandlerMap.Add(EModularMeshType::Pants, CreateDefaultSubobject<UXZSkeletalMeshModuleComponent>(TEXT("PantsModule")));
}

void UXZModularComponent::InitializeComponent()
{
    Super::InitializeComponent();
   ...
   	ModuleHandlerMap[EModularMeshType::Backpack]->SetCharacter(Character);
    ModuleHandlerMap[EModularMeshType::Belt]->SetCharacter(Character);
    ModuleHandlerMap[EModularMeshType::Foots]->SetCharacter(Character);
    ModuleHandlerMap[EModularMeshType::Hands]->SetCharacter(Character);
    ModuleHandlerMap[EModularMeshType::Heads]->SetCharacter(Character);
    ModuleHandlerMap[EModularMeshType::Helmet]->SetCharacter(Character);
    ModuleHandlerMap[EModularMeshType::Vest]->SetCharacter(Character);
    ModuleHandlerMap[EModularMeshType::Pants]->SetCharacter(Character);
}
  • MoudlarComponent에서 생성한 SkeletalModuleComponent 객체들을 TMap 컨테이너로 추가하였다.
void UXZSkeletalMeshModuleComponent::Attach(int32 ItemID)
{
	if ( UXZDataManager* DataManager = UGameInstance::GetSubsystem<UXZDataManager>(GetWorld()->GetGameInstance()) )
	{
		// DataManager에서 ModuleAsset 경로를 가지고 온다.
		if ( FItemTable_Module* ModuleInfo = DataManager->TryGetModuleAsset(ModuleIDName) )
		{
			ensure(MeshComponent);
			ensure(Character);
			ensure(Character->GetMesh());

			if ( USkeletalMesh* SkeletalMesh = LoadObject<USkeletalMesh>(nullptr, *ModuleInfo->ASSETPATH))
			{
				MeshComponent->SetSkeletalMesh(SkeletalMesh);
				MeshComponent->AttachToComponent(Character->GetMesh(), FAttachmentTransformRules::KeepRelativeTransform);
				MeshComponent->SetMasterPoseComponent(Character->GetMesh());
			}
			else
			{
				UE_LOG(LogTemp, Error, TEXT("Failed to load SkeletalMesh at path: %s"), *ModuleInfo->ASSETPATH);
			}
		}
	}
}
  • 그리고 UXZSkeletalMeshModuleComponent에서 자신이 가지고 있는 타입의 모듈의 SkeletalMeshComponent에 SkeletalMesh 애셋을 설정해주었다.
profile
Hello World

0개의 댓글