Character가 어떻게 애니메이션이 동작하는지 보기위해서 Character에 할당된 ABP 클래스를 확인해보았다.
AnimGraph는 동작이 Output Pose로 나오는 로직이다.
복잡해 보이지만 찬찬히 살펴보면 다음과 같이 동작한다
캐시로 저장하고 불러오는건 아래의 방법을 통해 call
캐시된 로코모션에서 해당 Slot (예: "LowerBody")에만 애니메이션이 Slot을 실행하는 몽타주로 덮어져서 BodySplit_AnimBP 입력으로 들어감. 나머지 입력핀에는 캐시된 로코모션 애니메이션이 들어감.
이후 입력핀으로 들어가는 Animation이 적절하게 섞이는 작업을 BodySplit_AnimBP에서 할거임.
그리고 최종적으로 OutputPose로 들어가는 애니메이션이 우리가 보는 Animation.
Event Blueprint Update Animation은 애니메이션 블루프린트에서 매 틱마다 호출되는 이벤트이다. 주로 Anim Graph에 캐릭터의 현재 상태를 계산해서 애니메이션에 반영할 때 사용된다.
여기서는 캐릭터가 공중에 있는지 체크하는 bool 값과, 캐릭터의 speed 값을 가져오는 것을 볼 수 있다.
Idle/Run에는 Blend 1D 가 들어간다.
JumpStart의 Transition rule은 아까 EventGraph에서 도출한 Is in Air(bool) 값을 들고와서 판단한다.
JumpStart에서 JumpLoop로 넘어갈때 판단되는 Transition rule은 다음과 같다.
JumpStart 에서 쓰고있는 애니메이션이 ThirdPersonJump_Start이다. 해당 애니메이션 재생시간이 끝나갈 때 ( x < 0.1 ) Result에 True로 되면서 JumpLoop로 넘어간다.
마찬가지로 다시 Idle/Run BS 모션으로 넘어오기 위해서는 방금 기술한 방법의 반대로 적용됨.
이제 DefaultState 의 outpose는 BMMCSystem_AnimBP를 거쳐서 갱신된 Outpose로 나오게된다.
Event Blueprint Initialize Animain은 인스턴스가 처음 생성되어 바인딩될 때 한 번만 호출되는 초기화 함수이다.
해당 애님 인스턴스와 바인딩된 스켈레탈 매시 컴포넌트의 Owner 즉, Pawn객체를 포인터 형식으로 반환하고 Character로 캐스팅한 뒤 변수로 저장.
0.2초 Delay한 후 캐릭터의 ActorComponent(BPC CombatStateManager)를 들고옴. 그리고 유효성 체크
ActorComponent의 OnAnimationModeChanged 라는 델리게이트 이벤트에 바인딩.
ActorComponent에서 OnAnimationModeChanged가 호출이되면 AnimationSetChangedEvnet가 실행
애니메이션 Name을 가져옴.
DT CharacterLocomotion의 가져온 Name과 일치하는 Raw값 찾음.
찾으면 CurrentBaseLocomotion 에서 Combat Config를 변수로 promote
HoldState는 Enum타입 (Loop States Map의 Key값과 같음)
만약 None이 아니라면 True 실행 그리고 HoldState에서 값을 찾아서 True 실행한뒤 Locomotion과 LoopBlendSpace 변수로 저장
None이라면 Has Loop State = false 값으로 저장