AimOffset 구현하기(BlendSpace 사용 X, Bone의 회전으로!)

Ryan Ham·2024년 8월 17일
2

Unreal Engine

목록 보기
21/27
post-thumbnail

고민해봐야 할 질문

총을 쏴서 적군에게 데미지를 가하는 기능을 만드려면 어떻게 해야할까? 어디서부터 시작해야할지 막막하다면 데미지를 주는 부분과 캐릭터의 시각적인 부분(Firing animation & AimOffset)을 분리해서 차근차근 접근해보면 좋을 것 같다. 이번 글에서는 시각적인 부분을 중점적으로 다룰 것이다.

데미지를 주는 로직

데미지를 주는 부분은 크게 2가지로 나누어 볼 수 있다. 첫 번째는 총알의 궤적에 대해 이에 맞은 물체와 collision을 구현하는 방법이다. Trace By Channel 노드와 이에 대한 시작점과 끝점 설정을 위한 Control Rotation에서 Forward Vector를 가져오는 방법을 알아야 한다.

두 번째는 실제로 데미지를 주는 부분인데, 총알을 쏘는 BP에서는 Take Damage 노드를 통해 얼마만큼의 데미지를 설정할지 정한다. 반대로 데미지를 받는 입장에서는 Event Any Damage를 통해 자신이 받은 데미지의 양 / 위치에 따라 다른 상태값이 되도록 설정하면 된다. 예를 들어서 데미지의 총량이 100을 넘어가면 RagDoll 상태로 만들 수 있고, 맞은 위치에 대해서는 머리를 맞으면 즉사, 그 외의 부분을 맞으면 소량의 데미지를 구현할 수 있다.

시각적인 부분

시각적인 부분에 대해 가장 먼저 떠오를 수 있는 것은 총알의 발사 위치이다. 현실에서는 총구(Muzzle)에서 총알이 나가는 것이 당연하지만 게임상(TPS라 가정)에서는 이렇게 구현하면 곤란한 점이 많다.

그 이유를 생각해보면 보통 총 게임이 실행될 때 조준선 UI를 만들어서 게임 화면 위에 띄워주게 된다. 그러면 당연히 플레이어들은 총알이 자신이 보고 있는 화면의 조준선(보통 화면의 정중앙)에 에임된다고 생각할 것이다. 이 조준선을 어떻게 구할지 생각해보면 플레이어가 들고 있는 총구의 방향이 아니라 화면을 찍고 있는 카메라의 상대적 위치로 하여 Forward Vector를 더하면 그 궤적이 나올 것을 생각해 볼 수 있다.

  • 화면에 Overlay로 띄워주는 총구 조준선

두 번째는 캐릭터 Bone의 회전이다. TPS에서는 캐릭터가 화면상에 어느 위치를 보고 있느냐에 따라 몸의 회전이 같이 일어나야 한다. 예를 들어서 위를 보고 있으면 척추와 목을 위로, 아래를 보고 있으면 아래로 꺾어 주어야 한다. 마찬가지로 발이 고정되어 있는 상태에서 좌우를 보는 모션을 준다면 얼굴 방향을 척추와 목을 바라보고 있는 방향으로 틀어주어야 한다.

잘 준비된 애니메이션 에셋 같은 경우는 이미 캐릭터가 다른 각도를 바라보고 있는 애니메이션 시퀀스가 준비되어 있다. 이러한 경우에는 Player의 Control Rotation의 값들을 축으로 하는 BlendSpace를 만들어서 AnimGraph에 넣어주면 된다. 하지만, 일반 애니메이션의 경우에는 이렇지 않으므로 우리는 직접적으로 Skeletal Mesh Bone의 회전값을 조정하면서 AimOffset을 만들어 볼 것이다.


Bone의 회전으로 AimOffset 구현하기

Skeletal Mesh에서 Bone의 회전을 주는 방법에는 크게 2가지가 있는 것 같다. 하나는 AnimGraph의 Transform Bone 노드를 사용하는 것이고 다른 하나는 Control Rig을 사용하는 것이다. Control Rig을 사용하면 별도의 클래스를 만들어야 하지만 Transfrom Bone보다 저 세밀한 컨트롤을 할 수 있다는 장점이 있다.

위/아래 AimOffset 같은 경우는 Skeletal Mesh의 거의 최상단 뼈인 spine_01만 조절하므로 Transform Bone을 사용할 것이고, 좌/우 AimOffset 같은 경우는 spine, neck, head의 여러 Bone을 회전시켜야 자연스러움으로 Control Rig을 사용해 볼 것이다.

상/하 AimOffset

Transform Bone으로 spine rotation 값을 조절해보면서 상/하 AimOffset을 만들어보자. Player Control Rotation에 대해서 캐릭터의 spine 회전값을 얼마나 조절할지는 카메라의 forward vector의 방향과 총열의 방향을 비교해보면 된다. 이를 맞춰주면 플레이어 입장에서 자신이 총을 쐈을때 총알이 마치 총구에서 발사 시작되어 화면 정중앙에 있는 조준선으로 향하는 느낌을 받을 수 있기 때문이다.

이를 직접적으로 확인해보기 위해서 다양한 높이에 Dummy Target을 배치한 다음 테스트를 해보자.

다양한 높이로 서있는 Dummy Target

Target이 낮은 높이에 있을 때 Aim시와, Target이 높은 높이에 있을때 Aim시 방향이 잘 맞추어 진것을 확인할 수 있다.

  • 낮은 높이 Aim

  • 높은 높이 Aim

아래 그림은 AnimGraph에 넣은 Transform Bone Node이다. Control Rotation값에 알맞게 scaling 된 값을 이 노드의 Rotation 핀에 연결한다.

AnimGraph에서 Transform Bone Node

상/하 AimOffset에서 또 하나 고려해야 할 점이 있는데, 바로 카메라의 위치에 따라서 Rotation Scale 값을 한번 더 수정해 주어야 한다는 것이다. Aim을 하지 않았을때는 카메라가 멀리서 캐릭터를 찍고 있고, Aim을 했을때는 가까이서 찍고 있기 때문이다.

Aim X시 scale 값과 Aim O시 scale 값 다르게 조정

캐릭터 Animation Blueprint의 Event Graph에서 이 2가지 경우에 대해 각각 다른 회전값을 설정한다. 조준시에는 Control Rotation의 변화에 대해 척추 회전에 적게 들어가야 하므로 0.05로 scaling factor를 설정했고, 조준 X시에는 scaling factor를 1로 설정하였다.

조준 X시 척추 bone의 pitch 방향 회전

조준 O시 척추 bone의 pitch 방향 회전


좌/우 AimOffset

좌/우 AimOffset 같은 경우에는 더 정밀한 본의 회전을 위해 Control Rig을 사용해보자. Control Rig은 Transform Bone과 다르게 여러개의 Bone을 한꺼번에 조절 가능해서 훨씬 더 정밀한 애니메이션을 구현할 수 있다.

Control Rig에서 여러개의 본 설정

좌/우 회전시 Spine이 Neck과 Head의 Bone들보다 더 회전이 크므로 높은 scaling factor를 부여하였다.

Control Rig과 회전 변수 연결

Control Rig 클래스에서 어떤 Bone들을 어떤 scaling factor로 조절할 지 정하였으면 이를 Anim Graph에서 연결하는 과정이 필요하다.

Event Graph에서 좌/우 회전 각도 Clamp

사람이라면 아무리 노력한다 하더라도 허리가 360도 돌아가는 일이 없을 것이다. 따라서 Rotation값에 일정 범위에 대한 Clamping 과정이 필요하다.

Control Rotation(조준선의 위치로 파악 가능)이 좌/우 방향으로 더 간다 하더라도 캐릭터의 Spine/Neck/Head의 Rotation은 일정 범위에 도달하면 더 이상 움직이지 않는다.


Reference

참고 유튜브

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

0개의 댓글