#11 Strafe Movement with Evade
Coding/Devlog

#11 Strafe Movement with Evade

Root motion in blend space

  • 이 작업에서 가장 헤맸던 부분은 Evade 애니메이션을 Root Motion으로 재생해야 하는데, 4방향 밖에 없다는 것이었다. 45도나 135도는 물론, 패드까지 지원하려면 Blend Space를 써야한다. 문제는 Blend Space에 애니메이션을 넣어도 Root Motion이 적용되지 않는 것이었다. 정확히 말하면 애니메이션은 재생되는데, 위치는 움직일 수 없는 상태였다.
  • 문제는 AnimInstance의 Root Motion Mode 였다. Root Motion Mode는 다음 4가지다.
No Root Motion Extraction 루트 모션 추출 없음 - 루트 모션은 그대로 놔둡니다 (루트 본에 적용됩니다).
Ignore Root Motion 루트 모션 무시 - 루트 모션을 추출(하고 루트 본에서 제거)하지만, 캐릭터에 적용되지는 않습니다.
Root Motion from Everything 모든 것에서 루트 모션 - 아래 참고.
Root Motion from Montages Only 몽타주에서만 루트 모션 - 아래 참고.
  • 이 때 기본 RootMotion Mode는 Root Motion from Montages다. 몽타주로 실행된 루트모션만 적용하겠다는 뜻.
  • 이걸 계속 헤맸던건 이 옵션이 왜인지 AnimInstance의 Blueprint에 Details 패널에서 찾을 수 없었기 때문이다. 오류인지 뭔지 모르겠는데, 이 때문에 기존에 블루프린트에 올렸던 여러 코드들을 C++로 옮길 필요가 있었다.

AnimBlueprint to C++ Class

  • 원래 AnimBP의 Event Graph는 아래처럼 복잡했다.

AnimNotify와 변수 업데이트 등으로 복잡해진 이벤트 그래프

  • 이 노드들을 모두 C++ 코드로 옮겼다.
  • AnimInstance에서는 Update가 NativeUpdateAnimation(float DeltaSecons)로, BeginPlay는 NativeBeginPlay()로 이름이 바뀐다.
  • AnimNotify는 그냥 이름으로 엔진이 찾아다가 연결해준다. 그렇기 때문에 무조건 UFUNTION() 매크로를 달아놔야 한다.

// In Header file
UFUNCTION()
void AnimNotify_Anticipation();
  • 그 후, NativeBeginPlay()에 Root Motion Mode를 Root Motion From EveryThing으로 바꾼다.
RootMotionMode = ERootMotionMode::RootMotionFromEverything;

결과

 

'Coding > Devlog' 카테고리의 다른 글

#13 3번째 스프린트 수립  (0) 2022.03.14
#12 연속 공격 시스템 구현  (0) 2022.03.10
#10 lock on일 때, strafe movement 구현  (0) 2022.03.07
#9 스프린트 계획  (0) 2022.03.07
#8 타게팅 시스템 구현  (1) 2022.03.04