언리얼 엔진을 한달 정도 학습 후, 간단한 언리얼 엔진 미니 게임 프로젝트를 약 한달정도 진행해 보았다.
프로젝트 이름은 BossTry로 간단하게 3인칭 시점의 캐릭터로 보스와 전투하는 게임을 만들어 보았다.
전반적인 게임의 흐름과 내용은 다음 동영상과 같다.
해당 프로젝트는 1인 개발이며, 개발환경은 언리얼엔진 5.4.3 ~5.4.4버전을 사용했다.
기본적으로 제공하는 에셋을 많이 사용 했다. (보스,캐릭터 모델링 등)
언리얼 엔진의 다양한 기능을 사용하는 것이 목적인 프로젝트로 주로 블루프린트(BP)를 사용하여 만들었으며,
짧은 기간동안 다양한 것을 시도하다보니 하드코딩된 기능들도 존재한다.
하고있는 다른것을 마무리하면 해당 프로젝트를 c++로 포팅하는 과정을 진행할 예정이다.
저장소로는 git lab을 사용했고, 소스트리를 이용해 관리했다.
개발은 다음과 같이 진행이 되었다.
개발에 사용된 기능과 구조들은 최대한 동영상 순서대로 진행하며 설명 할 예정이며, 중간중간 추가될 예정이다.
1. 타이틀 UI , GameHUD
게임을 시작하면서 타이틀 UI를 보여주기 위해서 GameHUD를 만들고 시작하면 마우스 커서를 표시하고,
타이틀UI를 보여주는 widget을 만들어준다.

타이틀 UI에 사용된 모델은 다음과 같다.
![]() |
![]() |
![]() |

HUD에서 타이틀 UI가 생성되고,
UI가 생성되면 BGM, 레벨시퀀스가 실행되도록 타이틀 UI 그래프에 다음과 같이 설정한다.
과정은 다음과 같다.

레벨시퀀스는 다음과 같이 설정했다.

GameStart와 LogOut은 패널안에 [팔레트 - 일반 - 버튼]을 넣어 만든다.
클릭시 기능을 다음과 같이 만들어 준다.
GameStart를 누르면 클릭 효과음이 나오고, 타이틀 UI가 제거되고, 재생되던 BGM이 종료되고, 분리되어있던 사용자 컨트롤러를 연결하며, 새로운 BGM이 실행되고, 메인게임에서 사용할 메인 UI를 장착하는 기능을 시행하도록 설정했다.
과정은 다음과 같다.



LogOut은 클릭 효과와 페이드 효과를 준다음 게임을 종료 하게 설정했다.
과정은 다음과 같다.

2. 메인 UI
타이틀 UI의 GameStart를 누르면 타이틀 UI는 삭제되고, 메인 UI가 생성된다.
이때 생성되는 메인 UI에 사용된 모델들은 다음과 같다. (타 게임들에서 사용하는 이미지를 가져왔다.)


Main UI가 실행되면 Main UI의 아이콘에 설정된 각 기능들이 보여진다.
다음과 같은 함수들이 구성되어있다.

Player 의 Hp의 값이 최대 값보다 줄어들 경우 프로그레스바 기능을 사용해 [빨간색 -> 투명]으로 변하도록 설정하여,
HP의 감소를 눈으로 확인할 수 있도록 표현하고, HP의 수치를 텍스트로 표현해 HP가 얼마나 남았는지 확인할 수 있도록 구현했다.
과정은 다음과 같다.




Player Mp 도 동일한 방법으로 구현했으며,
Boss의 HP도 비슷하나 보스가 죽거나 제거되면 작동을 하면 안되기 때문에 if(isValid) 를 이용했으며,
수치를 퍼센트로 표시, 소수 2번째 자리까지 표현하기 위해 다음과 같이 구성했다.

CoolDown을 표현하기 위해서 다음과 같이 구성했다.

Mp가 부족할 경우 경고 문구 출력은 다음과 같이 구성했다.

3. 플레이어 캐릭터 (이동, 조작, 기본 공격)
플레이어 캐릭터 구성은 언리얼에서 기본적으로 제공하는 에셋을 사용했다.
기본조작은 WASD의 기본 구성을 사용했으며, 스킬, 달리기, 공격등은 컨트롤러를 통해 추가했다.
추가한 내용은 다음과 같다.





플레이어 캐릭터의 애니메이션은 기본에셋의 몽타주를 사용하기위해 다음과 같이 추가했다.



기본적인 공격 4가지 콤보 공격으로 구성했으며, IA_Attack이 작동하면 현재 동작을 검사한뒤 기본공격을 진행
이때 몽타주로 공격모션을 재생하며, 몽타주의 Notify기능을 사용해 combo공격이 가능하도록 저장하고,
리셋하는 기능을 방법을 사용해 다음과 같이 구성했다.





위와 같은 방법으로 4가지의 기본공격을 만들고, Trail 효과로 공격에 잔상효과를 주고, 효과음을 추가했다.
4. 플레이어 캐릭터 (스킬, 충돌)
캐릭터의 스킬 사용은 쿨타임, mp, 다른 스킬사용중 등의 조건들을 검사한 후
스킬사용 몽타주와 mp소모 이펙트 등이 나오도록 다음과 같이 설정했다.
이펙트는 Notify에서 파티클 이펙트 재생기능을 사용했다.
mp소모는 일단 기본적으로 모든스킬10으로 통일했다.



다른 스킬들도 위와 같은 방법으로 구성했으며,
투사체를 날리는 스킬은 현재 캐릭터의 위치와 보는 방향을 가지고 스폰 하는 방법을 사용했다.



스폰된 투사체가 바로 캐릭터가 보는 방향을 가져와 정규화를 이용해 방향벡터를 구해
해당방향으로 일정시간 날라가다 사라지도록 구현했다. (충돌시 바로 제거)

캐릭터의 충돌은 플레이어 캐릭터에는 태그에 Player,
Boss에는 Enemy를 추가하여 플레이어 캐릭터가 boss공격할때
플레이어 캐릭터의 충돌이 on 상태에서 Enemy와 충돌이 일어나야 충돌 이벤트가 발생하고,
boss가 플레이어 캐릭터를 공격할때는 boss의 충돌이 on 상태에서 player와 충돌이 일어나야
충돌 이벤트가 발생하도록 설정했다.
그 과정은 다음과 같다.




플레이어 캐릭터와 boss의 충돌 on, off설정은 몽타주의 notify에서 Weapon이 공격모션이 진행하는 동안
이벤트가 발생하도록 설정했다. Boss도 동일하게 설정했다.

5. Boss (이동, 비헤이비어트리)
Boss의 구성은 언리얼 엔진에서 제공하는 기본 에셋을 사용했다.
이동과 공격애니메이션은 몽타주를 추가해 사용했으며, 플레이어 캐릭터와 동일하게 Notify를 활용했으며,
패턴과 조작은 비헤이비어트리를 이용해 움직이도록 AI를 만들었다


Boss의 움직임과 AI는 비헤이비어 트리를 이용했으며,
간단히 설명하면 플레이어 캐릭터와의 거리가 2000 이상이면 대기상태,
거리가 2000이하이면 플레이어 캐릭터를 추적해 따라가도록 설정,
거리가 1200~2000일때 마법스킬, 거리가 1200 ~ 350일때 돌진스킬,
350 이하면 기본공격, Boss Hp가 0 일때 사망처러, 피격시 모든공격을 중단하고 피격처리,
슈퍼아마 상태 처리, 확률변수(여러가지 공격이 동일한 확률로 처리) 등을 처리한다.
그 과정은 다음과 같다.

비헤이비어 트리안에 사용된 BTT는 다음과 같다.

기본 공격 BTT는 공격전 플레이어 캐릭터의 위치를 확인하고,
로테이션 시켜 공격몽타주를 재생하는 방법을 사용했다.
과정은 다음과 같다.

돌진 스킬 BTT는 공격전 플레이어 캐릭터의 위치와 거리를 계산하고, 공격예고 장판을 생성한 후,
해당방향으로 돌진하는 이동 공격을 몽타주와 함께 재생하는 방법을 사용했다.
과정은 다음과 같다.



공격 예고는 충돌하지않는 Static Mesh를 스폰했다 제거하는 방법을 사용했으며, 공격 예고의 장판 크기는 정규화를 이용해 방향벡터를 구해 해당 방향으로 크기를 늘리는 방법으로 계산해 크기를 맞췄다.
그 과정은 다음과 같다.




기본 공격과 돌진 스킬은 비헤이비어 트리에서의 확률 변수를 통해 다양한 공격을 하도록 설정을 했으며,
Boss의 투사체 공격은 위와 비슷하게 구성했으나 비헤이비어 트리에서 확률을 받아와 BTT안에서 처리하도록 한 점만 다르다. 추가되는 과정은 다음과 같다.

3종류의 투사체를 사용 , 각각 충돌시 다른 이펙트가 출력되도록 설정, 공격예고 장판 스폰됨

투사체 스폰시 플레이어 캐릭터 방향을 가져와 정규화를 이용해 방향벡터를 구한뒤
해당방향으로 일정시간 날라가다 사라지도록 구현했다. (충돌시 이펙트 출력후 제거)
그 과정은 다음과 같다.



6. 피격모션 / 대미지 처리 / 슈퍼아머 처리
플레이어 캐릭터의 피격모션은 공격을 받았을때 hp 감소 판정을 받고,
피격 몽타주를 실행 하는 방식으로 구현했다.

보스 공격이 어떤 공격이였는지를 판별하고, 각기 다른 대미지를 플레이어에게 준다.
이때 hp가 0보다 아래가 된다면 사망처리 몽타주와 사망처리 함수를 호출,
hp가 0보다 크다면 피격 모션 몽타주 처리와 해당 몽타주 실행중 다른행동이 불가능 하도록 처리했다.
그 과정은 다음과 같다.

Boss 가 플레이어 캐릭터로부터 공격을 받았을때 Boss hp 감소 판정을 받고,
피격 몽타주를 실행 하는 방식으로 구현했으며, 이때 너무 많은 공격을 받으면 슈퍼아머 상태가 되도록
만들었고, 일정공격을 더 받거나 스킬을 맞으면 슈퍼아머가 풀리도록 만들었다.
그 과정은 다음과 같다.



일정횟수이상 피격당하면 overlay Material Max Draw Distance의 수치를 0으로 바꿔 슈퍼아머를 on 하고,
특정 조건을 만족하면 -1로 off 하는 방법을 사용했다.



슈퍼아머 상태가 아니라면 Boss는 피격당하면 하던 공격, 충돌판정 모두 멈추고 피격모션을 실행하도록 설정 했다.
해당 과정은 다음과 같다.

7. 메뉴창UI / 게임 엔딩 UI
Esc 버튼을 통해 게임중 메뉴를 열수있는 UI를 구현했다.

Esc 를 누르면 위와 같은 UI가 기존 UI위에 블러처리되면서 추가로 생성되며,
마우스 커서가 나오도록하고, 게임을 중단 시킨다.

New Game : 레벨을 새로 시작
Continue Game : 현재 UI 지우고, 마우스 커서 지우고, 게임 재진행 실행
End Game : 게임종료

게임의 엔딩은 크게 2가지로 만들었다.
Boss의 hp가 0 이되어 승리처리, 플레이어 캐릭터의 hp가 0 이되어 사망처리
Boss의 hp가 0 이 될때 과정은 다음과 같다.
BTT에서 hp<0 을 확인하고 보스의 공격 충돌 판정을 모두 off 하고 Set Death 함수를 호출한다.

SetDeath에서 게임의 속도를 느려지게하고, 보스의 사망모션을 몽타주로 출력을 한다.
몽타주의 Notify에서 DeadBoss가 실행되고, 실행되면 잠시후 보스를 레벨에서 제거하도록 구현했다.


보스가 제거되면서 승리에 대한 판정을 한다(보스와 플레이어 캐릭터중 먼저 hp가 0이된곳 판단)
판정후 승리로 판단되면 Celar! UI를 생성하고 승리 효과음 재생후 타이틀 UI로 이동하도록 구현했다.
그 과정은 다음과 같다.


캐릭터의 hp가 0이 될때 과정은 다음과 같다.
6. 피격모션 / 대미지 처리 / 슈퍼아머 처리 에서 피격모션 판정에서 hp가 0이면 사망 몽타주가 실행되는데
이때 사망 몽타주의 Notify에서 PlayerDead함수를 호출하게 된다.


PlayerDead에서 승리에 대한 판정을 한다(보스와 플레이어 캐릭터중 먼저 hp가 0이된곳 판단)
판정후 Boss의 승리로 판단되면 Dead UI를 생성하고 효과음 재생후 타이틀 UI로 이동하도록 구현했다.
그 과정은 다음과 같다.

