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์ ํต์ฌ ์ฒ๋ฆฌ ๋จ์