목적: 선 엉킴 없이 점프(시작–체공–착지)와 기본 이동(Idle/Run)을 확장 가능한 구조로 만드는 방법을 정리



스테이트가 많아질수록 선이 복잡해짐 → “에일리어스”로 묶으면 한 점으로 정리 가능

연결선을 직접 늘리는 게 아니라 “들어올 수 있는 상태 집합”을 선언하는 개념

스테이트: 애니메이션 플레이 단위(Idle, Run, JumpStart, Fall, Land 등)
컨듀잇: if/switch 같은 분기 허브(1↔N, N↔N 가능)


들어오는 조건과 나가는 조건을 각각 정의해 흐름을 명확히
문제: 점프해도 이동속도 때문에 Run이 계속 실행됨 → 땅 위일 때만 Run 허용
1) AnimInstance 변수 추가

// PlayerDefaultAnimInstance.h
UPROPERTY(BlueprintReadOnly, Category="Movement")
bool mGround = false;

// PlayerDefaultAnimInstance.cpp (개념 예시)
void UPlayerDefaultAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
Super::NativeUpdateAnimation(DeltaSeconds);
APawn* Pawn = TryGetPawnOwner();
if (!Pawn) return;
ACharacter* Char = Cast<ACharacter>(Pawn);
if (!Char) return;
const UCharacterMovementComponent* Move = Char->GetCharacterMovement();
if (!Move) return;
mGround = Move->IsMovingOnGround(); // 또는 !Move->IsFalling()
}


























// PlayerDefaultAnimInstance.h
UPROPERTY(BlueprintReadOnly, Category="Movement")
bool mJump = false;
UFUNCTION(BlueprintCallable)
void SetJump(bool bIn) { mJump = bIn; }



// PlayerCharacter.h
UPROPERTY()
UPlayerDefaultAnimInstance* AnimInst = nullptr;
// PlayerCharacter.cpp
void APlayerCharacter::BeginPlay()
{
Super::BeginPlay();
AnimInst = Cast<UPlayerDefaultAnimInstance>(GetMesh()->GetAnimInstance());
}


void APlayerCharacter::JumpKey()
{
Jump(); // 실제 점프 실행
if (AnimInst) AnimInst->SetJump(true);
}
void APlayerCharacter::Landed(const FHitResult& Hit)
{
Super::Landed(Hit);
if (AnimInst) AnimInst->SetJump(false);
}










이 구성은 선이 적고, 전이 조건이 명확하며, 확장성(2단 점프, 점프 공격, 공중 대시 등)이 좋다. 이후 공중 공격을 추가해도 Jump 에일리어스 내부에서만 관리하면 외부 선은 깔끔하게 유지된다.