![[2024-2 겜엔기] Project AS 개발일지 #3](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfmxcD%2FbtsJW6I4lt3%2Fl9kSKzPHWTuXkw5nz6IiY0%2Fimg.png)
저번 개발때 플레이어 이동을 구현해서, 이번에는 플레이어 공격을 구현해보았다.
단순하긴 해도 애니메이션을 직접 블루프린트 내에서 다루는 경험은 이번이 처음이라 조금 헤매기도 한 것 같다.
그럼 결과물은 어떨까?
Hit Scan
Hit Scan(히트 스캔)이란, FPS에서 사용되는 공격 판정 방식이다.
보통 총기류로 공격을 하면 현실에서는 투사체가 날아가면서 대상을 공격하지만, 게임에서는 연산 속도가 있기 때문에 현실만큼 빠른 속도를 적용한 투사체를 날리면 그 속도를 연산 속도가 못따라가서 판정이 잘 안되는 경우가 있다.
이럴 때에는 투사체를 날리는 것 대신, 공격 명령이 들어오면 그 즉시 바라보는 대상에게 피격 판정을 내려버리는 시스템을 사용하는데, 이것이 히트 스캔이다.
예를 들자면 오버워치의 위도우메이커, 캐서디 정도가 대표적일 것 같다. (히트 스캔 딜러들)
원래 처음에는 투사체로 구현하려고 했는데, 총 쏠때 투사체에 마땅한 이펙트가 없기도 하고 히트 스캔 쪽이 훨씬 타격감이 좋을 것 같아서 이걸로 구현하기로 했다.
구현하려고 볼때에는 '와 이걸 어떻게 구현하지?' 싶었는데 막상 보니 보는 곳으로 선을 쏴서 맞는 것에게 피격 판정을 하면 되는 것이었다. 그리고 아직 적이 구현되지 않은 상태라 선을 쏘기만 하면 됐다.
아래는 구현한 블루프린트이다.

설명하자면, 공격 명령이 들어왔을 때 현재 보고있는 곳을 알아내기 위해 카메라의 World Location을 받아와 시작지점으로 하고, 이것에 Forward Vector를 더해 끝지점으로 하여 그 사이를 선으로 쏜다.그리고 맞은 오브젝트에게 데미지를 준다.
진짜 간단한 매커니즘이었다. 그래서 걱정했던 것과는 달리 빠르게 구현해냈다.
4타 구현
이 게임의 플레이어는 총 4발을 쏠 수 있는 리볼버를 들고 다닌다.
이 기획을 구현하기 위해서는 총 세 가지의 시스템을 개발해야 했다.
- 4발을 모두 쏜 후에는 장전해야 한다.
- 마지막 4발 째 공격은 강력해야 한다.
- 한 발씩 쏠 때마다 시점이 흔들리는 효과(반동)가 필요하다.
여기서 2번은 단지 데미지만 다시 설정해주면 되어서 1번과 3번을 주로 설명해보려고 한다.
4발 제한
4발을 쐈다는 것을 감지해주는 것이 딱히 없어서, 이를 Attack Count 라는 변수를 만들어 관리하기로 했다.
한 발씩 쏠 때마다 1씩 증가하고, 장전 시에는 0으로 돌아가도록 했다.
아래는 실제로 구현한 블루프린트이다.

그리고 이렇게 작동한다.
공격 속도 설정
이렇게 구현하니, 한 가지 문제가 생겼다.
총을 쏘는 모션이 끝나기 전에 다시 공격 입력이 들어오면, 그대로 발사해버린다.
이것을 막기 위해 Attack Cooltime이라는 변수를 만들어 현재 발사 가능한 상태인지 체크하도록 했다.

간단히 설명하면, Event Tick 마다 Attack Cooltime을 줄여주는것이다. 그리고 만약 0보다 아래로 가면 그냥 0으로 설정해준다.
여기에 응용해 장전 시간도 만들어두어 같이 관리되도록 했다.
이렇게 하니 정상적으로 알맞은 타이밍에 공격이 가능해졌다.
장전
4발을 모두 쏜 후에는 장전을 해야한다.
그래서 4발 째 되는 공격에는 위에서 만들었던 장전 시간 변수인 Reload Cooltime 변수를 만들어 장전을 기다리도록 했다.
그리고 그 시간동안 장전 모션을 플레이 시키는 방식으로 장전을 표현했다.

반동 표현
총을 쏠 때에는 반동이 온다. 보통 게임에서는 이것을 카메라가 위아래로 흔들리는 것으로 표현한다.
그래서 카메라를 흔들리게 하려고 온갖 방법을 다 찾아보고 다 시도해봤다...
그리고, 방법을 찾았다. 바로 CameraShake를 이용하면 된다.
이것을 쓰기 위해서는 따로 블루프린트도 생성해줘야 한다.
Camera Shake BP 생성 및 설정

위 사진과 같이 LegacyCameraShake 속성의 블루프린트를 하나 생성해준다.

그리고 이와 같이 설정해준다. 여기에서 피치만 건드리는 이유는, 총을 쏠 때 상하 반동이 가장 크게 느껴지기 때문에 상하만 흔들리게 하려고 하는 것이다. 그리고, Sine Wave는 딱 상, 하로만 운동하게 해준다.
플레이어 BP에 적용
이제 생성한 BP를 플레이어 BP에 적용해줄 차례이다.

Play World Camera Shake라는 노드를 사용하여 Camera Shake BP를 실행하도록 했다.
공격하는 로직 사이에 끼워두어 공격할 때 마다 카메라가 위아래로 반동처럼 흔들리게 된다.
만약 흔들리지 않는다면, Outer Radius를 흔들릴 때 까지 조정해주면 된다.
이렇게 하면, 진짜 총을 쏘는 듯이 플레이가 가능해진다.
이펙트 적용
게임이 게임다워지는 것은 이펙트를 넣었을 때라고 생각한다.
그래서, 플레이어를 게임답게 하기 위해 이펙트 작업을 해 주었다.
이펙트 파일들은 모두 에셋 안에 포함되어있던 것들이라 따로 구할 필요가 없었고, 블루프린트 내에서 재생시켜주기만 하면 됐다.
이것을 하려면 우선 소켓 구조를 알아야 한다.
소켓 구조

스켈레탈 메시에는 '소켓' 이라는 것이 있다.
그리고 그 소켓에서 애니메이션을 재생시킬 수 있다.
소켓은 스켈레탈 메시의 하위항목이라서 애니메이션이 재생되면 그에 따라 소켓도 움직이기 때문에, 여기서 이펙트를 재생시키면 별도의 조작 필요 없이 메시를 따라서 자연스럽게 이펙트도 움직인다.
소켓에서 이펙트 재생시키기
소켓에서 이펙트를 재생시키려면 Spawn Emitter Attached 노드를 이용해야 한다.

Get Socket Name 노드로 원하는 소켓의 정보를 받아온다.
그리고 그 정보를 Spawn Emitter Attached 노드에 연결하여 이펙트가 연결된 소켓에서 나오도록 한다.
이 때, Location Type을 Keep World Position으로 설정해주어야 실제 플레이 시에도 정확한 위치에서 이펙트가 나온다.
이것을 안했을 때에 뭣모르고 플레이 해봤다가 카메라 바로 앞에서 이펙트가 터져서 섬광탄을 맞은 기억이 있다...
이것을 하나 구현해놓고, 이펙트가 있어야할 위치마다 끼워주어 모든 이펙트를 적용했다.
이 단계까지 마치면 아주 멋진 플레이어가 탄생하게 된다.
이번 개발로 플레이어가 진짜 게임 속 캐릭터로 변신한 것 같다.
이제 남은 건 스킬 시스템이랑 공격 속도 변경 등.. 이 남았다.
스킬 구현이 제일 어렵다고 생각되기에 이 다음에 바로 시작할 예정이다.
그리고 여기까지 해보니 언리얼에 나름 익숙해진 것 같다.
아직 블루프린트 생성하고 설정하는 것에는 익숙하지 않지만, 그것도 나름 적응중이다.
앞으로도 이렇게만 하자 나 자신

'팀 프로젝트 > Side Project' 카테고리의 다른 글
[2024-2 겜엔기] Project AS 개발일지 #4 (2) | 2024.11.01 |
---|---|
[2024-2 겜엔기] Project AS 개발일지 #2 (5) | 2024.09.29 |
[2024-2 겜엔기] Project AS 개발일지 #1 (0) | 2024.09.29 |
[Side Project] Project KS 개발일지 (4) | 2024.09.09 |
안녕하세요! 코드 짜는 농부입니다! 경희대학교 소프트웨어융합학과 23학번 재학중입니다. 문의 : dsblue_jun@khu.ac.kr
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!