Event Graph
먼저 캐릭터 애니메이션 동작을 결정하기 위해 EventGraph에서 CharacterMovementComponent에서 정보들을 가져와 저장하는 과정을 거쳤다.
- Event BlueprintInitialize Animation: ABP가 초기화 될 때, 딱 한 번 호출되는 Event 메서드
- Get Owning Actor를 통해 현재 애니메이션이 적용되고 있는 Actor를 가져와 Character로 Casting
- Character를 통해 CharacterMovementComponent를 가져옴
- Character와 Character Movement를 변수로 저장
캐릭터의 이동속도, 움직이고 있는지, 공중에 있는지에 대한 정보를 변수로 저장하였다.
아래에서 각 정보를 어떻게 저장했는지 자세히 정리하였다.
캐릭터가 평면 상, 지면에서의 이동속도를 float 값으로 저장
- Character Movement에서 Get Velocity 노드를 통해 캐틱터의 속도를 Vector 값으로 불러옴
- 수평에서의 속도만 구할 것이기에, Vector Length XY 노드를 통해 Z축을 제외한 평면 상의 크기를 float값으로 저장하였다.
캐릭터의 월드 좌표 기준 Velocity를 로컬 좌표 기준으로 변환하여 방향을 계산하고, Yaw 값만 float로 저장
- Get Actor Transform 으로 캐릭터의 월드 Transform을 가져옴
- Get Velocity로 이동속도를 가져온다. 여기서 속도는 월드 좌표계 기준의 벡터가 반환됨을 의미하고 캐릭터가 이동하는 방향을 나타냄
- Inverse Transform Direction 노드는 Direction Vector를 월드 좌표계와 로컬좌표계간의 변환 처리를 하기 위해 사용함. 현재 월드 좌표 기준으로 어떤 위치와 회전 정보를 가지고 있는지 전달하기 위해 해당 핀을 연결하였고, 변환할 월드 좌표 기준으로 정의된 방향 벡터를 연결해주었다. return Value는 Actor(Character)의 로컬 좌표 기준으로 방향 벡터가 된다.
- 마지막으로 Rotation From X Vector 노드는 X축 방향(Forward Vector)를 기준으로 회전 값을 반환한다. 로컬 Direction Vector이 회전 값으로 반환되었고, Pin을 Split하여 Yaw값만 저장하였다.
반대로 로컬→월드 좌표로 방향 벡터를 변환하려면 Transform Direction 노드를 사용하면 된다.
캐릭터가 현재 움직이고 있는지 여부를 bool 값으로 저장
- Get Current Acceleration 노드로 캐릭터의 가속도가 있는지 확인
- Ground Speed의 값이 3.0f 보다 큰지 확인
- 이 두 bool 값이 모두 true로 나온다면 캐릭터는 움직이고 있는 상태를 의미하고, 이 결과를 Should Move에 저장
캐릭터가 현재 공중에 있는지 여부를 bool 값으로 저장
- Is Falling 노드를 사용하면 간편하게 현재 캐릭터가 공중에서 떨어지고 있는지를 반환
- 이 값을 Is Falling 변수에 저장
Animation Graph
Locomotion을 캐시에 저장하여 MainState에서 사용하였고, MainState에서 나온 포즈에 추가적인 가공을 하거나 Foot IK(지형에 맞게 발과 발 주변 뼈를 맞추는 기능)를 적용하기 위해 ControlRig를 사용하였다.
아래는 MainState 내부의 최종 모습이다.
Land State 내부의 모습인데, Locomotion의 캐시를 Base로 두고 Landing 애니메이션을 Blend 해주어, 지면에 착지했을 때 Locomotion으로 부드럽게 전환하게 해주었다.
To Falling과 To Land는 State Alias인데, 이것은 특정 State들을 그룹지어 별칭을 지어줄 수 있다.
대규모 StateMachine에서 여러 State들을 묶어 한 번에 관리할 때, 유용하다.
To Falling에는 Locomotion과 Land를 등록해주었고, To Land에는 Jump와 Fall Loop를 등록해주었다.
지면에서의 애니메이션과 공중에서의 애니메이션을 각각 묶어준 셈이다.
'내배캠 > Unreal Engine' 카테고리의 다른 글
Delegate (0) | 2025.01.23 |
---|---|
UPrimitiveComponent (0) | 2025.01.23 |
FMath::Sin 함수 사용해서 부유하는 느낌의 플랫폼 만들기 (0) | 2025.01.22 |
Enhanced Input System (0) | 2025.01.22 |
StaticClass( ) 메서드 (0) | 2025.01.22 |