무기에 다가가 키를 누르면 무기를 장착하는 시스템과 Enum을 사용하여 캐릭터의 상태를 구분하고 상태에 따라 다른 애니메이션을 구현해 볼 것이다.
앞서했던 것 처럼 EnhancedInput 시ㅡ템에 EKeyPressedAction을 바인딩하여 E키 입력을 추가한다.
다음으로 캐릭터에 있는 오버랩된 아이템 정보를 넘기기 위한 함수를 만든다.
OverlappingItem은 private으로 보호되어있어 원래 다른 파일에서 접근이 불가능하지만 위처럼 FORCEINLINE을 이용하여 함수로 적용하면 아이템 정보를 넘길 수 있다.
예전 블루프린트에서 이벤트 바인드를 활용한 것과 비슷하다는 느낌을 받았다.
Item.cpp에서 오버랩시와 오버랩엔드시 SlashCharacter에 접근하여 위에서 만든 함수를 가져온다.
오버랩시 this 포인터를 넣어주고 오버랩 엔드시 nullptr을 넣어준다.
다음으로 장착할 무기 Weapon.h에서 Equip 함수를 만든다.
함수는 다음과 같이 AttachToComponent 함수로 무기를 캐릭터에 부착한다.
SlashCharacter.cpp에서 E키를 누를때 Weapon타입인지 Cast하고 맞을 시 위에서 만든 Equip 함수를 가져온다.
캐릭터의 Mesh와 RightHandSocket 이름으로 Equip 함수를 동작시켜 무기를 장착한다.
다음으로 SlashAniminstance 헤더파일에 Enum 변수인 CharacterState를 만든다.
전방선언을 하고 위와 같이 이름을 붙인다.
DisplayName은 에디터에서 보이는 이름을 설정한다.
이러한 Enum클래스를 CharacterTypes.h 라는 헤더파일을 따로 만들었다.
이는 헤더파일끼리 서로 inlcude하는 과정을 막고 최적화를 위한 과정이다.
위와 같이 만든 CharacterTypes.h을 include 한다.
SetOverlappingItem과 같이 FORCEINLINE으로 함수를 만들어서 Enum 타입의 CharacterState를 호출할 수 있도록 한다.
이제 cpp파일에서 위와 같이 GetChrarcterState 함수로 캐릭터의 State를 변수로 가져올 수 있다.
에디터에서 Character State 상태에 따라 애니메이션들을 블렌드 하도록 하였다.
또한 ABP를 좀 더 간소화 하기위해서 ABP를 여러개 만들어서 관리할 것이다.
위를 ABP_MainStates 블프로 따로 만들어 복사해 넣었다.
그러면 여러 변수와 캐릭터 포즈를 새로 만든 블프에 변수로 넣어주어야한다.
위와 같이 변수들을 바인드하여 적용시켰다.
그러면 마치 함수접기를 사용하는 것처럼 깔끔하게 ABP를 바꿀 수 있다.
무기에 접근하여 E키를 눌러 장착하고 장착한 상태와 장착하지 않은 상태 모두 다른 애니메이션이 적용되어 자연스럽게 움직이는 것을 볼 수 있다.
'언리얼 - C++ 프로젝트' 카테고리의 다른 글
OpenWorldRpg (8) Metasound (0) | 2025.05.09 |
---|---|
OpenWorldRpg (7) 공격 애니메이션 구현 (0) | 2025.04.27 |
OpenWorldRpg (5) 애니메이션 리타깃 및 무기 장착 (0) | 2025.04.24 |
OpenWorldRpg (4) C++로 오버랩 이벤트 구현하기 (0) | 2025.04.23 |
OpenWorldRpg (3) 캐릭터 애니메이션 및 IK Bones 활용 (0) | 2025.04.22 |