Unreal에서는 animation을 anim이라고 줄여부른다
전체 구조
USkeletalMeshComponent
│
▼
UAnimInstance
│
▼
FAnimNode_StateMachine ──── (State A: FAnimNode_SequencePlayer)
│
└──── (State B: FAnimNode_SequencePlayer)
│
▼
FAnimNode_SequencePlayer
│
▼
UAnimSequence
│
▼
USkeleton
UAnimInstance
개요
UAnimInstance는 SkeletalMeshComponent가 사용하는 애니메이션 실행 로직의 핵심 컨트롤러이다.
UAnimInstance는 AnimGraph를 실행해서 StateMachine의 Play/Blend Nodes를 업데이트하고 최종 Bone Pose를 계산해 SkeletalMeshComponent에 전달한다.
기능
AnimGraph 실행
언리얼의 애니메이션은 모든 플레이·블렌드 로직이 AnimGraph(FAnimNode_*) 안에 들어있다.
UAnimInstance는 그 AnimGraph를 다음 순서로 실행한다:
Update Phase → Evaluate Phase
Update Phase
시간 흐름에 따라 상태 업데이트.
- StateMachine 트랜지션 평가
- SequencePlayer 시간 업데이트
- Blend 노드 업데이트
- 매 프레임 파라미터 업데이트
void UAnimInstance::NativeUpdateAnimation(float DeltaSeconds);→ AnimGraph 내부의 모든 Update()를 호출하는 시작점.
Evaluate Phase
최종 Bone Pose 생성.
- 현재 StateMachine의 활성 노드 Evaluate()
- SequencePlayer에서 BonePose 샘플
- 블렌드 처리
- Component Space 변환 (단순화 가능)
void UAnimInstance::NativeEvaluateAnimation(FPoseContext& Output);→ 엔진이 최종 Bone Transform 배열을 얻는 단계.
Animation StateMachine의 Host
AnimGraph에는 StateMachine이 존재하지만,
StateMachine을 매 프레임 갱신하는 주체는 UAnimInstance이다.
UAnimInstance는 다음을 관리한다:
- 현재 상태가 무엇인지 유지
- 전환(Transition) 조건 평가
- 스테이트 안의 SequencePlayer 업데이트
즉,
StateMachine.ExecuteUpdate()
StateMachine.ExecuteEvaluate()를 UAnimInstance가 실행한다.
애니메이션 파라미터 관리 (Speed, IsJumping, Direction 등)
언리얼 블루프린트에서 다음과 같은 변수를 만들 수 있다:
- Speed
- IsFalling
- Direction
- bIsJumping
- AimYaw, AimPitch
이 변수들은 Animation StateMachine의 트랜지션 조건에 쓰인다.
이 파라미터를 업데이트하는 함수가 바로:
void UAnimInstance::NativeUpdateAnimation(float DeltaSeconds);과제에서는 여기에 “애니메이션 파라미터 업데이트 로직”을 넣어주면 된다.
예시
Speed = OwnerCharacter->GetVelocity().Size();
IsInAir = OwnerCharacter->MovementComponent->IsFalling();Animation Notify 처리
언리얼에서는 애니메이션에 노티파이가 추가되면, UAnimInstance가 이를 처리한다:
- 타격 판정
- 발자국 소리
- 이벤트 콜백
AnimMontage 처리(생략 가능)
공격/스킬 같은 애니메이션 할 때 쓰는 시스템.
- 루트모션
- 섹션 이동
- 몽타주 블렌드
네트워크 동기화(Replication) 처리(생략 확정)
언리얼은 애니메이션 상태를 네트워킹하려면 별도 로직이 필요하지만,
이 역시 UAnimInstance가 중심.
Evaluate란?
Update가 DeltaTIme을 업데이트하고, Transition 조건 확인, Parameter 업데이트 등의 기능 등을 수행한다면 Evaluate는
==현재 활성 상태/SequencePlayer/Blend 노드 등을 실제로 실행하여
최종 본 변환 배열(Bone Pose)을 만들어내는 단계이다.==
따라서 Evaluate는 최종 출력 Pose를 만들어내는 함수이다.
언리얼은 모든 애니메이션 노드가 다음 메서드를 가진다:
void Evaluate(FPoseContext& Output)이 Evaluate가 호출되면:
SequencePlayer →
애니메이션 샘플링 Blend →
포즈 블렌딩 StateMachine →
현재 Active Node Evaluate 호출
그리고 마지막에 FPoseContext.Output이 “현재 캐릭터의 최종 본 포즈 배열”이 된다.
FAnimNode_StateMachine
개요
언리얼 애니메이션 그래프 안에 있는 상태머신 노드.
주요 역할:
- 현재 State 유지
- Transition 조건 평가 (Update 단계)
- Active State의 AnimGraph 노드를 Evaluate하여 최종 Pose 생성 (Evaluate 단계)
기능
StateMachine Update (Transition 계산)
Update 단계에서는 “현재 State 유지 → 조건 평가 → 전환 여부 체크” 를 수행한다.
Transition 조건 평가
void Update_AnyThread(const FAnimationUpdateContext& Context)역할:
- 상태머신의 모든 transition rule을 업데이트함
- 각 State 노드의 Update()도 호출
- Transition 조건(bool) 판단
- 조건 충족 시 Active State 변경
설명:
애니메이션 Update 단계는 게임프레임과 동일하게 호출되며,
상태머신은 이 시점에 “어떤 State로 넘어가야 하는지”를 결정한다.
State 변경 로직 내부 함수
bool ChangeState(int32 NewStateIndex, const FAnimationUpdateContext& Context)반환: bool (전환 성공 여부)
역할:
- 조건 충족 시 새로운 State로 전환
- StateBegin/StateEnd Notify 호출
- Internal State Time 초기화
Transition 가능 여부 판단
bool CanEnterTransition(int32 TransitionIndex)
반환: bool
역할:
- Transition이 가능한지 rule 검사 (Transition Rule 노드에서 계산된 조건 기반)
Transition Rule 실행
bool EvaluateTransition(int32 TransitionIndex, const FAnimationUpdateContext& Context)
반환: bool
역할:
- Blueprint/Native 애님 그래프에 정의된 Transition Rule 실행
- 조건 결과 반환
StateMachine Evaluate (현재 State의 Pose 생성)
Transition은 Update에서 하고, Evaluate는 실제 Pose를 만든다.
현재 State Evaluate
void Evaluate_AnyThread(FPoseContext& Output)
반환: void
역할:
- 현재 활성화된 State의 AnimNode Evaluate 호출
- State 노드의 Evaluate 결과를 최종 Pose로 Output에 넣음
설명:
StateMachine 스스로는 Pose를 만들지 않고, 현재 State가 가진 Root AnimNode가 Pose를 만든다.
각 State의 blend 처리
(BlendTransition AnimNode 포함 시) 아래 같은 함수가 내부적으로 호출됨:
void EvaluateTransitionPose(FPoseContext& Output)반환: void
역할:
- Transition 중이면 이전 State Pose / 새 State Pose / Blend Alpha 기반으로 포즈 블렌딩 처리
State Begin / End Notify 처리
상태 전환에 따라 Notify 호출이 발생한다.
State 시작
void OnStateEntered(int32 StateIndex, const FAnimationUpdateContext& Context)반환: void
역할:
- StateBegin 애님 노티파이 실행
- State 전용 변수 초기화
State 종료
void OnStateExited(int32 StateIndex, const FAnimationUpdateContext& Context)반환: void
역할:
- StateEnd 애님 노티파이 실행
StateMachine 정보 조회
✔ 현재 Active State Index 가져오기
int32 GetCurrentState()
반환: int32
역할: 현재 활성화된 State index 리턴
✔ 현재 State 체류 시간
float GetCurrentStateElapsedTime()
반환: float
역할:
-
활성 State에 머문 시간
-
Transition 조건에서 많이 사용됨
✔ State 갯수
int32 GetStateCount()
반환: int32
🟦 5) Transition Blend 처리
Transition Blend는 중간 블렌드 상태에 있는 애니메이션을 조합하는 부분.
✔ BlendAlpha 계산
float ComputeTransitionBlendTime(const FAnimationUpdateContext& Context)
반환: float
역할: Transition 중 현재 blend alpha 반환
✔ Blend Evaluate
void EvaluateTransition(int32 TransitionIndex, FPoseContext& Output)
반환: void
역할:
-
이전 State Pose + Target State Pose 조합
-
Alpha 활용하여 최종 Pose 계산
🟥 Update / Evaluate 처리 순서 (정확한 전체 흐름)
Update Phase
------------------------
StateMachine.Update()
→ 각 State.Update()
→ Transition Rule Evaluate()
→ ChangeState()
Evaluate Phase
------------------------
StateMachine.Evaluate()
→ Active State.Evaluate()
→ If Transition: Blend Evaluate()
→ Output = 최종 Pose
🟥 최종 요약
FAnimNode_StateMachine은 Update 단계에서 전환(Transition) 논리를 평가하고,
Evaluate 단계에서 현재 State의 AnimNode를 Evaluate하여 Pose(본 배열)를 생성한다.
원하면 다음 클래스도 같은 형식으로 정리해줄게:
-
FAnimNode_SequencePlayer -
UAnimSequence -
USkeleton -
USkeletalMeshComponent
어떤 것을 다음으로 볼까?