Unreal Project Acero#2(Weapon Class)

공팡팡·2025년 4월 20일

Unreal - Project Acero

목록 보기
2/10

Weapon class의 설계는 앞으로 만들어낼 다양한 무기의 최상위 설계도라고 할 수 있다.

즉 하위 Weapon들이 공통으로 가지고 있어야할 기능들은 모두 있어야 나중에 작업하기 편하다.

예를 들어, Pistol, Rifle, Sniper등의 무기들은 모두 Fire()를 통해 총알을 발사한다. 각기 다른 데미지와 Bullet을 가지지만 어쨌던간에 이는 변수간의 조정을 통해 설계만을 해두고 에디터에서 충분히 고칠 수 있다.

만약 이를 설계하지 않고 들어가면, 중복된 코드들을 마주쳐 골치가 아파질 수 있다. 물론 이런 리팩토링과정이 중요하긴 하나, 초장에 최소화할 수 있는게 시간을 아낄 수 있다.

초기에는 이렇게 대략적으로 구상도를 그리고 개발을 진행하였다. 세부적으로 달라진 부분이 존재하나, 크게는 틀을 따라갔기에 개발하는데 한결 편했던 기억이 있다.

가장 먼저 개발한 건 Rifle이다.

해당 클래스를 설계하며 가장 골치가 아팠던 점이 두가지가 있는데, 하나는 총알을 어떻게 날려야 하는가에 대한 고민과 타팀원에서의 캐릭터 Mesh 1p,3p의 구분이었다.

첫번째인 총알을 어떻게 날려야하는가에 대한 문제는 다음과 같다. 만약 크로스헤어, 그러니까 뷰포트 가운데로 총알을 날리기 위해서는 어떻게 해야하는가?

초기에 했던 생각은 MuzzleSocket에서 일직선으로 총알을 날리면 되겠다였다.

그런데 윗그림에서 보이듯이 해당 경우로 총알을 쏘게 되면 크로스헤어와 상관없이 총기의 위치에 일직선으로 총알이 나가게 된다. 예를들어 Idle Animation에서 총기가 위아래로 흔들리면 에임도 같이 흔들리게 된다는 것이다.

여러 게임을 해본 결과 타르코프와 같은 리얼리즘 슈팅 게임이 해당 로직을 차용한 경우이고, 이런 경우를 제외하고는 대부분 카메라 뷰포트를 향해 날라간다.

타르코프를 보면 총구(Muzzle) 기준으로 탄이 나가며, 탄이 카메라 방향과 일치하지 않는다. 또한 무기의 리코일, 숨쉬기, 조준 흔들림이 총알 궤도에 영향을 미친다.

즉, 총기에서 총알이 나가는 시스템은 동일하나, 크로스헤어가 단지 예측 도우미에 불과하다는 것이다.

이 게임은 그 정도의 개발을 요구하지 않는다. (로직자체는 간단하나, 후에 부속으로 따라올 호흡이나, 피로도, 탄도등의 영향을 주는 요소가 너무 많아진다.) 발로란트나 서든어택, 카스 글옵처럼 일반적인 FPS는 카메라 기준으로 총알이 나가는 일종의 에임 어시스트 느낌으로 진행하게 된다.

FTransform SocketTransform=MuzzleFlashSocket->GetSocketTransform(GetWeaponMesh());
FVector ToTarget = HitTarget - SocketTransform.GetLocation();
FRotator TargetRotation = ToTarget.Rotation();


ToTarget의 위치를 Tick으로 계속해서 Trace를 하다가, Fire()버튼을 발사시에 해당 Target으로 탄도체를 스폰하여 쏴주게 하였다.

두번째는 Mesh의 구분이다.

설계한 캐릭터는 이렇게 1인칭 Mesh와 3인칭 Mesh가 따로 존재하게 된다.

https://forums.unrealengine.com/t/using-just-one-mesh-for-an-fps-character/248478

해당 도큐를 보고 여러차례 검색을 반복한 결과, 대부분의 FPS게임에서는 상대가 보는 3인칭 캐릭터와 1인칭 캐릭터를 두개 설계하여 자신에게는 1인칭 화면만 보이게 함으로써 시야의 충돌 판정, 혹은 현실적인 리로드나 Fire동작을 자연스럽게 한다고 한다.

Owner에게만 1인칭 시점으로, 타인에서 3인칭 시점의 Mesh를 제공하면 다음과 같은 자연스러움을 누릴 수 있다.

profile
공부 정리 노트

0개의 댓글