움직임과 FootRig도 구현했으니 공격을 구현해본다.
기본 공격으로는 오른팔에 달린 총을 발사하는 방식을 사용한다.
추가 공격으로 기계팔로 근접 강공격을 하는 것과,
드론과 같이 공격하는 기능을 생각중이다.
기본 공격은 마우스 왼쪽키로 할 것이고,
일정 수 이상의 탄약을 사용하면 재장전 하는 방식도 구현해본다.
에셋을 뒤져보니, 공격관련 몽타주가 존재했다.
그냥 단순히 애니메이션에 notify를 2개 부착한것이었다.
단일애니메이션을 사용해도 되지 않을까 싶다.
어짜피 공격 누를때마다 반복할 것이고,
콤보랄게 딱히 없는게 격투게임도 아니고 총으로만 쏘기 때문에..
하지만 프로젝트가 어떻게 될지 모르니 몽타주로 구현해본다.
BindAction으로 왼클릭시 해당 코드가 실행되도록 했는데..
AnimGraph상에서 어떻게 해야할지 모르겠다.
Montage를 합쳐야할 것 같은데..
솔직히 Default Slot과
CPP에서의 PlayMontage가 어떤 방식으로 연결되어있는지 모르겠다.
하나 감으로 알아낸 것은,
처음 넣은 DefaultSlot은 LandMontage에 반응한다는 것이고,
나중에 넣은 DefaultSlot은 공격Montage에 반응한다는 것이다.
그리고 Slot의 범위를 따로 지정할 수 있는데,
공격 Montage의 slot을 UpperBody로 두니,
이동하면서 공격모션을 정확히 출력했다.
하지만, Land모션중에 공격을 하면, 착지모션을 생략하고 공격만 출력된다.
우선순위라도 있는 것일까?
https://www.youtube.com/watch?v=vZYrc35m3uM
https://www.youtube.com/watch?v=9a1xpCA6maI&t=522s
간단히 검색하니 위의 영상들이 나왔는데,
음.. 한번 확인해보자.
https://docs.unrealengine.com/5.0/ko/animation-slots-in-unreal-engine/
기존의 slot들은 다 지워버린다.
지우려고 보니까 뭔가 연결되어있다고 뜨는 것 같은데..
연결한 적이 없으므로 일단 지워본다.
지우는 것도 안된다
보니까 Slot은 레이어 이름 같은 거였나보다
위처럼 slot을 따로 지정할 수가 있었다.
공격 몽타주의 slot을 attack slot으로 바꾸었다.
그리고 위처럼 설정하였다.
DefaultSlot은 착지하는 애니메이션이고,
해당 애니메이션을 저장해서 그대로 이어서 사용한다.
blend에는 착지모션과, AttackSlot으로 지정한 공격애니메이션이 사용된다.
이동하면서 공격하는건 되는데 왜 착지모션중에는 실행이 안되는 걸까?
해당 코드를 작성해본다.
어떤 몽타주라도 실행중이라면 공격을 진행하지 않는다.
처음 몇번은 공격을 하는데, 점프를 진행하고나서는 공격을 아예 하지 않게 되었다.
왜?
https://docs.unrealengine.com/4.27/en-US/API/Runtime/Engine/Animation/UAnimInstance/Montage_Play/
답은 위와 같았다.
PlayMontage에 매개변수로 bool bStopAllMontages를 true로 설정하면,
해당 Montage가 실행할 때 다른 Montage를 중지시킨다.
여러 수정을 거치다보니, 기존에 잘 동작하던 착지모션이
딱 한번 수행되고 실행되어버리지 않도록 고장났다.
다시 수정해본다..
위처럼 수정하니 된다.
왜 되는지는 정확히 모르겠다.
왜 Montage... false로 둘 다 설정하는건 안되는걸까?
결론
몽타주는 한번에 하나만 실행하는게 default지만,
PlayMontage에서 동시에 실행하게 바꿀 수 있다.Montage를 blend하여 서로 섞을 수 있다.
당연히 해당 노드의 사용을 위해선
false로 설정하여 동시에 실행가능하게 만들어야 할 것이다.
따로 Projectile을 구현하지 않고, Linetrace를 통해 구현해보려고 한다.
간단히 코드를 작성해보았다.
당연히 위를 쳐다봐도 위로 쏘아지지 않는다.
시작 지점도 Actor의 중심부분이다.
StartLocation과 EndLocation만 적절히 수정해주면 되겠다.
StartLocation의 위치는 실제로 총을 쏘는 오른팔부분에
소켓을 생성하고, 소켓의 위치로 두면 될 것이고,EndLocation은 음.. 소켓의 forwardVector를 가져올 수 있으면 그대로 사용하고,
그게 안된다면 팔을 드는 각도를 계산했듯이,
계산값을 사용하는 것이 좋을 것 같다.구현해본다.
Muzzle_01 소켓의 위치를 Start로 한다.
Socket의 위치로부터, 방향벡터를 가져와서 Linetrace를 한다
원하는대로 동작하긴 했는데,
Socket의 방향을 그대로 적용하는건 무리가 있어보인다.
그 이유는 달리면 팔을 굽히면서 달리기 때문에
정해야할 것 같다.
구현하고서 왼클릭을 꾹 눌러야만 진행되도록 바꿔본다
딜레이가 필요할듯
꾹 누를때마다 플래그 값이 바뀌고, Tick에서 해당 플래그 값에 따른 동작을 한다.
대참사..!
Delay없이 frame마다 진행되어 생긴일로 보인다.