▶️ 애니메이션 몽타주
- 몽타주 : 여러가지의 애니메이션 에셋을 하나의 에셋으로 결합
- 이걸 통해 우리는 블루프린트나 코드를 통해
- 여러가지 애니메이션을 동적으로 제어할 수 있다.
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() 붙이기
언리얼에선 저게 없으면 리플렉션 시스템이 감지를 못한다고함.
▶️ 액터와 그 접속 소유
한번 읽어보기
멀티플레이어에서 서버의 역할에 대한 개요
'Unreal Engine5 > KDT 2024' 카테고리의 다른 글
[UE5 KDT2024] 18. 애니메이션 동기화 (0) | 2025.03.02 |
---|---|
[UE5 KDT2024] 17. 애니메이션 몽타주2 (0) | 2025.03.01 |
[UE5 KDT2024] 15. RPC (0) | 2025.02.27 |
[UE5 KDT2024] 14. 애니메이션 블랜드 스페이스 (0) | 2025.02.26 |
[UE5 KDT2024] 13. 월드셋팅 (0) | 2025.02.25 |
댓글