Animation ๊ฐ„ ์ „ํ™˜


๐Ÿ“˜ FAnimStateTransition โ€” Cheat Sheet


๐ŸŸฆ 1. ํ—ค๋” ํŒŒ์ผ ์˜์‚ฌ ์ฝ”๋“œ

// ============================================================================
// FAnimStateTransition (์˜์‚ฌ ์ฝ”๋“œ)
// AnimStateMachine ๋‚ด State ๊ฐ„ Transition ์ •๋ณด ๊ด€๋ฆฌ
// Condition, BlendTime, Source/Target State๋ฅผ ํฌํ•จ
// ============================================================================
struct FAnimStateTransition
{
public:
 
    // ------------------------------------------------------------------------
    // Transition ์ด๋ฆ„
    // ๋””๋ฒ„๊น…์šฉ, ์œ ๋‹ˆํฌ ์‹๋ณ„์ž
    // ------------------------------------------------------------------------
    FName TransitionName;
 
    // ------------------------------------------------------------------------
    // Source / Target State
    // Transition ์ถœ๋ฐœ ์ƒํƒœ์™€ ๋„์ฐฉ ์ƒํƒœ ํฌ์ธํ„ฐ
    // ------------------------------------------------------------------------
    struct FAnimState* SourceState;
    struct FAnimState* TargetState;
 
    // ------------------------------------------------------------------------
    // Transition ์กฐ๊ฑด
    // true๊ฐ€ ๋˜๋ฉด Transition ๋ฐœ๋™
    // ------------------------------------------------------------------------
    std::function<bool()> CanEnterTransition;
 
    // ------------------------------------------------------------------------
    // Transition ๋ธ”๋ Œ๋”ฉ ์‹œ๊ฐ„
    // ActiveState Pose -> TargetState Pose๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ Blend
    // ------------------------------------------------------------------------
    float BlendTime = 0.2f;
 
    // ------------------------------------------------------------------------
    // Interrupt ์˜ต์…˜
    // ๋‹ค๋ฅธ Transition์œผ๋กœ ์ค‘๋‹จ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€
    // ------------------------------------------------------------------------
    bool bCanInterrupt = true;
 
    // ------------------------------------------------------------------------
    // Transition ์ง„ํ–‰ ์ƒํƒœ
    // BlendAlpha: 0.0 = SourcePose, 1.0 = TargetPose
    // ------------------------------------------------------------------------
    float BlendAlpha = 0.0f;
 
public:
 
    // ------------------------------------------------------------------------
    // Update
    // DeltaTime ๊ธฐ๋ฐ˜์œผ๋กœ BlendAlpha ๊ณ„์‚ฐ
    // Condition ํ‰๊ฐ€ ํ›„ Blend ์ง„ํ–‰
    // ------------------------------------------------------------------------
    void Update(float DeltaTime)
    {
        if (CanEnterTransition && CanEnterTransition())
        {
            BlendAlpha += DeltaTime / BlendTime;
            if (BlendAlpha > 1.f)
                BlendAlpha = 1.f;
        }
        else
        {
            BlendAlpha = 0.f;
        }
    }
 
    // ------------------------------------------------------------------------
    // Evaluate
    // SourcePose์™€ TargetPose๋ฅผ BlendAlpha ๊ธฐ์ค€์œผ๋กœ ๋ณด๊ฐ„
    // ------------------------------------------------------------------------
    FPose Evaluate(const FPose& SourcePose, const FPose& TargetPose)
    {
        return FPose::Blend(SourcePose, TargetPose, BlendAlpha);
    }
};

๐ŸŸฆ 2. ํ•ต์‹ฌ ์—ญํ•  ์š”์•ฝ

๊ธฐ๋Šฅ์„ค๋ช…
Source/Target State ๊ด€๋ฆฌ์–ด๋А ์ƒํƒœ์—์„œ ์–ด๋А ์ƒํƒœ๋กœ ์ „ํ™˜๋ ์ง€ ์ €์žฅ
Transition ์กฐ๊ฑด ํ‰๊ฐ€CanEnterTransition ํ•จ์ˆ˜๋กœ true/false ํŒ๋‹จ
Blend ๊ณ„์‚ฐBlendTime ๋™์•ˆ Pose๋ฅผ ๋ณด๊ฐ„ํ•˜์—ฌ ์ž์—ฐ์Šค๋Ÿฌ์šด ์ „ํ™˜
Interrupt ์ฒ˜๋ฆฌ๋‹ค๋ฅธ Transition์œผ๋กœ ์ค‘๋‹จ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€ ๊ด€๋ฆฌ
Transition ์ง„ํ–‰ ์ƒํƒœ ์ €์žฅBlendAlpha 0~1, ํ˜„์žฌ Transition ์ง„ํ–‰๋ฅ 

๐ŸŸฆ 3. ๊ธฐ๋Šฅ๋ณ„ ์ƒ์„ธ ์„ค๋ช…

๐Ÿ”น Condition ํ‰๊ฐ€

bool bTrigger = CanEnterTransition();
  • true โ†’ Transition ๋ฐœ๋™ ์‹œ์ž‘

  • false โ†’ ํ˜„์žฌ ์ƒํƒœ ์œ ์ง€

๐Ÿ”น Blend ๊ณ„์‚ฐ

BlendAlpha += DeltaTime / BlendTime;
BlendAlpha = FMath::Clamp(BlendAlpha, 0.f, 1.f);
  • 0 โ†’ SourcePose

  • 1 โ†’ TargetPose

  • Evaluate ์‹œ BlendAlpha ๊ธฐ์ค€์œผ๋กœ Pose ๋ณด๊ฐ„

๐Ÿ”น Evaluate

FPose ResultPose = FPose::Blend(SourcePose, TargetPose, BlendAlpha);
  • Transition ํ™œ์„ฑ ์‹œ Source์™€ Target Pose๋ฅผ ๋ณด๊ฐ„

  • AnimGraph Evaluate ๋‹จ๊ณ„์—์„œ ํ˜ธ์ถœ๋จ


๐ŸŸฆ 4. ASM Update/Evaluate์—์„œ์˜ ์œ„์น˜

FAnimNode_StateMachine.Update():
    โ””โ”€ CurrentActiveState.Transitions:
            โ””โ”€ FAnimStateTransition.Update(DeltaTime)
                โ””โ”€ Condition ์ฒดํฌ
                โ””โ”€ BlendAlpha ๊ณ„์‚ฐ

FAnimNode_StateMachine.Evaluate():
    โ””โ”€ ActiveState Pose
    โ””โ”€ BlendAlpha>0 โ†’ Evaluate(SourcePose, TargetPose)
    โ””โ”€ ์ตœ์ข… Pose ์ถœ๋ ฅ

๐ŸŸฆ 5. ์š”์•ฝ

  • FAnimStateTransition = StateMachine ๋‚ด ์ƒํƒœ ์ „ํ™˜ ๋‹จ์œ„

  • Condition ํ‰๊ฐ€, BlendTime ์ฒ˜๋ฆฌ, ActiveState โ†’ TargetState Pose ๋ณด๊ฐ„์„ ๋‹ด๋‹น

  • Transition ์ž์ฒด๋Š” ๊ตฌ์กฐ์ฒด๋กœ ์กด์žฌํ•˜๋ฉฐ, ์‹ค์ œ Pose ๋ธ”๋ Œ๋”ฉ์€ Evaluate์—์„œ ์ฒ˜๋ฆฌ

  • ASM์—์„œ Transition CRUD ๋ฐ Update/Evaluate์˜ ํ•ต์‹ฌ ์ฒ˜๋ฆฌ ๋‹จ์œ„