점프 애니메이션을 제어할 때 가장 중요한 것은 Jump 변수가 true → false로 바뀌는 타이밍이다.
지금은 true만 되고 false로 돌아가는 구간이 없어서, Idle로 돌아가지 못하고 점프 모션이 계속 반복되는 문제가 생긴다.
// 점프 입력 처리 (JumpKey 함수)
void APlayerCharacter::JumpKey(const FInputActionValue& Value)
{
// CanJump() : 캐릭터가 점프 가능한 상태인지 판별해준다.
if (CanJump())
{
mAnimInst->Jump(); // 애니메이션 인스턴스에서 점프 시작 처리
Jump(); // 캐릭터 점프 실행 (ACharacter 기본 함수)
}
}
현재는 Jump가 false가 되는 부분이 없다.
즉, 점프 키를 누르는 순간 true가 되고 계속 유지되기 때문에, 점프 모션에서 빠져나오지 못한다.
→ 키 입력 직후 바로 true가 되어서 JumpStart 모션이 반복 중인 모습.
알림 이벤트를 노티파이(Notify) 라고 부른다.
노티파이는 트랜지션(Transition) 뿐 아니라 애니메이션 시퀀스에도 넣을 수 있다.
→ 원하는 타이밍에 노티파이를 넣을 수 있다.
→ 애니메이션 시퀀스에 직접 지정 가능.
트랜지션에서도 이벤트를 지정할 수 있다.
→ 트랜지션 이벤트를 만들면 이벤트 그래프에서 보인다 (블루프린트 사용 시).
// AnimNotify_JumpStart 함수 구현 예시
// 애니메이션 Notify에서 호출되는 함수 (함수 이름 규칙: AnimNotify_XXXX)
void UPlayerDefaultAnimInstance::AnimNotify_JumpStart()
{
UE_LOG(LogGameInfo, Warning, TEXT("JumpStart Notify Triggered"));
// 점프 애니메이션이 끝나는 시점에서 Jump 플래그를 false로 돌려준다.
mJump = false;
}
→ 이렇게 해야 점프가 끝나면 다시 Idle로 복귀할 수 있다.
// GameInfo.h
#pragma once
#include "Engine.h"
#include "GameInfo.generated.h"
// 로그 카테고리 선언 (LogGameInfo라는 이름으로 사용 가능)
DECLARE_LOG_CATEGORY_EXTERN(LogGameInfo, Log, All);
// GameInfo.cpp
#include "GameInfo.h"
// 로그 카테고리 정의
DEFINE_LOG_CATEGORY(LogGameInfo);
→ 이제 어디서든 UE_LOG(LogGameInfo, Warning, TEXT("메시지")); 형태로 출력 가능하다.
// PlayerDefaultAnimInstance.cpp
void UPlayerDefaultAnimInstance::Jump()
{
UE_LOG(LogGameInfo, Warning, TEXT("Jump 함수 호출됨"));
mJump = true; // 점프 시작 시 true로 변경
}
Jump → Fall 규칙
Jump → JumpStart 규칙 (커스텀 이벤트 활용)
AnimNotify_JumpStart()에서 반드시 mJump = false; 처리해야 한다.
→ 이렇게 해야 점프가 끝나면 다시 Idle로 복귀 가능하다.
공격 모션은 트랜지션으로도 제어할 수 있지만, 보통은 **애니메이션 몽타주(Montage)**를 이용해서 처리한다.
보라색 = 애니메이션 몽타주
몽타주는 블루프린트에 직접 배치 불가 → 코드로 실행해야 한다.
// 애님인스턴스에서 몽타주 실행하기
void UPlayerDefaultAnimInstance::PlayAttackMontage()
{
if (AttackMontage) // UPROPERTY로 세팅한 공격 몽타주
{
Montage_Play(AttackMontage); // 공격 모션 재생
}
}
→ 트랜지션 대신 코드에서 세밀하게 제어할 수 있어, 연속 공격이나 콤보 시스템 구현에 적합하다.