-
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 '기록' 카테고리의 다른 글
240412 밀린 기록 Layered Blend Per Bone (0) 2024.04.16 240411 기록 애니메이션 layer로 구분하여 blend per bone 사용 (0) 2024.04.11 240408 기록 (0) 2024.04.08 240405 기록 (0) 2024.04.05 240404 언리얼 캐릭터선택 (폰 빙의) (0) 2024.04.04