AnimBP Logic 해체분석

정혜창·2025년 4월 3일
0

내일배움캠프

목록 보기
41/43

Character가 어떻게 애니메이션이 동작하는지 보기위해서 Character에 할당된 ABP 클래스를 확인해보았다.

🎮 ThirdPerson_AnimBP

1️⃣ AnimGraph

AnimGraph는 동작이 Output Pose로 나오는 로직이다.

  • 복잡해 보이지만 찬찬히 살펴보면 다음과 같이 동작한다

    • Default State의 StateMachine 에서 Animation이 나옴
    • 여기서 BMMCSystem ABP를 거쳐서 Animation이 나옴.
    • 최종적으로 나오는 Animation이 Locomotion 이라는 이름의 캐시로 저장된다.
  • 캐시로 저장하고 불러오는건 아래의 방법을 통해 call

  • 캐시된 로코모션에서 해당 Slot (예: "LowerBody")에만 애니메이션이 Slot을 실행하는 몽타주로 덮어져서 BodySplit_AnimBP 입력으로 들어감. 나머지 입력핀에는 캐시된 로코모션 애니메이션이 들어감.

  • 이후 입력핀으로 들어가는 Animation이 적절하게 섞이는 작업을 BodySplit_AnimBP에서 할거임.

  • 그리고 최종적으로 OutputPose로 들어가는 애니메이션이 우리가 보는 Animation.

2️⃣ Event Graph

  • Event Blueprint Update Animation은 애니메이션 블루프린트에서 매 틱마다 호출되는 이벤트이다. 주로 Anim Graph에 캐릭터의 현재 상태를 계산해서 애니메이션에 반영할 때 사용된다.

    • 주로 캐릭터를 현재 상태를 가져오는 용도로 많이 씀
  • 여기서는 캐릭터가 공중에 있는지 체크하는 bool 값과, 캐릭터의 speed 값을 가져오는 것을 볼 수 있다.

3️⃣ State Machine (Default State)

  • Idle/Run에는 Blend 1D 가 들어간다.

  • JumpStart의 Transition rule은 아까 EventGraph에서 도출한 Is in Air(bool) 값을 들고와서 판단한다.

    • 만약 공중이면 Is in Air 값이 True로 되고 Transition Result 값 또한 True로 되면서 Jump Start 스테이트로 넘어가게 된다.
  • JumpStart에서 JumpLoop로 넘어갈때 판단되는 Transition rule은 다음과 같다.

  • JumpStart 에서 쓰고있는 애니메이션이 ThirdPersonJump_Start이다. 해당 애니메이션 재생시간이 끝나갈 때 ( x < 0.1 ) Result에 True로 되면서 JumpLoop로 넘어간다.

  • 마찬가지로 다시 Idle/Run BS 모션으로 넘어오기 위해서는 방금 기술한 방법의 반대로 적용됨.

🎮 BMMCSystem_AnimBP

이제 DefaultState 의 outpose는 BMMCSystem_AnimBP를 거쳐서 갱신된 Outpose로 나오게된다.

1️⃣ EventGraph

👉 Event Bluprint Initialize Animation

📌 전반부

  • 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 값으로 저장

👉 Event Bluprint Update Animation

📌 전반부

  • 캐릭터의 무브먼트 컴포넌트를 들고와서 공중에 있는지 체크하고 속도를 가져옴

📌후반부

  • 캐릭터로 부터 Lock on 되어있는지 ActorComponent를 통해서 가져오고 AimOffset을 계산.
profile
Unreal 1기

0개의 댓글

관련 채용 정보