![[2024-2 겜엔기] Project AS 개발일지 #4](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCch4H%2FbtsKvdTIK1C%2FKRdRQUF0zWSbRTiJsN96H0%2Fimg.png)
저번에는 플레이어의 기본 공격을 구현했었다.
그래서 이번에는 플레이어의 스킬을 구현했다.
스킬은 총 4가지가 있고, 그 중 일단 Q스킬 1가지만 중간 발표 전까지 구현하는 것이 목표였는데,
과연 목표를 달성했을까?
적 탐지
설명하기에 앞서, Q스킬은 롤의 카이사 Q스킬 처럼 유도탄을 발사해 데미지를 입히는 것이다.
그러려면, 자신 주위의 적들이 얼마나 있는지 일단 파악하여 그 적들을 변수든 리스트든 어떤 방식으로든 저장해야한다.
나는 가장 간단한 방법을 선택했다.
플레이어에게 탐지 범위만큼의 트리거 형식의 콜리전을 주고, 거기에 들어오면 리스트에 넣었다가 다시 나가면 리스트에서 지워주는 것이다.

그리고, 적을 저장하기 위해 액터 오브젝트 리스트 변수를 하나 만들어 거기에 저장과 삭제를 해줬다.

여기에 새로 사용한 노드 두 개가 있다.
- Actor Has Tag : 액터가 해당 태그를 가지고있는지 보고 불리언 값을 반환한다. 위 코드에서는 Enemy 코드를 가진 액터를 탐지했다.
- Add Unique : 이것은 Add와는 달리 리스트에 오직 하나의 값만 갖게 요소를 넣는 것이다. 다시 말하면, 이미 있는 요소라면 리스트에 들어가지 않는다. 혹시나 하나의 적 오브젝트가 여러번 들어가는 것을 방지하기 위해 넣어줬다.
이렇게 하면, 리스트에 감지된 적이 모두 들어가게 된다.
유도탄 구현
이제 감지한 적에게 유도탄을 선물해줄 차례이다.
어떻게 구현할까 하고 고민하면서 구글을 뒤져보고 있었는데, 언리얼에서 무려 유도탄 기능을 제공해주고 있다는 것을 알았다.
그래서 바로 그 기능을 이용하여 구현에 들어갔다.
발사체 BP 생성
우선, 유도탄이 되어줄 발사체(Projectile)의 블루프린트를 액터 형식으로 만들었다.
그리고 유도탄처럼 보이도록 간단하게 외형을 만져줬다.

그리고, 어딘가에 맞으면 터지는 이펙트와 함께 액터를 파괴하도록 이벤트그래프를 짜줬다.

이렇게 유도탄의 탄알 자체는 구현이 완료되었다.
이제, 유도 기능을 만들 차례이다.
유도 기능 구현
유도 기능을 넣어주기 위해선, 타겟을 정확하게 설정해줄 필요가 있다.
이 스킬은 타겟으로 지정할 수 있는 적의 수에 한계치가 있기 때문에, 탐지된 적들 중에서 한계치 내로 적들을 다시 선택하는 작업을 해주어야 한다.
타겟 저장

간단하게 설명하자면, 아까 탐지해서 저장했던 배열을 반복을 돌며 실제 타겟이 될 적들의 배열 (Real Targets Q)에 넣다가, 만약 그 배열의 길이가 한계치 변수 (Enemy Nums Q)에 도달했다면 Break 시켜주는 구조이다.
이렇게 타겟을 모두 저장했다면 이제 유도시켜서 발사할 차례이다.
딜레이 루프 매크로 구현
그 전에, 유도탄을 어떻게 발사할지 생각해봤다.
'카이사처럼 한발식 다다다다다 발사해야겠다' 하고 로직을 짜봤는데, 치명적인 난관을 만났다.바로 언리얼에서 기본제공하는 루프에는 딜레이가 없다는 것이다...루프에 딜레이를 걸어도 병렬처리되는건지 딜레이가 다음 번째 반복을 지연시켜주지는 않았다.그래서, 딜레이가 있는 루프를 직접 만들기로 했다.
언리얼에는 이걸 도와주는 사용자 지정 매크로 기능이 있다.이걸 이용하여 원래 제공되던 루프 구조를 베껴 딜레이만 넣어주었다.

그리고, 이걸 이용하여 유도탄 타겟 설정 및 발사 로직을 짰다.
유도탄 발사 로직 구현

로직부터 설명하자면,
- 아까 만들어둔 실제 타겟 리스트를 기준으로 반복을 돌되, 0부터 길이 - 1까지의 범위에서 돈다.
- 그리고, 유도할 타겟을 (현재 인덱스 % 리스트의 길이) 로 설정한다.
- 발사체를 소환하고, 회전각도를 랜덤으로 설정한다.
- 발사체의 Projectile Movement에 접근해 호밍 타겟 컴포넌트를 아까 설정한 유도할 타겟으로 설정한다.
이렇게 되면 발사체가 의도한 적을 타겟으로 잡고 날아가서 터지게 된다.
어 왜 유도할 타겟을 (현재 인덱스 % 리스트의 길이)로 설정했어요?
원래는 한계치를 5명으로 설정하고 For Each문을 돌며 타겟당 한발씩 쏘기로 했는데, 5명의 적이 앞에 있으면 문제가 없지만 그보다 적은 수의 적이 앞에 있다면 5발을 다 발사하지 않고 스킬이 끝나는 현상이 발생했다.
그래서, 타겟 리스트 중심으로 For Each를 도는 것이 아닌 발사할 유도탄의 수로 For 문을 돌며 리스트 내의 적을 타겟으로 보는 것을 채용했다.
그리고, 만약 2명의 적이 있다면 유도탄을 순서대로 1 - 2 - 1 - 2 - 1 번의 적에게 발사하는 로직을 적용하여 복잡함을 줄이고자 한것이다.
여기까지 구현하면, 유도탄이 플레이어에서부터 나와서 적을 추적해 폭발하게 된다.
이펙트 적용
이제 유도탄을 예쁘게 꾸밀 차례이다.
유도탄 궤적 효과 적용

Trail은 발사체가 날아가는 궤적에 그려지는 이펙트이다.
그래서 발사체가 시작될 때(생성될 때) 이펙트를 그려주었다.
그리고 뒤에 호밍 가속 규모 설정은, 현실에 있는 미사일의 로직을 적용한 것이다.
현실의 미사일은 한번에 슈우우웅 하고 날아가지 않고 슈웅...푸쉬이이익! 하면서 날아가기 때문에 순간 가속도를 크게 설정하여 그를 나타내고자 했다.
카메라 효과 적용

간단하게 카메라 흔들림 효과와 카메라에 비치는 이펙트를 넣었다.
카메라 흔들림은 회전 진동을 주면 어지러운 감이 있어서 FOV 진동으로 설정했다.
그리고 카메라 이펙트는 에셋에서 제공되는 것이었는데, 이리저리 다뤄보다가 카메라 위치에 보여주면 전체화면에 맞게 딱 떨어지는걸 발견하고 바로 넣어줬다.
결과
그렇게 해서 유도탄을 발사하는 Q 스킬을 구현 완료했다!
앞에 적이 많으면 분산돼서 발사되고, 적이 한명만 있으면 점사해서 발사하는 것까지 잘 된다.
이제 다음 시간이 중간 발표이다...
기획도 설명하고 역할 분배도 설명하고 개발한것도 설명하고 할게 무진장 많다...
하지만 해내야한다.
다음 해야할 것은 남은 스킬 구현이다.
앞으로 이렇게만 하자..!

'팀 프로젝트 > Side Project' 카테고리의 다른 글
[2024-2 겜엔기] Project AS 개발일지 #3 (1) | 2024.10.07 |
---|---|
[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
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!