🎮Unreal4/C++

[UE4] 활시위(Bow String) 당기기 : Set/GetBoneLocationByName

공대 컴린이 2023. 6. 19. 18:38
728x90

활을 쏠 때 활시위를 당겼다 놓는 디테일 작업을 수행해보았다.

🏹 Bow Mesh 소켓 추가

활시위를 조절하기 위해, 가장 먼저 필요한 것은 활 Skeletal Mesh에 활시위 소켓을 생성하는 것이다.

💻 DoAction_Bow 클래스

활을 쏘기 위해 생성했던 DoAction_Bow 클래스에서 BeginPlay 함수 호출 시 활 Mesh인 Poseable Mesh를 초기화하고, 활시위의 본래 위치를 변수(OriginLocation)에 저장해주었다.

 

이후, 활시위는 DoAction_Bow 클래스의 Tick 함수에서 조절된다.

 

활시위를 조절하기 전에, 활시위를 움직여도 되는 상태인지 확인하기 위해 무기 장착 상태인지(bEndEquip), 공격중인지(bBeginAction), 활시위가 붙어도 되는지(bAttachedString)를 검사하였다.

 

여기서 bAttachedString 변수는 true로 초기화 된 이후에는 노티파이를 통해 제어된다.

🚩 End_BowString 노티파이 : bAttachedString = true 설정

활쏘는 몽타주의 끝부분에 추가하기 위해 End_BowString 라는 이름의 노티파이를 하나 생성하였다.

해당 노티파이에서는 DoAction_Bow 클래스를 참조하여 Bow의 AttachingBowString 함수를 호출한다.

 

CDoAction_Bow 클래스에 선언한 AttachingBowString 함수bAttachedString 변수를 제어하며,

DoAction_Bow 클래스의 Tick함수에서 활시위를 손에 붙일 때 bAttachedString이 false라면 손에 붙지 않도록 처리하기 위함이다.


모든 조건에 통과된다면, Hand_Bow_Right 소켓의 위치를 가져와 캐릭터의 오른손에 활시위 소켓(bow_string_mid)을 붙여 손으로 활시위를 잡고있는 듯이 구현하였다.

 

이후, 활을 쏘고 나서 Begin_DoAction 함수가 호출될 때와, 활 무기를 장착 해제하는 OnUnequip 함수가 호출될 때 활시위를 다시 원래의 위치(OriginLocation)로 원상복구 시켜주었다.

🚩 몽타주 - 노티파이 정리

활 쏘는 캐릭터 몽타주에 노티파이를 위와 같이 배치하였다.

각 노티파이가 진행됨에 따라 활시위의 변화에 대해 설명하자면 아래와 같다.

 

1. 처음엔 bAttachedString 변수true로 초기화하므로 캐릭터의 손에 활시위가 붙어있다.

2. Begin_DoAction이 호출되면 화살을 방금 쏜 상태이므로, 활시위를 원래 위치로 원상복구 시켜 손에 붙지 않도록 하고 bAttachedString 변수를 false로 설정한다.

3. End_DoAction이 호출되면 화살을 다 쏘고 등에서 새로운 화살을 가져오는 상태이므로, Create Arrow를 호출한다. (활시위 제어 X)

4. End_BowString이 호출되면 다시 화살을 잡고 Aim 모드로 돌아간 상태이므로 bAttachedString 변수를 true로 설정하여 다시 손으로 활시위를 잡도록한다.

 

이렇게 캐릭터가 활을 쏘고 새로운 화살을 생성할 때 알맞은 타이밍에 활시위를 당기고 놓을 수 있도록 구현하였다.

 

컴파일 후 프로그램을 실행시킨 결과는 아래와 같다. Aim 상태여서 활시위가 제대로 보이지 않지만 그림자를 통해 제대로 작동하는 것을 볼 수 있다!

 

728x90