KoreanFoodie's Study

[언리얼] UPoseableMeshComponent 는 무엇일까? 본문

Game Dev/Unreal C++ : Dev Log

[언리얼] UPoseableMeshComponent 는 무엇일까?

GoldGiver 2022. 4. 23. 12:54

UPoseableMeshComponent 

언리얼에서 GhostTrail 등을 구현할 때, UPoseableMeshComponent  를 사용하는 것을 볼 수 있다. UPosebleMeshComponent 는 무엇일까?

먼저 정의로 넘어가보면,

/**
 *	UPoseableMeshComponent that allows bone transforms to be driven by blueprint.
 */
UCLASS(ClassGroup=Rendering, hidecategories=(Object,Physics), config=Engine, editinlinenew, meta=(BlueprintSpawnableComponent))
class ENGINE_API UPoseableMeshComponent : public USkinnedMeshComponent
...

다음과 같이 되어 있는데, 블루프린트에 의해 골격이 바뀔 수 있다.. 고 되어있다. USkinnedMeshComponent 를 상속받고 있는데, USkinnedMeshComponent 는

/**
 *
 * Skinned mesh component that supports bone skinned mesh rendering.
 * This class does not support animation.
 *
 * @see USkeletalMeshComponent
*/

UCLASS(hidecategories=Object, config=Engine, editinlinenew, abstract)
class ENGINE_API USkinnedMeshComponent : public UMeshComponent, public ILODSyncInterface

다음과 같은데, 애니메이션이 아닌 표면 메시 렌더링을 해주는 녀석이다. 그러니까, 딱 표면 렌더링을 하겠다.. 뭐 이렇게 받아들이면 될 것 같다.

 

UPosebleMeshComponent 에 OwnerCharacter 의 SkeletalMesh 를 설정하고, 각 Material 에 우리가 만든 DynamicMateral 을 달아주면 된다.

OwnerCharacter = Cast<ACharacter>(GetOwner());
Poseable->SetSkeletalMesh(OwnerCharacter->GetMesh()->SkeletalMesh);
Poseable->CopyPoseFromSkeletalComponent(OwnerCharacter->GetMesh());

DynamicMaterial = UMaterialInstanceDynamic::Create(Material, this);
for (int32 i = 0; i < OwnerCharacter->GetMesh()->SkeletalMesh->Materials.Num(); i++)
    Poseable->SetMaterial(i, DynamicMaterial);

 

그 후, timerDelegate 를 이용해서 일정 간격으로 재생시켜주면 된다.

FTimerDelegate timerDelegate = FTimerDelegate::CreateLambda([=]()
    {
        if (Poseable->IsVisible() == false)
            Poseable->ToggleVisibility();


        float height = OwnerCharacter->GetCapsuleComponent()->GetScaledCapsuleHalfHeight();
        SetActorLocation(OwnerCharacter->GetActorLocation() - FVector(0, 0, height));
        SetActorRotation(OwnerCharacter->GetActorRotation() + FRotator(0, -90, 0));
        Poseable->CopyPoseFromSkeletalComponent(OwnerCharacter->GetMesh());
        CLog::Print("SetActorRotation");
    });

GetWorld()->GetTimerManager().SetTimer(TimerHandle, timerDelegate, Interval, true, StartDelay);

 

Comments