🎮Unreal4/Blueprint

[UE4] 활 줄(Bow String) 당기기, UPoseableMeshComponent

공대 컴린이 2023. 2. 10. 18:21
728x90

활을 쏠 때 손으로 활 줄을 당겼다가, 활을 쏘는 순간 활 줄을 놓으면 줄이 원위치로 돌아온다.

이러한 기능을 구현하기 위해선 활의 Mesh Component를 수정해야 하는데, Mesh를 수정하기 위해선 Mesh Component의 상속구조에 대해 알아야 한다.

📚 UPoseableMeshComponent

UPoseableMeshComponent 상속구조

활의 Mesh를 변경하기 위해 활 블루프린트에 PoseableMeshComponent를 추가하였다.

  • UPoseableMeshComponent
    - 매 프레임마다 애니메이션의 변화된 모습을 캡쳐(복사)해서, 키 정보(bone에 대한 정보)를 임의로 수정할 수 있다.
    - 정보를 수정하기 때문에 속도는 느리다.

PoseableMeshComponent를 이용하면 활 줄의 Mesh를 순간 캡처하여 활시위에 대한 Bone 정보를 수정할 수 있다. 따라서 활 컴포넌트에 PoseableMesh를 추가하여 활시위를 당기고, 풀 수 있는 기능을 구현하였다.

🏹 활 줄(Bow String) 당기기

활 블루프린트에 PoseableMeshComponent 컴포넌트를 추가하여, Bone을 수정하였다.

 

Weapon_Bow : Begin Play

활 액터의 Begin Play가 실행되면 Poseable MsehGet Bone Location by Name 함수를 이용하여 현재 활시위의 Origin 위치를 저장해놓는다.

 

Weapon_Bow : Tick

Tick 이벤트가 호출되면서 현재 활을 장착하고 있다면(In Equip), 그리고 활시위가 붙어있는 상태라면(Attach Bow String) 활시위의 Bone 위치를 캐릭터의 오른손 위치에 붙여준다. 

결과적으로 플레이어가 활시위를 오른손으로 당기는 듯한 연출이 가능해진다.

 

💡 Set Bone Locating by Name

이때 Set Bone Locating by Name 함수의 속성 중, Bone Space 속성은 World Space와 Component Space가 있다.

World Space는 월드 위치 상에서 bone의 위치를 In Location 위치로 맞추는 것이고, 

Component Space는 Mesh의 위치 상에서 bone의 위치를 맞추는 것이다. Component Space는 로컬 위치라고 봐도 좋다.

 

Weapon_Bow : Unequip

활시위를 당기다가 활을 쏘면 활시위가 더이상 손에 붙어있지 말고, 원위치로 돌아가야 한다.

또한 활을 장착하지 않고 Holster에 보관하는 상태인 경우에도 원위치로 돌아가야 한다. 

 

따라서 활시위의 원위치를 위해 처음에 저장해두었던 Origin Location을 사용하여 활 장착을 끝냈을 때(Unequip)와 활을 쏘고 나서(Begin Do Action - Shoot 이후) 활시위 위치를 되돌려주었다. 

 

다음 활을 쏘려면 또다시 활시위를 잡고있어야 하기 때문에 활을 쏘는 동작이 끝날 때 쯤 End_BowString 이라는 Anim Notify를 만들어서 활시위를 붙여주었다.

 

🚩 순서 정리

처음 활 장착하면 활시위를 잡음 -> ( 활을 쏘는 순간 활시위를 뗌 -> 등뒤에서 활을 다시 가져올 때 활시위를 잡음 ) 반복 -> 활 장착을 풀면 활시위를 뗌

 

결과적으로 활시위를 당기고 놓는 동작이 잘 구현되었다.


참조

https://docs.unrealengine.com/4.26/en-US/API/Runtime/Engine/Components/UPoseableMeshComponent/

 

UPoseableMeshComponent

[UPoseableMeshComponent](API\Runtime\Engine\Components\UPoseableMeshComponent) that allows bone transforms to be driven by blueprint.

docs.unrealengine.com

728x90