State Machine과 전이 규칙
AnimState, Transition Rule, Conduit, Blend 설정의 내부 동작과 실전 패턴을 분석합니다.
State Machine 아키텍처
FAnimNode_StateMachine의 구조와 상태 전이 평가 메커니즘
AnimGraph의 State Machine은 내부적으로 FAnimNode_StateMachine으로 구현됩니다. 각 상태(State)는 독립적인 AnimGraph 서브 트리를 포함하며, 전이 규칙(Transition Rule)에 의해 상태 간 이동을 제어합니다.
전이 중에는 소스 상태와 타겟 상태가 동시에 평가되어 블렌딩됩니다. 전이가 완료되면 소스 상태의 웨이트가 0이 되어 더 이상 평가되지 않습니다. 이 때문에 전이 중에는 두 상태의 AnimGraph가 모두 실행되어 일시적으로 평가 비용이 증가합니다.
Transition Rule과 Blend 설정
전이 조건, 블렌드 시간, 블렌드 모드의 세부 설정
| 설정 | 설명 | 기본값 |
|---|---|---|
| Blend Duration | 전이 블렌딩에 소요되는 시간(초) | 0.2 |
| Blend Mode | Standard(시간 기반), Custom(커브 기반) | Standard |
| Logic Type | And(모든 조건 충족), Or(하나라도 충족) | And |
| Priority Order | 같은 상태에서 여러 전이가 가능할 때 우선순위 | 0 (높을수록 우선) |
| Bidirectional | 양방향 전이 허용 여부 | false |
| Automatic Rule Based on Sequence | 시퀀스 종료 시 자동 전이 | false |
// C++에서 전이 조건 노출
UCLASS()
class UMyAnimInstance : public UAnimInstance
{
// AnimBP Transition Rule에서 사용할 프로퍼티
UPROPERTY(BlueprintReadOnly, Category = "Transition")
bool bShouldTransitionToWalk = false;
virtual void NativeUpdateAnimation(float DeltaSeconds) override
{
Super::NativeUpdateAnimation(DeltaSeconds);
// 조건 계산
float Speed = GetOwningActor()->GetVelocity().Size2D();
bShouldTransitionToWalk = Speed > MoveThreshold;
}
};
// Blueprint Transition Rule에서:
// "Can Enter Transition" → bShouldTransitionToWalk 반환
UE5에서는 전통적인 크로스페이드 대신 Inertialization 블렌드를 사용할 수 있습니다. Transition의 Blend Logic을 "Inertialization"으로 설정하면, 소스 포즈의 관성을 유지하면서 타겟 포즈로 전이합니다. 소스 상태를 추가 평가하지 않아 성능이 우수하며, 더 자연스러운 전이를 만들어냅니다.
Conduit와 고급 전이 패턴
Conduit 노드를 활용한 복잡한 전이 그래프 설계
Conduit는 전이 그래프에서 분기점 역할을 하는 특수 노드입니다. 상태가 아니라 전이 조건을 묶는 허브로, 복잡한 전이 로직을 깔끔하게 정리할 수 있습니다.
Entry Rule
Conduit 진입 조건. 이 조건이 true일 때만 Conduit에서 나가는 전이가 평가됩니다.
Transition Interrupt
진행 중인 전이를 새 전이가 중단할 수 있는 설정. 긴급 상태 전환(피격, 사망)에 유용합니다.
Custom Blend Graph
전이별로 커스텀 블렌드 그래프를 지정하여, 커브 애셋으로 블렌딩 프로파일을 제어합니다.
Sync Group
전이 전후 상태의 애니메이션이 같은 Sync Group에 속하면 페이즈를 동기화하여 매끄럽게 이어집니다.
실전 State Machine 설계
3인칭 캐릭터 Locomotion State Machine 설계 예시
상태 수 최소화: 과도한 상태는 전이 규칙 평가 비용을 증가시킵니다. Blend Space로 연속적인 움직임을 표현하고, State Machine은 이산적인 모드 전환에만 사용하세요. 또한, 중첩 State Machine으로 관심사를 분리하면 유지보수가 쉬워집니다 (예: Locomotion SM + Combat SM + Overlay SM).
// State Entry/Exit 이벤트 활용
void UMyAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
Super::NativeUpdateAnimation(DeltaSeconds);
// State Machine에서 현재 상태 이름 가져오기
FName CurrentStateName = GetCurrentStateName(0); // Machine Index 0
// 상태 기반 로직
if (CurrentStateName == FName("Jump"))
{
// 점프 상태 전용 로직
JumpBlendWeight = FMath::FInterpTo(
JumpBlendWeight, 1.f, DeltaSeconds, 5.f);
}
}
핵심 요약
- State Machine은 FAnimNode_StateMachine으로 구현되며, 각 상태는 독립 AnimGraph를, 전이는 조건과 블렌딩 설정을 가진다.
- 전이 중에는 소스와 타겟 상태가 동시 평가되므로, 전이 시간이 길수록 비용이 증가한다.
- Inertialization 블렌드는 소스 상태 추가 평가 없이 관성 기반 전이를 수행하여 성능이 우수하다.
- Conduit는 분기 허브로 복잡한 전이 그래프를 정리하는 데 유용하다.
- State Machine은 이산적 모드 전환에만 사용하고, 연속 움직임은 Blend Space로 표현하는 것이 효율적이다.
도전 과제
배운 내용을 직접 실습해보세요
Idle, Walk, Run, Jump 4개의 State를 가진 Locomotion State Machine을 만드세요. Speed 변수 기반으로 Idle ↔ Walk ↔ Run 전이 규칙을 설정하고, IsFalling으로 Jump State 진입/탈출을 구현하세요. 각 전이에 Cross Fade Duration을 0.2초로 설정하세요.
Conduit 노드를 추가하여 여러 State에서 Death State로의 공통 전이를 하나로 통합하세요. Transition Rule에서 Time Remaining (ratio)을 사용하여 애니메이션 종료 시점에 자동 전환되는 패턴도 구현하세요.
전투 시 상체만 별도 State Machine으로 관리하는 Layered Blend per Bone 패턴을 구현하세요. 하체는 Locomotion SM, 상체는 Combat SM(Idle, Attack, Block)을 사용하고, spine_01 기준으로 분리하여 동시 재생하세요.