본문 바로가기
Unreal Engine5/KDT 2024

[UE5 KDT2024] 16. 애니메이션 몽타주

by 유잉유잉유잉 2025. 2. 28.
728x90

 

▶️ 애니메이션 몽타주 

- 몽타주 : 여러가지의 애니메이션 에셋을 하나의 에셋으로 결합

- 이걸 통해 우리는 블루프린트나 코드를 통해 

- 여러가지 애니메이션을 동적으로 제어할 수 있다.

 

 


 

 

1. 애니메이션 몽타주 만들기

 

1) 블프/애니메이션 폴더에 애니메이션 - 애니메이션 몽타주 -> 스켈레톤 선택 -> BPAM_PlayerKnight_Attack 

 

2) 몽타주에 애니 추가

보라색을 몽타주 섹션이라고 부름

 

(1) 에디터 이동 - 에셋브라우저에서 공격애니 끌어다놓기 (Primary_Attack_Slow_A~D)  

애니 에셋 올리면 연두색으로  들어감



(2) 애니 사이마다 몽타주섹션 추가 

- 몽타주 있는 라인에서 오른쪽 클릭하면 몽타주 생성 가능



(3) 몽타주 섹션에서 순서대로 연결 

- 화살표 or 정지 아이콘을 눌러서 해당 몽타주의 다음 몽타주 연결 / 끊기 가능



 

2. AnimBase에 연결

 

(1) AnimBase.h에 몽타주 변수 추가 

...	
UPROPERTY ( EditAnywhere, BlueprintReadOnly )
TObjectPtr<UAnimMontage> mAttackMontage;

 

 

 

3. 애니에 몽타주 연결하기

 

1) BPA_AnimKnight 에디터 들어가면 디테일창에 추가한 변수 볼수있음. 설정해주기

 

2) 로코모션 보이는 애님 그래프까지 올라가서 slot ‘DefaultSlot’ 검색 및 추가, 연결 

 

 

4. 공격 입력 만들자

 

1) 블프/input 폴더에 입력 - 입력액션 - IA_Attack 생성 

 

2) IA_Context에 IA_Attack 추가, 입력은 스페이스바, 트리거 추가 및 인덱스는 눌림

 

3) DefaultInputSystem에 인식시키기

header (앞에 변수들 UPROPERTY 붙여주기)

 
..
UPROPERTY( EditAnywhere, BlueprintReadWrite )
class UInputAction* mAttack;

 

생성자 cpp

..
static ConstructorHelpers::FObjectFinder<UInputAction>
	AttackAction( L"/Script/EnhancedInput.InputAction'/Game/Blueprint/Input/IA_Attack.IA_Attack'" );
if ( AttackAction.Succeeded() )
	mAttack = AttackAction.Object;

 

 

5. 플레이어 공격 함수 추가 

 

1) PlayerBase.h

-위에 함수들 UFUNCTION() 모두 추가 

..
UFUNCTION()
void AttackAction( const struct FInputActionValue& value );

 

 

cpp

SetupPlayerInputComponent() 맨아래

void APlayerBase::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
...
	inputCp->BindAction( mDefaultInput->mAttack,	ETriggerEvent::Triggered, this, &APlayerBase::AttackAction );
}

=> AttackAction() 구현하고, 로그 찍고 실행하면 스페이스 눌렀을 때 정상적으로 로그가 출력된다.



 

 

6. 애니를 실행해보자 

 1) AnimBase.h 공격 몽타주 실행하는 함수 선언 추가 

..
UFUNCTION()
void PlayAttackMonatage();

 

2) 구현

void UAnimBase::PlayAttackMonatage()
{
	Montage_Play( mAttackMontage );
}

 

▶️Montage_Play() : 몽타주 재생하는 함수 

float UAnimInstance::Montage_Play(UAnimMontage* MontageToPlay, float InPlayRate/*= 1.f*/, EMontagePlayReturnType ReturnValueType, float InTimeToStartMontageAt, bool bStopAllMontages /*= true*/)



 

3) 플레이어에서 공격시 공격 몽타주 실행하기

void APlayerBase::AttackAction( const FInputActionValue& value )
{
	if ( IsValid( mAnim ) )
		mAnim->PlayAttackMonatage();
}

 

=> 실행하면 스페이스 눌렀을 때 공격 몽타주 잘 실행됨 근데 끝까지 공격함



7. 공격 중에 공격 입력이 들어왔을때만 연속으로 공격 애니가 실행 되도록 수정

 

1) BPAM_PlayerKnight_Attack 

몽타주 섹션에서 모두 링크 제거

=> 이상태에서 실행하면 공격시 연속공격이 되지 않는다.

=> 공격 중 공격이 들어오면 다음 공격 애니가 실행되도록 해보자 



 

2) 애니메이션 노티파이 

 

▶️ 애니메이션 노티파이

- 애니메이션 프레임 사이에 함수를 추가

 

(1) BPAM_~ 에서 노티파이 추가하기 - 공격 시작 프레임 시작부근 - AttackBegin, 공격 끝나는 프레임 -AttackEnd 추가

 

3) AnimBase에서 연결

AnimBase.h

..
UFUNCTION()
void AnimNotify_AttackBegin();
UFUNCTION()
void AnimNotify_AttackEnd();

=> ⭐위에서 추가한 노티파이 이름과 맞춰야한다.

 

▶️애니메이션 노티파이 함수 선언 네이밍 규칙 

AnimNotify_노티파이이름();

 

cpp

void UAnimBase::AnimNotify_AttackBegin() 
{
	//mAttackCombo = false;
	GEngine->AddOnScreenDebugMessage( 1, 5, FColor::Red, L"AnimNotify_AttackBegin" );
}

void UAnimBase::AnimNotify_AttackEnd()
{
	GEngine->AddOnScreenDebugMessage( 1, 5, FColor::Red, L"AnimNotify_AttackEnd" );
}

 

=> 위 함수들을 구현 후 로그찍고 실행해보면

추가한 스테이트들의 애니 프레임에 맞춰서 로그들이 출력된다.



 

▶️언리얼 사용시 무지성으로

변수 위에  UPROPERTY()

함수 위에 UFUNCTION() 붙이기 

언리얼에선 저게 없으면 리플렉션 시스템이 감지를 못한다고함.



▶️ 액터와 그 접속 소유

한번 읽어보기 

멀티플레이어에서 서버의 역할에 대한 개요

 

728x90

댓글