애니메이션 노티파이

DevBison·2025년 8월 28일

점프 애니메이션 제어와 AnimNotify 활용

점프 애니메이션을 제어할 때 가장 중요한 것은 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) 개념

알림 이벤트를 노티파이(Notify) 라고 부른다.
노티파이는 트랜지션(Transition) 뿐 아니라 애니메이션 시퀀스에도 넣을 수 있다.

→ 원하는 타이밍에 노티파이를 넣을 수 있다.

→ 애니메이션 시퀀스에 직접 지정 가능.


트랜지션 이벤트 사용

트랜지션에서도 이벤트를 지정할 수 있다.

→ 트랜지션 이벤트를 만들면 이벤트 그래프에서 보인다 (블루프린트 사용 시).


C++에서 AnimNotify 구현

// 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("메시지")); 형태로 출력 가능하다.


애님인스턴스 Jump 함수 구현

// PlayerDefaultAnimInstance.cpp
void UPlayerDefaultAnimInstance::Jump()
{
    UE_LOG(LogGameInfo, Warning, TEXT("Jump 함수 호출됨"));
    mJump = true; // 점프 시작 시 true로 변경
}

전환 규칙 예시

Jump → Fall 규칙

Jump → JumpStart 규칙 (커스텀 이벤트 활용)


핵심 포인트: JumpStart Notify

AnimNotify_JumpStart()에서 반드시 mJump = false; 처리해야 한다.
→ 이렇게 해야 점프가 끝나면 다시 Idle로 복귀 가능하다.


공격 모션과 점프 모션 관계

공격 모션은 트랜지션으로도 제어할 수 있지만, 보통은 **애니메이션 몽타주(Montage)**를 이용해서 처리한다.

보라색 = 애니메이션 몽타주

몽타주는 블루프린트에 직접 배치 불가 → 코드로 실행해야 한다.

// 애님인스턴스에서 몽타주 실행하기
void UPlayerDefaultAnimInstance::PlayAttackMontage()
{
    if (AttackMontage) // UPROPERTY로 세팅한 공격 몽타주
    {
        Montage_Play(AttackMontage); // 공격 모션 재생
    }
}

→ 트랜지션 대신 코드에서 세밀하게 제어할 수 있어, 연속 공격이나 콤보 시스템 구현에 적합하다.


모션 충돌 처리

  • 점프 중에 공격 → 공격 모션이 캔슬되고 점프만 나올 수 있음
  • 섞어 쓸지, 하나만 쓸지 게임 디자인에 따라 결정
  • 캔슬을 허용한다면 이동도 멈춰야 자연스럽다 (달리는 모션과 공격 모션이 섞이지 않도록)

정리

  1. Jump 상태는 입력 시 true → Notify 시점에서 false로 돌려줘야 한다.
  2. AnimNotify는 애니메이션 시퀀스, 트랜지션 양쪽에 추가할 수 있다.
  3. UE_LOG를 활용해 디버깅하면 상태 변화 추적이 편하다.
  4. 공격 모션은 Montage로 관리하면 확장성이 좋다.
  5. 점프와 공격 모션 충돌은 게임 룰에 맞게 설계해야 한다.

profile
응애 개발자

0개의 댓글