ABOUT ME

  • 240409 기록 액터에 세개의 스켈레탈 메시 달아주기
    기록 2024. 4. 9. 23:18

    최종 미니 목표 : 캐릭터 선택 UI이동에 맞춰 배경에 있는 손 메시 애니메이션을 작동하는 것

    구상

    1. 액터에 팔, 인형2개를 맞춰 달아준다.(오늘 진행)

    2. IDLE 애니메이션으로 초기화한다.(오늘 진행)

    3. 애니메이션 몽타주를 생성하여 왼쪽 팔과 오른쪽 팔에 대한 포즈를 나눈다.

    4. 애니메이션을 적용 할 알고리즘을 짠다.

    5. 이를 서버에서 잘 작동하는지 확인하고 디테일을 맞춘다.

     

    진행한 점

    1. 팔, 인형 메시, 메시 애니메이션 추출, 프로젝트에 import

     

    2. 팔, 인형2개를 가지고 있는 액터 C++로 생성

    이렇게 3개의 스켈레탈 메시를 가지는 액터를 생성함.

    // 헤더파일
    	// 로즈 팔 모양 스켈레탈 메시
    	UPROPERTY(EditAnywhere, BlueprintReadWrite)
    	USkeletalMeshComponent* ArmMeshComponent;
        
    	// 메이, 코디 인형 메시
    	UPROPERTY(VisibleAnywhere)
    	USkeletalMeshComponent* CodyMeshComponent;
    
    	UPROPERTY(VisibleAnywhere)
    	USkeletalMeshComponent* MayMeshComponent;
    //생성자
    	// Create and attach arm skeletal mesh component
        ArmMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("ArmMeshComponent"));
        ArmMeshComponent->SetupAttachment(RootComponent);
        static ConstructorHelpers::FObjectFinder<USkeletalMesh> ArmMeshAsset(TEXT("/Game/..."));
        if (ArmMeshAsset.Succeeded())
        {
            ArmMeshComponent->SetSkeletalMesh(ArmMeshAsset.Object);
        }
    
        // Create and attach cody skeletal mesh component
        CodyMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("CodyMeshComponent"));
        CodyMeshComponent->SetupAttachment(RootComponent);
        CodyMeshComponent->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f)); // Adjust location if needed
        CodyMeshComponent->SetWorldScale3D(FVector(5.0f, 5.0f, 5.0f)); // 코디 메시의 스케일을 (2, 2, 2)로 설정합니다.
    
        static ConstructorHelpers::FObjectFinder<USkeletalMesh> CodyMeshAsset(TEXT("/Game/..."));
        if (CodyMeshAsset.Succeeded())
        {
            CodyMeshComponent->SetSkeletalMesh(CodyMeshAsset.Object);
        }
    
        // Create and attach may skeletal mesh component
        MayMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("MayMeshComponent"));
        MayMeshComponent->SetupAttachment(RootComponent);
        MayMeshComponent->SetRelativeLocation(FVector(100.0f, 0.0f, 0.0f)); // Adjust location if needed
        MayMeshComponent->SetWorldScale3D(FVector(5.0f, 5.0f, 5.0f)); // 코디 메시의 스케일을 (2, 2, 2)로 설정합니다.
    
        static ConstructorHelpers::FObjectFinder<USkeletalMesh> MayMeshAsset(TEXT("/Game/..."));
        if (MayMeshAsset.Succeeded())
        {
            MayMeshComponent->SetSkeletalMesh(MayMeshAsset.Object);
        }

    3. 팔에 대한 애니메이션 블루프린트, 각 인형에 대한 애니메이션 블루프린트 생성, 루트 애니메이션 적용

    4. 애니메이션의 위치가 손의 본위치에 맞게 설정

    	//Attach MayMesh to LeftAttach bone
    	MayMeshComponent->AttachToComponent(ArmMeshComponent, FAttachmentTransformRules::SnapToTargetIncludingScale, TEXT("LeftAttach"));
    
    	//Attach CodyMesh to RightAttach bone
    	CodyMeshComponent->AttachToComponent(ArmMeshComponent, FAttachmentTransformRules::SnapToTargetIncludingScale, TEXT("RightAttach"));

    5. 애니메이션 rotation 디테일 맞추기

    	//Attach MayMesh to LeftAttach bone
    MayMeshComponent->AttachToComponent(ArmMeshComponent, FAttachmentTransformRules::SnapToTargetIncludingScale, TEXT("LeftAttach"));
    MayMeshComponent->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f)); // Adjust location if needed
    MayMeshComponent->SetRelativeRotation_Direct(FRotator(20.0f, 0.0f, 80.0f)); // Adjust location if needed
    
    	//Attach CodyMesh to RightAttach bone
    CodyMeshComponent->AttachToComponent(ArmMeshComponent, FAttachmentTransformRules::SnapToTargetIncludingScale, TEXT("RightAttach"));
    CodyMeshComponent->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f)); // Adjust location if needed
    CodyMeshComponent->SetRelativeRotation_Direct(FRotator(140.0f, 0.0f, -110.0f)); // Adjust location if needed

    before
    after

    댓글

Designed by Tistory.