Unreal 공부

[Unreal] 이벤트 그래프를 이용한 캐릭터 장비 ON/OFF 구현

겨울꿈개발자 2022. 4. 25. 22:25

https://dream-winter.tistory.com/23

 

[Unreal] Kawaii Physics 플러그인 분석 및 수정을 통한 캐릭터 애니메이션 커스터마이징

이 글은 이전 글에서 이어집니다. https://dream-winter.tistory.com/22 [Unreal] Custom Anim Node 만들기 현재 Unreal을 시작한지 약 2주일 정도 된것 같습니다. Unity를 추석동안 잠깐 만져보다가 Unreal을 배..

dream-winter.tistory.com

위 프로젝트에 이어서 캐릭터에 장비(칼)를 손에 쥐었다가 없애는 기능을 추가하고자 하였습니다.

 

기존 게임에서는 캐릭터가 맨손 상태에서 마우스 좌클릭(공격)을 입력받으면 공격액션을 취하기 위해 손에서 칼이 생깁니다. 그 이후, 이동이나 점프를 하면 칼이 등 뒤에 있다가 다시 마우스 좌클릭을 입력받으면 손으로 칼이 이동하는 방식입니다. 만약 칼이 등 뒤에 있는 상태에서 특정 시간 내에 마우스 좌클릭을 입력받지 않으면 칼이 사라짐으로써 다시 초기 상태인 맨손 상태로 돌아오게 됩니다.

 

이와 비슷한 기능을 추가해봤습니다.

우선 캐릭터의 손과 등을 기준으로 하는 2개의 칼을 배치합니다.

캐릭터 장비 위치 설정

좌측 컴포넌트 트리에 있는 Mist_Splitter_hand 와 Mist_Splitter_back은 캐릭터 칼의 컴포넌트를 나타내며, 각각 캐릭터의 손과 등을 부모 소켓으로하여 무버블 트랜스폼입니다(우측 트랜스폼 및 소켓 창 참고). 해당 부모 소켓의 이동에 따라 해당 칼도 같이 움직이는 방식입니다.

 

그 다음으로는 위에서 언급한 메커니즘을 추가해보겠습니다. 위와 같이 칼 2개를 배치하고 실행하면, 캐릭터는 항상 칼 2개를 가지고 있는 상태일 것입니다. 따라서 마우스 좌클릭 및 대기 시간, 이동/점프 입력 등에 따라 특정 상태를 정의하고 해당 상태에 따라 어떤 칼을 보이게 하고 숨길지를 결정해야 합니다. 이는 아래와 같이 이벤트 그래프에서 구현을 하였습니다.

상태에 따른 각 장비들의 Visibility 적용

해당 이벤트 그래프를 만든지 오랜 시간이 되어서 정확히 기억이 나지는 않지만, 적용할 캐릭터의 Mesh를 형변환을 해서 Set의 타깃에 입력으로 넣고 있는 것으로 보입니다. 이게 왜 필요한건지는 잘 모르겠습니다. 우선 핵심 로직은 SwordEquipmentMode에 따라서 1일 경우에는 Mist Splitter Hand가 2일 경우에는 Mist Splitter Back이 보입니다. 0일 경우에는 둘다 보이지 않습니다.

 

Sword Equipment Mode는 C++에 정의된 변수 값입니다. 언리얼에서 처음 프로젝트를 만들때 BP로 할지 C++로 할지 선택을 할 수 있는데, 거기서 C++를 선택하면 C++ 기반으로 샘플 프로젝트가 만들어집니다. 기본 캐릭터도 C++ 기반으로 만들어집니다. BP로 한다고 해도 캐릭터를 C++ 클래스로 추가하는 방법이 있을텐데, 제가 그 부분은 잘 모르겠습니다. 

 

캐릭터 클래스 내 SwordEquipmentMode 변수 정의

SwordEquipmentMode 변수를 캐릭터 클래스 내에 추가합니다. - .h 파일

해당 변수의 값을 바꾸는 함수를 .cpp 파일에 추가하며, 저는 Tick 함수에 추가하였습니다.

Move 함수도 추가가 되어있었네요, 해당 함수는 키보드 화살표 입력을 받아서 캐릭터의 위치 및 회전 상태를 정합니다.

Tick 함수에 SetSwordEquipmentMode 함수 추가

SetSwordEquipmentMode 함수는 아래 주석과 같이 검을 등에 매고 있을때 대기 시간이 지나면 사라지게 하거나, 검을 쥐고 있는 상태에서 이동/점프 상태일때, 검을 등에 매도록 하는 코드가 들어가있습니다.

SetSwordEquipmentMode 함수 정의

마우스 좌클릭을 입력받았을때 칼을 손에 쥐게 하는 기능은 PrepareSword 함수로 구현하였습니다. 마우스 좌클릭 입력을 받으면 PrepareSword 함수가 실행되도록 하였고, 해당 함수는 SwordEquipmentMode 값을 1로 바꿉니다.

PrepareSword 함수 키 바인딩
PrepareSword 함수 정의

구현 결과는 다음과 같습니다.

https://www.youtube.com/watch?v=Zu7Yukj5d-k 

감사합니다.