본문 바로가기

언리얼엔진

23. 블렌드 스페이스(8방향) / Calculate Direction

무기 장비 시 기본자세 변경하기를 이어서 하겠다.

 

무기 장비한 상태의 Idle, Walk, Run 애니메이션을 보면 각각 8방향 애니메이션이 있는 것을 볼 수 있다.

이를 활용하기 위해서 블렌드 스페이스(1D가 아닌 기본2D를 사용)를 활용할 것이다.(BS_Sword)

 

애니메이션은 왠만하면 8방향 애니메이션을 사용하자. 4방향은 블렌드스페이스에서 보간 시 어색해질 수도 있다.

 

※ 블렌드 스페이스를 1D가 아닌 2D를 쓰는 이유? 무기장비 시 카메라 시점으로 캐릭터 방향을 고정시킬 것이기 때문이다.


블렌드 스페이스 2D를 이용한 8방향 애니메이션 만들기

BS_Sword에서 가로축과 새로축을 설정해준다.

 

블렌드 스페이스 가로/세로 축 설정

● 가로 축 : 각도(dgree)로 처리될 것이다.

                  0 ~ 360도가 아닌, -180 ~ 180도로 처리하게 되는데 좌우 회전 시 최적의 방향으로 회전시킬 수 있기 때문이다.

                  (좌 = - / 우 = +)

- Name : Direction(입력 방향에 따라 움직임이 달라질 것)

- Minimum Axis Value : -180.0(좌)

- Maximum Axis Value : 180.0(우)

- Number of Grid Divisions : 8 (8방향 애니메이션 사용을 위해)

 

● 세로 축 : 움직임 속도

- Name : Speed

- Minimum Axis Value : 0.0

- Maximum Axis Value : 600.0

- Number of Grid Divisions : 2 (0/300/600 으로 구간을 나눔)


축 세팅을 완료하고 이제 애니메이션 트랙에 각각 방향과 속도에 맞는 위치에 애니메이션들을 배치해준다.

이렇게 블렌드 스페이스를 이용하여 8방향 애니메이션을 만들었다.


2가지 블렌드 스페이스 사용하기

지금까지 무기를 해제했을 때와 장비했을 때, 두 가지의 블렌드 스페이스를 만들었다.

이제 상황에 따라 맞는 애니메이션을 출력시켜주면 된다.

 

ABP_Character(애니메이션 블루프린트)의 AnimGraph에서 Locomotion과 CachedLocomotion의 연결을 끊어주고E_WeaponType 블렌드 포즈를 추가해준다.

그리고 E_WeaponType에서 우클릭하여 우리가 추가했던 E_WeaponType 열거형의 열거자 중 Sword를 핀으로 추가했다.

이어서 블렌드포즈에 각각 우리가 만든 블렌드 스페이스 BS_Unarmed와 BS_Sword를 연결해준다.


Calculate Direction

BS_Sword에서 사용할 Direction는 카메라 방향에 맞게 캐릭터가 바라보도록 해줄 값이다.

이를 Direction값은 ABP_Character 이벤트그래프에서 Tic마다 값을 계속 받아올 것이다.

 

Calculate Direction - 정확히 우리가 필요로하는 기능을 가지고 있다.

* [-180, 180] : 폐구간. 이상, 이하 // (-180, 180) : 개구간. 초과, 미만

 

여기서 Direction을 구하기 위해 Calculate Direction 함수를 사용하게 된다. 이미 언리얼에서 해당 기능을 구현해놨다.

보다시피 Calculate Direction은 두 백터(바라보는 방향 / 움직이는 방향)를 이용해서 각도를 구하는 함수라고 할 수 있다.

- 설명(정확하지 않음... 이해하기가 어렵다...) -
노말라이징한 두개의 백터를 dot한다. dot한 값을 아크코사인 계산을 해주면 0 ~ 180도 사이의 양수 값이 나온다.
그 값에 1 라디안을 곱하여 60분법의 도로 나타낼 수 있다.

두 백터를 크로스하여 회전할 축을 얻어주고, 크로스 백터는 회전축이 되어 양수(오른쪽), 음수(왼쪽)을 말한다.

* 아크코사인을 사용한 이유?
그냥 코사인 사용 시, 오른쪽 방향으로만 회전하게 된다.

참고자료 : https://amored8701.tistory.com/132

Calculate Direction을 이용해 값을 계속해서 저장


WeaponType을 받아오기 위해선 Character가 무기를 장비할 시점에 인터페이스를 호출하여 받아와야 한다.

먼저 ABP_Character에서 만든 인터페이스 함수부터 정의해준다.

Set Weapon Type 이벤트 호출 시 WeaponType 입력


BP_Character에서 무기 장착 이벤트를 구현한 로직 마지막에 장착과 해제 시 각각 WeaponType을 입력해준다.

BP_Character에서 무기 해제하는 시점, 장착하는 시점에 각각 Set Weapon Type을 통해 WeaponType값 입력


카메라가 보는 시점에 맞게 캐릭터가 바라보도록 하기 위해서 두 가지 방법이 있다.

 

1. 클래스 디폴트 - Use Controller Rotation Yaw를 사용

이는 캐릭터 컨트롤러의 회전 Yaw를 사용하기 때문에 카메라 회전과 같이 Pawn도 회전하는 것을 볼 수 있다.

캐릭터의 Yaw를 컨트롤러의 Yaw와 매칭해버리는 것이다.

하지만 무기 해제 상태에서도 카메라 회전에 묶여버리는 문제가 발생한다.

 

※ 밑의 Use Controller Desired Rotation과 Orient Rotation to Movement의 상위라서 Use Controller Rotation Yaw 사용 시

    아래 내용을 무시해버린다.


2. Character Movement - Use Controller Desired Rotation을 사용

기존에 Orient Rotation to Movement를 사용하여 입력한 이동 방향에 맞춰 캐릭터를 회전시켰다면, 이번에는 끄고

Use Controller Desired Rotation을 사용하여 컨트롤러의 회전 방향에 맞춰 캐릭터를 원하는 회전 방향으로 부드럽게

회전시킬 수 있다.

Rotation Rate Z의 값을 통해 회전하는 속도도 조절이 가능하다.


여기서 Use Controller Rotation Yaw를 사용하면 구르기가 Yaw 방향을 강제하고 있어서 원하는 방향으로 나가지 못한다.

따라서 Dodge 이벤트 로직 뒤에 Use Controller Rotation Yaw를 껏다 켜주는 것으로 해결해줄 수 있다.

 

Dodge 이벤트 로직 뒤에 추가한 Set Use Controller Rotation Yaw

하지만 구르기가 끝나고 바로 Controller Rotaion Yaw로 Pawn이 Set되면서 너무 어색한 것을 볼 수 있다.

따라서 Character Movement의 Use Controller Desired Rotation을 사용하면 좀 더 자연스러운 회전을 볼 수 있다.