이 글은 특정 툴을 소개하거나, 사용법, 꿀팁 공유 등을 하는 것이 아닌, 협동 프로젝트 진행 과정을 단순하게 저장해놓은 글입니다. 이러 이러한 것들을 썼지~ 이러 이러한 과정이 있었지 ~ 라는 것을 기억해두기 위해 남겨놓은 글일 뿐입니다.
이전 주차까지 진행했던 캐릭터 리깅작업을 마치고 드디어 기능 구현을 시작했습니다.
진행하기에 앞서, 처음에 클릭 이동 방식으로 진행하기로 한 프로젝트는 갈아엎고(?) 키보드 조작으로 변경하기로 했습니다.
(내려받았던 에셋의 기본 조작법이 키보드 조작이었기 때문에 변경하는 데 오래 걸리지 않았습니다.)
내려받은 에셋에서, 간단히 새로 추가해서 수정해준 것들을 나열하자면, 마우스 휠로 카메라 거리 조정하기, 화면 회전 최대, 최소 반경 지정하기 입니다.
카메라 거리 조절을 위해 프로젝트 세팅에서 마우스 휠에대한 바인딩을 지정해줍니다.
-100으로 지정한 이유는 마우스 휠을 내리면 값이 -이고, 휠을 올리면 +이기 때문에, 휠을 아래로 내렸을 때 카메라 거리를 늘리기 위해서입니다.
이제 카메라 거리는 어떻게 조절하는가...
카메라는 캐릭터 블루프린트에 있는 SpringArm 컴포넌트에 부착되어 있습니다.
그러니, 휠을 내리면 SpringArm의 거리를 늘리고, 휠을 올렸을 때 거리를 좁혀주면 됩니다.
블루프린트에서 다음과 같이, 카메라 거리를 조정만 해주면 끝.
최대 거리는 4000, 최소 거리는 500으로 무한이 멀어지거나 가까워지지 않도록 지정해줍니다.
화면 회전 최대, 최소 반경은 위 아래만 지정해주었습니다. 위 아래의 회전 반경을 지정하는 방법은, 플레이어 컨트롤러에서 다음 블루 프린트를 추가해줍니다.
편리하게도 그 값을 카메라 변수에 미리 지정해 두었군요..
이어서, 직업별 캐릭터 공격 기능입니다. 가장 먼저 진행해준 캐릭터는 활을 사용하는 궁수 캐릭터입니다.
궁수 캐릭터는 공격키를 누르면 화살이 나가고, 화살에 맞으면 데미지를 주는 방식을 채택했습니다.
그리고, 일정 시야각에 보이는 대상을 자동으로 조준해 공격하도록 편의성을 추가했습니다.
... 어떻게 할지 정했으니 만들어야죠..?
공격 바인딩 부터 해줍니다.
일정 시야각에 보이는 대상을 자동 조준하기로 했으니, 그 시야각을 지정해주겠습니다.
간단하게.. 박스 콜리전으로 만들어줍니다.
공격키를 누르면, 대상을 향해 바라보고 활을 쏴야합니다. 그러므로, 먼저 바라볼 대상을 저장해줄 함수를 구성해줍니다.
MonsterCollision은 몬스터의 콜리전으로, 몬스터의 피격 판정을 담당할 콜리전입니다. 해당 콜리전을 가지고 있다면, 몬스터(적)로 판정됩니다.
다음으로 대상을 바라보는 함수를 만들어줍니다.
중요한 점은, 이 바라보는 행동이 클라이언트에서만 일어나서는 안 됩니다. 처음에 테스트 용으로는 할 때는 잘 되었는데 서버 빌드를 하고 테스트 하니, 다른 플레이어 시점에서는 가만히 같은 방향만 바라보고 있었습니다.
즉, 서버에 리플리케이트 시켜주고, 다른 클라이언트들에게도 리플리케이트 시켜줘야합니다.
만들어준 블루프린트를, 공격 이벤트에 연결해줍니다. Character 변수는, 공격을 진행한 캐릭터를 참조해 받아옵니다.
공격을 했으니, 화살에 맞으면 데미지를 주어야겠죠!
일단 화살 블루프린트를 만들어줍니다. 그 화살에 콜리전을 적용해주고, 그 화살에 닿았을 때 데미지를 주도록, 이벤트를 설정해줍니다.
이제는 화살을 날려봅시다. 화살은 활의 위치에서 발사되어 몬스터에게 향하도록 지정해주겠습니다.
소켓 이름의 BowEmitterSocket은 활에서 화살이 발사되는 지점입니다.
그런데, 이렇게 지정하고 테스트를 해보니 한 가지 문제점이 발생했습니다. 화살의 방향이 계속 고정되어있어서 화살이 대상을 향해 뻗어가는 느낌을 주지 못합니다. 화살이 보는 방향과 날아가는 방향이 불일치하는 문제가 발생한 것입니다.
이를 해결해봅니다.
1. 발사한 캐릭터의 활의 위치를 불러옵니다.
2. 화살이 날아갈 목표 지점을 불러옵니다.
3. 활의 위치에서 목표 방향을 바라보는 Rotation값으로 화살의 Rotation을 지정시킵니다.
마지막, 캐릭터의 shootArrow 이벤트의 마지막에 위에서 만든 이벤트를 호출하도록 합니다.
이어서 전사 캐릭터를 진행합니다.
전사는 궁수와는 다르게, 지정한 범위(궁수에서는 시야각이라고 표현했습니다.) 내에 몬스터가 있다면 그 몬스터들에게 모두 데미지를 입히도록 했습니다.
AttackPoint1과 AttackPoint2 사이에 사각형 판정 범위(박스 트레이스)를 생성해 데미지를 줍니다.
데미지를 주는 것은 항상 서버인 것을 잊지 말도록 합니다. (Show Damage Effect는 피격 효과를 위한 파티클 생성 함수입니다.)
전사가 데미지를 주는 순간은 언제일까요? 당연히 검으로 대상을 베는 순간이겠죠! 그 순간에 데미지를 주는 함수가 작동할 수 있도록 지정해주겠습니다.
공격용 애니메이션 몽타주로 이동해 데미지를 줄 시점과 공격이 끝나는 지점에 노티파이를 지정해줍니다
애니메이션 블루프린트에서 해당 노티파이에 대한 이벤트를 완성시키면 끝!
그런데... 또 한가지 문제점이 발생합니다.
전사가 공격할 때 마다 계속 데미지를 2번씩 입히더군요.
이 문제를 발견하고 해결하는 데 시간을 많이 허비했습니다..
제가 찾은 해결 방법은 아래 링크에 따로 정리해두었습니다.
해결 방법 : [UE5] ApplyDamage가 두 번 적용될 때
위에서 발생한 문제를 해결 하고, 반영시키면 끝!
다음 시간에는 몬스터들의 애니메이션들을 추가한 뒤, 몬스터의 움직임을 구현해보겠습니다.
'언리얼 엔진(Unreal Engine) > 협동 프로젝트' 카테고리의 다른 글
[UE5] CastleRPG(최종) - 완성 (0) | 2022.12.16 |
---|---|
[UE5] CastleRPG(5) - 몬스터 AI (0) | 2022.11.23 |
[UE5] CastleRPG (3) - 몬스터 리깅, NPC 리깅, 애니메이션 제작 (0) | 2022.10.04 |
[UE5] CastleRPG (2) - 몬스터 리깅 (0) | 2022.09.27 |
[UE5] CastleRPG (1) - 캐릭터, 건물 메시 수집 ( + 무료 에셋 사이트 ) (1) | 2022.09.21 |