레퍼런스/Control Rig

Reload Animation with Mag Interaction

UNREAL 2024. 5. 7. 21:35

https://youtu.be/w-ouuDBSIao

 

소총의 탄창을 교체하는 애니메이션을 만들어 보자. 먼저 총을 잡는 강좌의 후속이다.

SK_KA47_X의 스켈레톤트리에서 b_gun_mag를 선택후 위치를 바꿔보면 탄창만 움직이는 걸 알수 있다.

탄창을 잡을 위치를 만들기 위해 root에서AddSocket을 한후 mag라고 이름을 만들어주자. 위치는 탄창중앙으로 한다.

BP_WeaponBase 블루프린트를 액터를 부모로 만들고 다음 노드를 추가한다. SelectMeshAsset은 SK_KA47_X를 선택하고 SetWeaponImage는 UI에서 사용할건데 이 강의에서는 필요없다. AddStaticMeshComponent노드를 추가하고

디테일에서 SM_KA47_Mag를 선택한다.

뒤에 리턴을 변수로 승격하고 OldMag로 하고 SkeletalMesh(총)에 붙여주고 HideBoneByName으로 숨겨주는데 뼈이름을 정확히 적어준다.  이러면 초기 생성시 새로운 매거진이 총에 붙어 있고 원래건 숨겨져 있다. 

R을 누르면 카메라가 회전하면서 매거진을 교환하는 장면을 연출한다. 여기서 중요한건 PlayMontage이다.

PlayMontage에 쓰인 애니메이션은 Reload_Rifle_Ironsights이고

removeMag(15), dropMag(19), takeMag(34), placeMag(51) 우클릭하고 적당한 프레임에 addNotify로 넣어준다. 지금 만든 노티파이는 애니메이션 블루프린트에서 사용할수있다.

매거진을 잡고 빼서버리고 다시 새탄창을 잡고 다시 넣는 시점을 정하는 것이다.

애니메이션 스타터킷을 깔면 기본으로 UE4ASP_HeroTPP_AnimBlueprint가 있다 이걸 더블클릭하고 RemoveMagazine이벤트부터 처리해보자 우선 UpdateAnimation에 Sequence를 추가해서 로직을 추가하자

기본적으로 TryGetPawnOwner노드가 있는데 이걸 끌어 DefaultPawn으로 Cast해주고 변수로 승격해주자

 

DefaultPawn의 LH변수와 IsHoldingWeapon변수를 Get해서 변수로 승격해주자. 그런데 2변수는 아직 안만들어졌으니 나중에 하자.

DefaultPawn으로 이동하자 나는 BP_ThirdpersonCharacter를 사용하였지만 animatioPack을 사용하기 위해 메시위 애니메이션블루프린트를 교체해주었다.

Actor타입의 Weapon1 변수를 만들어주자.

다시 애니메이션블루프린트로 돌아와서 RemoveMag Event뒤에 다음 노드를 추가하자. 디폰트폰에서 방금만든 Weapon1을 get해주고 BP_WeaponBase로 Cast해주고 OldMag를 Get해서 Detach해주자

Detach한 매거진을 왼손에서 잡기위해서 디폴트폰의 메시의 트리에 LeftHand소켓을 만들자. 위치는 손바닥으로 옮겨준다. hand_L을 우클릭후 Addsocket을 한다.

붙일 소켓을 만들었으니 다음과 같이 붙여준다. 떨어진 매거진이 디폴트폰의 메시의 소켓 LH에 Snap으로 붙여준다.

플레이후 R을 누르면 매거진을 제거하는 애니메이션이 재생된다. 디폴트슬롯이 없다면 다음 위치에 추가해주자. 이전 총을 잡기위해 FABRIK이 왼손을 총열을 잡고 있으므로 

디폴트슬롯을 뒷쪽으로 해서 이동작을 제거해준다.

이제 dropMag를 만들자 피직을 이용해 컴포넌트를 떨어트릴것이다. 현재 매거진은 플레이어의 왼손에 붙어 있다.

따라서 이것을 알기위해 디폴트폰>Weapon1>CastToBPWeaponBase>OldMag를 Detach해준다. 이후 Physics를 켜준다.

문제는 Wepon1을 설정해줘야하는데 이건 BP_WeaponBase에서 무기와 OverLap되었을때 디폰트폰의 변수인 Weapon1을 설정해준다.

Weapon1은 현재 가지고 있는 무기의 액터이다.

다음은 takeMag AnimNotify인데 디폰트폰의 TakeMag 이벤트를 호출한다 이유는 Add StaticMesh노드는 애니메이션블루프린트에서는 호출할수 없기 때문이다.

디폰트폰으로 가서 커스텀이벤트를 만들어주자 메시의 LH transform에 staticMeshComponet 노드로 매거진을 붙여주자 Detail에 SM_KA47 Magazine이 설정되어야 한다.

추가된 스태틱메시를 캐릭터메시의 LH소켓에 Attach해준다. 

디폴트폰에서 이벤트를 만들었으니 이제 애니메이션블루프린트에서 디폰트폰변수를 통해 get할수있다 

디폰트폰의 디테일이다.  실행후 총을 줏은후 매거진을 교체한후로 변화가 없어보이지만

아웃라이너에서보면 BP_WeapnBase가 추가되어있고

 

여기까지가 캐릭터가 허리뒤에서 새 매거진을 잡은 상태이다.

캐릭터가 새로운 매거진을 잡기는 하지만 아직 총에 붙지 않는다. 이제 총에 붙여주자

마지막 노티파이인 placeMag를 애니메이션블루프린트에서 추가해주고 캐릭터가 가지고 있는 NewMag를 떼주자

떨어진 매거진을 OldMag에 저장후 WeaponBase의 메시의 mag소켓에 붙여준다. NewMag는 파괴해주면 된다. newMag는 디폴트폰에서 AddStaticMesh로 생성해주었던 Magazine이다.