아직 총기 재장전 혹은 발사 로직이 제대로 구현이 되지 않았으나 추후 해당 로직을 구현하면서 애니메이션 몽타주를 실행할 경우 지금까지 구현된 애니메이션 블루프린트에서 걷기(특히 사운드)가 제대로 재생이 되지 않을 가능성이 크다.
따라서, 캐릭터의 상체와 하체가 서로 다른 애니메이션을 재생할 수 있도록 구현한다.

현재 ECharacterState Blend Poses 로직 전체를 RifleLocomotion 이라는 형태로 저장

Layerd blend per bone 노드를 생성하여 Base Pose 에 RifleLocomotion 을 연결하고 Blend Poses 0 에 Slot 'DefaultSlot'을 연결

Layerd blend per bone 노드의 디테일 창에서 블렌드 모드를 Branch Filter 로 설정하여 분기 필터의 배열 엘리먼트를 추가하여 값을 위 사진처럼 준다.
spine_01 본을 기준으로 상/하체 애니메이션을 나눔

사용할 애니메이션 몽타주에서 방금 설정한 DefaultSlot 설정
헤더 파일
// ----- 애니메이션 몽타주 -----
UPROPERTY(EditDefaultsOnly, Category = "Animation")
TObjectPtr<UAnimMontage> ReloadMontage;
UPROPERTY(EditDefaultsOnly, Category = "Animation")
TObjectPtr<UAnimMontage> FireMontage;
UPROPERTY(EditDefaultsOnly, Category = "Animation")
TObjectPtr<UAnimMontage> EquipMontage;
UPROPERTY(EditDefaultsOnly, Category = "Animation")
TObjectPtr<UAnimMontage> HolsterMontage;
// ---------------------------
추후 사용할 애니메이션 몽타주에 대한 변수도 선언
소스 파일 - Reload 함수
void AMyCharacter::Reload()
{
if (CurrentState == ECharacterState::Sprinting || bIsReloading || !bEquipped)
{
UE_LOG(LogTemp, Warning, TEXT("Reload is not allowed!"));
return;
}
if (!ReloadMontage)
{
UE_LOG(LogTemp, Warning, TEXT("Reload Montage is not set!"));
return;
}
UAnimInstance* AnimInstance = CharacterArms->GetAnimInstance();
if (AnimInstance)
{
AnimInstance->Montage_Play(ReloadMontage, 1.f);
}
StopZoom();
bIsReloading = true;
FTimerHandle ReloadTimer;
GetWorld()->GetTimerManager().SetTimer(
ReloadTimer,
this,
&AMyCharacter::FinishReload,
2.0f,
false);
}

에디터에서 애니메이션 몽타주 등록