[이득우 언리얼 C++] 15. 게임의 완성

    💻 Code : https://github.com/tedison7/ArenaBattle

    게임 데이터의 저장과 로딩

    플레이어의 데이터를 저장하고 불러오는 로직을 구현해보자. 언리얼 엔진은 게임의 데이터를 저장하고 불러들이는 기능을 제공한다. SaveGame이라는 언리얼 오브젝트를 상속받은 클래스를 설계해보자. ABSaveGame 클래스를 생성하였다.

    이후 SaveGame을 PlayerState 등에 연결하여 UI에 플레이어 데이터가 나타나도록 예제를따라 코드를 작성하였다. 그리고 플레이어 데이터가 초기화되어 적용된 화면을 확인할 수 있다.

    이어서 플레이어 관련 데이터가 변경될 때마다 저장하도록 해보자

    그리고 PlayerState의 HighScore 값을 HUD UI에 연동하자

    빌드후 플레이를 눌러서 NPC를 처치하면 경험치 데이터와 최고 점수 기록이 저장되어있음을 확인할 수 있다.

    전투 시스템의 설계

    다음의 요소를 추가하여 게임의 완성도를 높혀보자

    • 플레이어는 게임 진행중에 HP를 회복할 수 없고, 오직 레벨업을 할 때만 회복
    • 캐릭터는 무기를 들때 더 긴 공격 범위를 가짐
    • 무기에는 공격력 증가치가 랜덤으로 부여되며, 운이 없으면 무기에 의애 공격력 저하
    • 현재 게임 스코어가 높을수록 생성되는 NPC의 레벨도 증가

    1번 항목을 구현이 되어있고 2번을 구현해보자.

    이러면 무기를들때 무기없는 NPC보다 긴 공격 범위를 가지게 된다. 다음으로 3번 기획을 구현해보자

    컴파일후 플레이해보면 무기를 습득할 때 해당 무기에 의해 플레이어의 공격 대미지가 변화되는것을 확인할 수 있다.

    마지막 기획요소인 NPC 의 레벨을 조정하는 기능을 구현해보자. NPC 캐릭터의 LOADING 스테이트에서 현재 게임스코어를 확인하여 이를 기반으로 캐릭터의 레벨값을 설정한다.

    코드 작성후 플레이를 해보면 섹션을 통과하면서 적이 점점 강해지는것을 확인할 수 있다.

    타이틀 화면의 제작

    타이틀 화면을 추가해보자 예제 파일에서 UI_Title.uasset 파일을 복사하였다. Title 이라는 공백 레벨을 생성하였고, 해당 레벨을 조작할 PlayerController 클래스를 상속받는 ABUIPlayerController 라는 클래스를 생성하였다.

    그리고 콘텐츠 브라우저에서 블루프린트 클래스 메뉴를 선택하여 ABUIPlayerController 를 상속받는 BP_TitleUIPlayerController 이름의 블루프린트 애셋을 생성한다. 생성한 애셋의 UIWidgetClass를 UITitle로 설정을 하였다.

    이제 이 플레이어 컨트롤러를 띄울 게임모드를 생성하자. GameModeBase를 상속받는 BP_TitleGameMode 이름의 블루프린트 애셋을 생성한다. 생성한 애셋의 에디터 창을 띄워 클래스 정보를 다음과 같이 설정하였다.

    월드세팅의 게임모드를 BP_TitleGameMode로 설정하여 플레이를 해보면 타이틀 UI가 화면에 뜨는것을 확인할 수 있다.

    이어서 예제파일중 UI_Select.uasset파일을 복사하였고, Select.umap 레벨 파일도 복사하였다. 타이틀과 동일한 방법으로 ABUIPlayerController를 상속받은 BP_SelectUIPlayerController 블루프린트를 생성하였고, UIWidgetClass를 UI_Select로 지정하였다. 또한 BP_SelectGameMode라는 게임모드를 생성하여 설정하였다. 마지막으로 Select 맵의 월드세팅을 BP_SelectGameMode를 기본으로 지정해주었다.

    플레이를 해보면 캐릭터 선택화면이 보여짐을 확인 할수 있다.

    UI로딩을 완료하였으니 C++로 버튼의 로직을 구현해보자. UserWidget을 상속받는 ABCharacterSelectWidget 클래스를 생성하였다.

    UI_Select 애셋의 부모클래스를 ABCharacterSelectWidget 으로 변경하여 캐릭터 변경 버튼이 동작함을 확인할 수 있다.

    이어서 선택한 캐릭터가 게임플레이에서도 동일하게 나오도록 해보자

    그리고 프로젝트 세팅의 Title 레벨을 기본 레벨로 설정하자. 컴파일후 실행해보면 선택창에서 선택한 캐릭터로 게임을 시작하는것을 볼수 있다.

    게임의 중지와 결과 화면

    예제 파일 폴더에서 UI_Menu.uasset 파일과 UI_Result.uasset 파일을 복사하였다. 그리고 GamePause라는 액션 매핑을 M 키로 추가하였다.

     

    이어서 UserWidget을 상속받는 ABGamePlayWidget 클래스를 생성하였다.

    위젯의 뼈대가 완성되었으니 M 키를 눌렀을때 메뉴 UI가 뜨도록 해보자. 메뉴 UI가 나오면 다음과 같은 사항들을 고려해야한다.

    • 게임 중지
    • 버튼 클릭을 위해 마우스 커서 보여주기
    • 입력이 게임에 전달되지 않고 UI에만 전달되도록 제어

    컴파일후 실행하여 M 키를 눌러 메뉴 UI가 뜨는것을 확인할 수 있다.

    메뉴 버튼에 대한 동작을 구현해보자.

    빌드후 메뉴버튼을 테스트해보면 게임으로 돌아가거나 타이틀로 돌아가는 것을 확인할 수 있다.
    다음으로 결과 화면 UI를 표시해보도록 하자. ABGamePlayWidget을 상속받는 ABGamePlayResultWidget 클래스를 생성하였다.

    UI_Result 애셋의 부모클래스를 ABGamePlayResultWidget클래스로 지정하고 이제 게임이 종료될때 UI가 띄워지도록 로직을 구성해보자

     이후 책의 예제코드를 따라 나머지 코드를 작성하였다. 작성한 코드를 정리하기엔 양이 많아서 Github에 올려두는것으로 대체하고자 한다. 그리고 플레이어가 죽거나 클리어조건을 만족하면 결과 UI가 뜨는것을 확인하였다.

    여기까지 책의 내용을 모두 따라하였다.

    요약

    • 데이터 저장과 로딩 방법
    • 타이틀 화면에서 게임화면으로 레벨 이동
    • 게임 중지와 결과 화면 처리
    반응형

    댓글

    Designed by JB FACTORY