개요
Lyra Sample Project에서 캐릭터 애니메이션을 어떻게 처리했는지 분석하면서 자연스러운 애니메이션 처리에 대해 공부해본다.
Animation Blueprint의 Comment를 #1부터 따라가면서 분석한다.
ABP_Mannequin_Base
AnimBP Tour #1
Lyra에서는 Animation Blueprint에서 어떤 로직도 처리하지 않는다고 한다.
이벤트 그래프의 로직은 Game Thread에서 실행되고 이벤트 틱마다 실행되므로 성능저하가 발생하기 때문
따라서 BlueprintTreadsafeUpdateAnimation function을 사용한다고 한다.
My Blueprint 탭에서 해당 내용을 볼 수 있다.
사용 데이터
보통 EventGraph에서는 애니메이션 제어에 사용할 정보를 추출(변수로 만들어서)하는 용도로 사용한다.
BlueprintTreadsafeUpdateAnimation function을 어떻게 구현 했는지 보단 어떤 정보들을 추출하는지를 중점으로 분석하자.
UpdateLocationData()
WorldLocation : 현재 Actor의 World Location
Displacement Since Last Update : 업데이트 전 World Location과 현재 World Location의 차이 -> 첫 프레임이면 0
Displacement Speed : DeltaTime(걸린 시간)으로 나눠줘 얻은 이번 Update에서의 속도 -> 첫 프레임이면 0
UpdateRotationData()
WorldRotation : 현재 Actor의 Rotation
Yaw Delta Since Last Update : 이전 Rotation과 현재 Rotation의 Yaw의 차이 -> 첫 프레임이면 0
Yaw Delta Speed : Yaw Delta Since Last Update / DeltaTime으로 얻은 순간 각속도
Additive Lean Angle : Yaw Delta Speed에 따른 기울어짐 정도 -> 첫 프레임이면 0
UpdataeVelocityData()
Was Moveing Last Update : 속도가 0이면 false
World Velocity : 3D 속도 -> 전체 월드에서 어느쪽으로 가는지
World Velocity 2D : X축 Y축으로의 속도
Local Velocity 2D : 2D 속도 ->실제 Actor를 기준으로 어느쪽으로 가는지
Local Velocity Direction Angle : 2D에서 Actor를 기준으로 움직이는 방향( -180(뒤) ~ -90(왼) ~ 0(앞) ~ 90(오른) ~ 180(뒤) )
Local Velocity Direction Angle with Offset : Local Velocity Direction Angle에서 Root Yaw Offset을 빼준 값 (?)
Local Velocity Direction: 이전 Enum값을 기준으로 Enum 으로 방향이 left, right, forward, backward 인지
Local Velocity Direction No Offset: 이전 Enum값을 기준으로 Enum 으로 방향이 left, right, forward, backward 인지
Has Velocity : Velocity의 Length가 0에 가까우면 false
World Velocity, Local Velocity 개념
만약 Actor를 Yaw로 45도 회전한 상태에서 Actor기준 앞으로 갈 때 로컬 Velocity는? -> 1, 0, 0
이를 월드 기준으로 본다면? -> 월드에서 봤을 땐 대각선으로 움직이는 것으로 보인다, 로컬 Velocity에서 45를 돌린 방향이 World Velocity, 0.5, 0.5, 0
만약 Actor를 Yaw로 45도 회전한 상태에서 월드 기준으로 앞으로 갈 때 월드 Velocity는? -> 1, 0, 0
이를 로컬 기준으로 본다면 -> Actor기준으로 -45도 방향으로 움직인다. 월드 Velocity에서 -45를 돌린 방향이 Local Velocity, 0.5, -0.5, 0
UpdateAccelerationData()
World Acceleration 2D : 월드 기준 가속도
Local Acceleration 2D : 로컬 기준 가속도
Has Acceleration : 가속도가 0에 가까우면 false
Pivot Direction 2D : (?) 피봇을 위해 구하는 값
Cardinal Direction from Acceleration : (?) 피봇을 위해 구하는 값
UpdateCharacterStateData
OnGround State
- IsOnGround : 땅에 있는지
Crouch State
- IsCrounching : 앉은 상태인지
- CrouchStateChanged : 이전과 비교해서 앉은 상태가 변화했는지
ADS State
- ADSStateChanged : 이전과 비교해서 조준 상태가 변화 했는지
- Was ADSLastUpdate : 현재 GamePlay Tag가 ADS인지
Fire State
- Tims Since Fired Weapon : Fire 상태에서 얼마나 시간이 지났는지
In Air State
- Is Jumping : Movement에서 Falling이며 z velocity가 0 이상
- Is Falling : Movement에서 Falling이며 z velocity가 0 이하
UpdateBlendWeightData()
Upperbody Dynamicc Additive Weight : Montage가 플레이 중이거나 OnGround이면 1, 0으로 보간
UpdateAimingData()
Aim Pitch : Aim의 피치값 (-180~ 180)
UpdateJumpFallData()
Time to Jump Apex : Jumping 이면 0, 최고점에 도달하는 시간 t = v0 / g(중력가속도) -> 현재 velocity에서 최고점까지 남은 시간
UpdateWallDetectionHeuristic
Is Running Into Wall : 벽으로 뛰어가고 있는지 bool값
AnimBP Tour #3
Anim Graph도 애니메이션을 직접 참조하지 않는다.
Montage와 Linked Animation Layer가 그래프의 특정 지점에서 플레이 하는 enry point만 지정
Anim Graph의 목적은 entry 포인트들을 blend하는 것
이 방식의 장점은 필요할 때 필요한 Montage와 Linked Animation Layer만 로드 가능
e.g B_WeaponInstance_Shotgun은 Montage와 Linked Animation Layer에 대한 참조 보유
B_WeaponInstance_Base는 무기를 위한 애니메이션 Layer를 링크해줌
<해석 추가하기>
'Unreal' 카테고리의 다른 글
[Unreal] Lyra - Slot 구조 (0) | 2025.01.28 |
---|---|
[Unreal] Lyra - Animation Layer Interface (0) | 2025.01.27 |
[Unreal C++] Game Flow (0) | 2025.01.23 |
[Unreal] DataTable (0) | 2025.01.22 |
[Unreal C++] Enhanced Input System (0) | 2025.01.21 |