프로그래밍 공부
작성일
2024. 1. 22. 15:26
작성자
WDmil
728x90

 

기본 이동 애니메이션에 무기를 장착하고 이동하는 애니메이션을 추가한다.

 

무기를 장착시 일반적인 쿼터뷰 게임 처럼, 캐릭터는 언제나 정면을 바라보면서 이동하게 할 것 이다.

 

우선 필요한 애니메이션을 정의한다.

기본적인 공격, 이동, 무기들고 달리기 등의 애니메이션을 사용한다.

 

애니메이션은 Mixamo에서 가져와 사용하였다.

 


ABP만들기

 

무기의 장착모션의 ABP를 정의해야 한다.

이번에는 ABP의 블랜드 스페이스를 1D가 아닌 일반 블렌드 스페이스를 사용한다.


블렌드 스페이스

기본적인 블렌드 스페이스의 위치이다.

2개의 축을 사용하고, Speed와 정면기준 -180~ 180 의 각도를 사용한다.

 

좌측 180도를 이동하고 우측 180 도를 이동하여, 객체의 속도를 기준으로 애니메이션을 블랜딩 한다.

모든 애니메이션 각도에서 대기자세는 Idel이다.

그리고, 속도에 다라 Walk_F, Walk_R, Walk_L, Walk_B를 지정하여, -180 과 180의 방향값은 뒤로 같음으로, 둘다 Walk_B를 배치해준다.

 

그리고, Walk_R과 Walk_L은 좌측과 우측으로 확인하여 정면을 바라보고 있는 기준으로, 좌측은 -로 우측은 +로 이동함으로, 왼쪽에 L 오른쪽에 R을 배치해준다.

 

이미 기본이동에서 달리기 모션은 600의 속도, 걷기는 400까지로 정의하였음 으로 각 위치에 모션을 배치해주면 된다.


블렌드 스페이스를 ABP에 적용하기

 

이제 만든 블렌드 스페이스를 ABP에 적용해보자.

전에 만들었던 ABP로 이동하여 정의한다.

 

ABP에서 AnimGraph로 이동하여 확인해보자.

위와같이 Jumping에서 최종 애니메이션 포즈가 결정되는걸 볼 수 있는데, Jumping내부에서 수정할 것 이다.

Jumping을 수정하여도 좋고 그냥 사용해도 무방하다.

위와같이 에니메이션 상태를 정의해주면 된다.

 

원래 BS_Unarmed의 상태에서 Draw Sword_1 -> DrawSword_2로, 마지막은 Bs_Sword로 이동하여 블랜드 스페이스를 사용할것 이다.

 

그리고, 무기를 넣었을 때, Sheath_Sword를 순차적으로 실행한다.

각각, 1번과 2번은,

무기를 뽑아들기 시작 -> 무기를 드는모션

무기를 집어넣기 시작 -> IDle로 전환

이라고 이해하면 된다.


BP_Player와 ABP_Player의 변수 연결

 

우리는, BP_Player에서 키값을 받아다가, ABP_Player에 연결하여 BP_Player에서 받은 키값으로 변경된 Bool변수를 ABP_Player에서 받아다 사용할 것 이다.

 

프로젝트 세팅에서 Sward입력 액션을 설정해, 무기를 장착하게 정의하고,

Sward에 대한 입력값이 입력되었을 경우, Equip Sword의 커스텀 이벤트를 실행하게 할 것 이다.

 

그리고, Drawing을 True로 바꾸어준다.

 

Bool변수를 정의해주었다면, 위치를 ABP로 옮기고 ABP에서 해당 Bool변수를 받아와 사용하자.

위와같이 Bp_Player에서 Bool변수로 타깃을 가져와서 사용할 수 있다.

Print String은 오류메세지 송출용이다. 만약, 정의가 실패했다면 나타난다.

 

무기를 장착하라는 명령을 받아올 수 있게 되었다.

우리는, ABP를 통해 데이터를 처리할 수 있다. ABP의 Drawing은 BP의 Drawing과 연동되기 때문이다.

자 이제 연동된 Bool변수를 이용해서 Jump를 바꾸었을 때 처럼 상태머신을 바꾸어주자.

Draw_Sword_1에서 2로 이동하는 방식은, Bool변수의 확인과 같다.

그냥, Drawing이 True가 되면, 칼을 장착하게 한다.

나머지는 다음과 같이, 전 애니메이션이 0.3만큼 남았을 때 전환하게 한다.

연결이 성공되면 다음과 같이 애니메이션 그래프가 전환된다.


블랜드 스페이스 변수 전달

 

이제 블랜드 스페이스 변수를 전달시켜보자.

블랜드 스페이스에서 사용하는 float변수는, direction각도와 speed변수이다.

우선, direction각도를 구해보자.

Player에서 Velocity와 Control Rotation을 가져와서 현재 Contorl되는 객체의 방향과 ROtation을 가져와, -180에서 180을 반환한다.

 

SPeed는 원래있는 변수를 사용하여 다음과 같이 붙여준다.

위와같이 붙여놓은 Direction과 Speed를 사용해서, 현재 에님스테이트를 정의해준다.


노티파이 설정, 가져오기

 

그런데 위 설정에서 문제점이 있다.

칼을 뽑아드는 동작 중에 플레이어가 움직여버린다.

또한 칼을 뽑고 움직일 때 정면만 보지 않고, 객체가 회전하게 된다.

그럼으로, Bool변수로 CanMove를 사용해서 움직임을 통제하고 무기를 전부 뽑았을 때, 움직임을 허용하게 하고,

우리가 객체를 통제할 때 사용했던 bool타입 변수들을 통제할 것 이다.

위와같이, Can Move에 정의하여, CanMove가 True일 때만 움직이게 해준다.

 

이 CanMove를 이제 칼을 뽑아드는 모션이 나타나게 되면, False로 하고, 전부 뽑아들고, 칼모션으로 완전히 이동했을 때 true로 바꿔줄 것 이다.

 

또한, 일반적으로 움직일 때 회전하게 하는 bool변수들을 false로 , 바꾸어주고, 칼을 집어넣었을 때 true로 바꿔준다.

bool변수를 많이쓰는건 좋지 않지만, 일단 bool로 정의해주자.

위와같이 정의 해주면된다.

 

칼을 뽑아드는 모션이 실행되면, 움직임을 통제하고, 칼을 전부 뽑았다면, 움직임을 허가한다.

그런데, 우리가 애니메이션을 실행하고 종료하는걸 아는것은 ABP이고, BP는 움직임을 통제함으로.

ABP에서 BP로 애니메이션 종료 사실을 전달해야한다.

 

여기서 사용되는것이 노티파이로, 애니메이션에 클립을 한개 끼워넣어. 이 애니메이션의 실행중 이부분에 걸렸을 때, 외부로 여기까지 도달했다고 호출해주는것 이다.

 

노티파이를 활용해서 전부 착용하였음을 전달해보자.


노티파이 추가하기

노티파이는 우리가 정의했던, 애니메이션중 Draw_Sword_2에서 추가하면 될 것 이다.

이 애니메이션이 종료되면, 칼을 전부 뽑았다는 의미 이기 때문이다.

위와같이 노티파이를 추가할 수 있다.

자세한 설명은 정식사이트 의 설명 링크를 통해 확인할 수 있다.

https://docs.unrealengine.com/4.27/ko/AnimatingObjects/SkeletalMeshAnimation/Sequences/Notifies/

 

애니메이션 노티파이

Notify, 노티파이는 애니메이션 시퀀스에서 이벤트를 구성하고 받아 외부 동작을 수행하는 알림 시스템입니다.

docs.unrealengine.com

아무튼, 애니메이션 노티파이를 통해 커스텀 이벤트를 호출할 수 있게 되었음으로, 여기서 커스텀 노티파이가 있음을 확인할 수 있다.

여기에서 커스텀 이벤트가 생성되었음으로, 이걸 이용해서 Bool변수를 ABP에서 바꿔주자.

아주 간단하게, BP에서 정의된 이벤트를 ABP에서 실행시켜주면 된다.

이러면 끝난다.

이런 노티파이를 여러개 정의해서, 칼을 넣고 뽑고, 이동제한을 걸고 등을 설정하면 다음과 같은 영상처럼 동작한다.

 

 

 

728x90