본문 바로가기
언리얼엔진/프로젝트

[UE5] 언리얼엔진 미니 게임 프로젝트

by msugi 2024. 12. 17.

 

언리얼 엔진을 한달 정도 학습 후, 간단한 언리얼 엔진 미니 게임 프로젝트를 약 한달정도 진행해 보았다.

프로젝트 이름은 BossTry로 간단하게 3인칭 시점의 캐릭터로 보스와 전투하는 게임을 만들어 보았다.

전반적인 게임의 흐름과 내용은 다음 동영상과 같다. 

 

 

해당 프로젝트는 1인 개발이며, 개발환경은 언리얼엔진 5.4.3 ~5.4.4버전을 사용했다.
기본적으로 제공하는 에셋을 많이 사용 했다. (보스,캐릭터 모델링 등)

언리얼 엔진의 다양한 기능을 사용하는 것이 목적인 프로젝트로 주로 블루프린트(BP)를 사용하여 만들었으며,
짧은 기간동안 다양한 것을 시도하다보니 하드코딩된 기능들도 존재한다.

하고있는 다른것을 마무리하면 해당 프로젝트를 c++로 포팅하는 과정을 진행할 예정이다.

 

저장소로는 git lab을 사용했고, 소스트리를 이용해 관리했다.
개발은 다음과 같이 진행이 되었다. 

 

개발에 사용된 기능과 구조들은 최대한 동영상 순서대로 진행하며 설명 할 예정이며, 중간중간 추가될 예정이다.

 

1. 타이틀 UI , GameHUD

더보기

 

 게임을 시작하면서 타이틀 UI를 보여주기 위해서 GameHUD를 만들고 시작하면 마우스 커서를 표시하고,
 타이틀UI를 보여주는 widget을 만들어준다. 

HUD

 

 타이틀 UI에 사용된 모델은 다음과 같다.

Title UI

 HUD에서 타이틀 UI가 생성되고,

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

Tilte UI 생성시 실행

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

레벨시퀀스

 

 GameStart와 LogOut은 패널안에 [팔레트 - 일반 - 버튼]을 넣어 만든다.
 클릭시 기능을 다음과 같이 만들어 준다.

 GameStart를 누르면 클릭 효과음이 나오고, 타이틀 UI가 제거되고, 재생되던 BGM이 종료되고, 분리되어있던 사용자 컨트롤러를 연결하며, 새로운 BGM이 실행되고, 메인게임에서 사용할 메인 UI를 장착하는 기능을 시행하도록 설정했다.
 과정은 다음과 같다.

Title UI GameStart 클릭 1-1
Title UI GameStart 클릭 1-2
Title UI GameStart 클릭 1-3

 

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

Title UI LogOut 클릭

 

2. 메인 UI

더보기

 

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

Main UI

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

Main UI 그래프

 

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

PlayerHP 프로그레스 바인딩
PlayerHP Text 바인딩
get Hp Percent
get PlayerHp Text

 

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

Boss Hp Text

 

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

CoolDown

 

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

MP가 부족합니다.

 

 

3. 플레이어 캐릭터 (이동, 조작, 기본 공격)

더보기

 

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

BossTryCharacter.h - 컨트롤러 소켓 추가
BP와 공유하는변수추가
사용된 컨트롤러
컨트롤러 에셋에 등록

 

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

slot 과 basic에 몇가지 모션을 추가
Notify 사용을 위한 밑작업

 

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

IA_Attack 이 눌렸을 경우
몽타주의 Notfiy에서 SaveCombo가 실행
기본공격 몽타주
몽타주의 Notfiy에서 ResetCombo가 실행

 

위와 같은 방법으로 4가지의 기본공격을 만들고, Trail 효과로 공격에 잔상효과를 주고, 효과음을 추가했다.

 

4. 플레이어 캐릭터 (스킬, 충돌)

더보기

 

캐릭터의 스킬 사용은 쿨타임, mp, 다른 스킬사용중 등의 조건들을 검사한 후
스킬사용 몽타주와 mp소모 이펙트 등이 나오도록 다음과 같이 설정했다.
 이펙트는 Notify에서 파티클 이펙트 재생기능을 사용했다.
 mp소모는 일단 기본적으로 모든스킬10으로 통일했다.

스킬사용
CoolDown설정(-1초/s)
mp량 체크, mp 감소

 

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

몽타주 뒤에 투사체를 스폰
투사체

 

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

투사체 내부구조

 

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

각각 태그설정
충돌시 태그 확인

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

충돌 on, off

 

5. Boss (이동, 비헤이비어트리)

더보기

 

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

몽타주 사용을 위해 slot 추가
Notify 사용을 위한 기본작업

 

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

Boss BT

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

사용된 BTT


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

BTT_Attack1

 

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

BTT_Dash 1-1
BTT_Dash 1-2
BTT_Dash 1-3

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

공격예고 static Mesh
static Mesh호출시 크기 계산후 2초뒤 사라지도록 설정

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

BTT안에서 확률변수처리

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

투사체 종류

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

Boss 투사체 1-1
Boss 투사체 1-2
Boss 투사체 1-3

 

 

6. 피격모션 / 대미지 처리 / 슈퍼아머 처리

더보기

 

플레이어 캐릭터의 피격모션은 공격을 받았을때 hp 감소 판정을 받고,
피격 몽타주를 실행 하는 방식으로 구현했다.

Boss 무기와 캐릭터가 충돌판정 된후 Player Damage 함수를 호출

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

플레이어 캐릭터 피격처리

 

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

플레이어 캐릭터 무기와 Boss가 충돌판정 된후 Damage 함수를 호출
Boss 피격처리(BP)1-1
Boss 피격처리(BP)1-2

 

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

슈퍼아머 세팅
BTT_슈퍼아머

 

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

Boss 피격처리 BTT_HitMotion

 

7. 메뉴창UI / 게임 엔딩 UI

더보기

 

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

메뉴 UI

 

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

Esc 버튼 누르면 동작

 

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

메인 UI 그래프

 

게임의 엔딩은 크게 2가지로 만들었다.
Boss의 hp가 0 이되어 승리처리, 플레이어 캐릭터의 hp가 0 이되어 사망처리
Boss의 hp가 0 이 될때 과정은 다음과 같다.

 

 BTT에서 hp<0 을 확인하고 보스의 공격 충돌 판정을 모두 off 하고 Set Death 함수를 호출한다.

BTT_BossDeath

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

보스 사망처리
clear! UI

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

승리판정후 UI 출력
UI 출력후 타이틀로 이동

 

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

Notify의 PlayerDead함수 호출 , Dead UI

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

승리판정후 Dead UI 출력
UI 출력후 타이틀 이동