수류탄 던지기 모션 구현하기

Ryan Ham·2024년 8월 14일
4

Unreal Engine

목록 보기
19/27
post-thumbnail

Rifle과 Sniper를 구현해 본 이후, FPS에서 수류탄이 빠질 수 없어 이를 구현해보기로 하였다. 개인 프로젝트의 일정상 총알에 대해서는 탄도학을 적용할 수는 없었지만, 수류탄에 대해서는 어느 정도의 Trajectory를 적용해보기로 했다.

Actor에 Projectile Movement라는 속성을 추가할 수 있다. 이를 추가하게 되면 정말 간편하게 초기 발사 속도, 땅에 부딪혔을때 튕기는 효과, 중력이 적용된 포물선 경로 구현 등을 설정할 수 있다.

수류탄 BP 구현

앞서 말한 Projectile Movement을 제외하고도 수류탄이 터질때 주변 반경에 데미지를 주기 위한 Radial Force와 수류탄이 날라갈때 연기 같은 trail 효과를 주기 위해서 Cascade Particle Component를 함께 달았다.

수류탄의 폭발의 이펙트는 수류탄이 생성되고 특정 시간이 지난후에 터지는 효과를 Spawn Emitter at Location을 통해 재생시키고 그 다음 수류탄 Actor는 Destroy하게 만들었다. 이는 수류탄 핀을 뽑는 순간을 BeginPlay라 생각하면 매우 자연스러운 흐름이다.

사운드 이펙트로는 수류탄이 땅에 부딪힐때마다 해당 위치에 소리를 Play Sound at Location을 통해 재생시키게 만들었다.

기능 구현

수류탄 던지는 애니메이션을 Mixamo에서 가져와서 TerribilisLauncherMixamo Launcher라는 프로그램으로 내가 사용하고 있는 UE5 Manny Skeletal Mesh에 Retargeting을 하였다.

나는 캐릭터 손에 소켓을 달아, 애니메이션의 정확한 특정 프레임에 수류탄을 소켓에서 소환해 발사할 계획이였다.

문제 봉착

수류탄이 Spawn될 위치와 회전값을 정하는데 있어서 생각하지도 못한 문제에 봉착하게 되었다. 그것은 바로 정확한 시점에 애니메이션의 특정 순간을 가져올 수 없다는 사실이다. 특정 순간을 포착하기 위해서 수류탄 액션을 trigger하는 Input Action을 하는 시점을 기준으로 한 Time Delay, Custom AnimNotify를 만들어 이를 애니메이션에 추가하고 시작되는 시점을 가져오는 방법을 사용해봤지만, 신기하게도 매번 애니메이션을 재생할때마다 특정 순간의 소켓 위치&회전값이 바뀌는 현상을 겪었다.

손에 부착되어 있는 소켓을 DrawDebugSphere로 그린 모습. 캐릭터와 Player Controller에 아무런 변화를 주지 않았음에도 불구하고, 매번 DebugSphere의 그려지는 위치 미세하게 달라지는 것을 확인할 수 있다.

Spring Arm의 SpringEndpoint Socket을 기준으로 문제 해결!

이 문제를 해결하기 위해서 고정된 위치값과 회전값을 얻어와야 했다. 손에 달린 socket이 변화량이 많아 잘 안나오나 싶어서 캐릭터 Skeletal Mesh의 다른 bone에 socket을 달아서 진행을 해봐도 매번 값이 변하였다.

그래서 캐릭터가 아닌 카메라의 spring arm에 달린 socket을 이용하기로 결정하였다. Spring arm 또한 캐릭터의 AimOffset에 연동되게 회전값이 변하므로 캐릭터가 pitch 및 yaw 방향으로 회전할때 수류탄의 시작 위치값을 어느 정도 잘 잡을 것이라 생각했다.

Spring Arm에 달린 SpringEndpoint라는 socket을 사용하기로 결정!

기존에 만들었던 Custom AnimNotify에서 애니메이션의 특정 시점에 Spring Arm의 socket location & socket rotation 값을 가져오기로 했다. Spring Arm socket의 회전값에서 forward vector를 따로 가져와 이를 350만큼 곱해주고 더했다.(Sprimg Arm의 기본값이 300이므로 캐릭터의 팔길이를 고려해 350으로 잡아줌.)

캐릭터의 시선 방향에 따라서 수류탄이 생성될 위치(빨간색 DebugSphere)도 알맞게 변한다.


최종 화면

이제는 특정 시점에 고정된 socket 값을 통해 동일한 위치&회전값으로 수류탄을 생성한다!!

profile
🏦KAIST EE | 🏦SNU AI(빅데이터 핀테크 전문가 과정) | 📙CryptoHipsters 저자

0개의 댓글