[리그오브워치개발일지] #3 기본 게임 규칙 구현 : 플레이어 캐릭터
[velog에서 블로그 이전하며 가져온 글입니다]
작성 일자 : 2023년 8월 10일
Git
레포지토리 주소 : https://github.com/kjinwoo12/UE5Game_LeagueOfWatch
기준 브랜치 : 3_BasicGameRuels1
개발 내용 정리
이전글에서는 플레이어 조작을 구현했다. 조작할 수 있는 캐릭터로 게임 안을 돌아다닐 수 있게 되었다. 이번엔 단순히 돌아다니는 것을 넘어서 기본적인 게임의 규칙을 구현하고자 한다. 아래는 처음 정했던 기본 게임 규칙이다.
- 게임이 시작하면 캐릭터를 선택하는 화면이 등장하고, 유저의 캐릭터 선택을 45초 동안 기다린다.
- 모든 유저의 캐릭터 선택이 완료되면 선택된 캐릭터가 유저의 진영의 기지에서 등장하고, 유저가 조작할 수 있게 된다.
- 게임이 진행되는 동안 세 개의 공격로에서 각각 30초 간격으로 미니언 6마리가 생성되고, 적 기지를 향해 이동하면서 적 진영의 오브젝트를 공격한다.
- 체력이 있는 모든 오브젝트는 체력이 0 이하가 되면 파괴되거나 죽는다.
- 캐릭터가 죽으면 5초 후 자신의 진영에서 부활한다.
- 게임의 최종 목표는 적 진영 중요 건물(이하 "넥서스")을 파괴하는 것이다.
요구사항 분석
우선 각 항목별로 만들어낼 세부 기능을 정리해보자.
- 캐릭터 선택 :
게임이 시작하면 캐릭터를 선택하는 화면이 등장하고, 유저의 캐릭터 선택을 45초 동안 기다린다.
- 캐릭터 데이터 테이블
- 캐릭터 선택 UI
- 이동 불가능한 기본 카메라
- 게임시작 규칙 :
모든 유저의 캐릭터 선택이 완료되면 선택된 캐릭터가 유저의 진영의 기지에서 등장하고, 유저가 조작할 수 있게 된다.
- 캐릭터 조작 ( 완료 )
- 캐릭터 스폰 기능
- 캐릭터 빙의(캐릭터 변경)
- 캐릭터 팀 구별 기능
- 게임진행 규칙 :
게임이 진행되는 동안 세 개의 공격로에서 각각 30초 간격으로 미니언 6마리가 생성되고, 적 기지를 향해 이동하면서 적 진영의 오브젝트를 공격한다.
- 미니언
- 미니언 팀 구별 기능
- 미니언 자동이동
- 미니언 자동공격
- 미니언 자동생성
- 적 진영 오브젝트
- 미니언
- 체력 규칙1 :
체력이 있는 모든 오브젝트는 체력이 0 이하가 되면 파괴되거나 죽는다.
- 미니언 체력
- 캐릭터 체력
- 오브젝트 체력
- 체력 규칙2 :
게임의 최종 목표는 적 진영 중요 건물(이하 "넥서스")을 파괴하는 것이다.
- 넥서스
세부 기능을 만들면서 순서대로 개발해보도록 하자
구현
캐릭터 선택 기능과 게임시작 규칙을 우선적으로 만들고, 게임진행 규칙과 체력규칙은 다음 글에서 다루겠다.
캐릭터 선택
만들어야 할 세부 기능은 이렇다.
- 캐릭터 데이터 테이블
- 캐릭터 선택 UI
- 이동 불가능한 기본 카메라
데이터 테이블과 UI는 간단하게 만들 수 있다. 데이터 테이블을 만들고 난 다음에 위젯 블루프린트에서 테이블 내용을 바탕으로 버튼을 생성하면 끝이다. 위젯 블루프린트 이름은 WBP_IngameLevel_CharacterSelection
이다.
게임시작 규칙
만들어야 할 세부 기능은 이렇다.
- 캐릭터 조작 ( 완료 )
- 캐릭터 스폰 후 빙의(캐릭터 변경)
- 캐릭터 팀 구별 기능
캐릭터 조작 기능은 이미 구현했으니 넘긴다.
캐릭터 스폰 후 빙의 - 캐릭터 변경
캐릭터 변경 기능에서 중요한 것은 게임 캐릭터를 소환(Spawn
)하고, 빙의(Possess
)하고, 빙의해제(UnPossess
) 하는 것이다. 캐릭터 선택에서 만든 UI 버튼의 클릭 이벤트에서 액터를 소환하고 빙의하는 기능을 넣는다.
하지만 이대로 버튼을 클릭하면 캐릭터 조작은 작동하지 않는다. 문제를 해결하려면 UE4와 달라진 입력 시스템에 대해 알아야 한다. 이전글에서는 UE5에서 사용하는 입력 시스템인 향상된 입력 로컬 플레이어 서브시스템
의 개념과 구현 방법을 알아봤다. 주목해야 할 점은 PlayerController
에서 서브시스템을 가져온 다음 Add Mapping Context
으로 Input Mapping Context
를 가져와야 입력 이벤트가 활성화된다는 것이다. 이전글처럼 캐릭터의 BeginPlay
에서 서브시스템을 등록하는 작업을 수행한다면 게임모드에서 Default Pawn
으로 캐릭터를 미리 지정하지 않는 이상 입력 이벤트는 활성화되지 않을 것이다.
그럼 어떻게 해야 입력 이벤트를 활성화 할 수 있을까? 캐릭터에는 Possessed
이벤트가 있다. 플레이어가 캐릭터에 빙의(Possess
)하면 발생하는 이벤트다. BeginPlay
대신에 Possessed
이벤트에서 입력 서브시스템을 설정한다면 입력 이벤트는 플레이어가 캐릭터에 빙의 할 때마다 활성화된다.
캐릭터 팀 구별 기능
팀 구별은 간단히 팀을 구별할 수 있는 변수를 하나 추가하면 되지만 캐릭터 뿐 아니라 미니언과 넥서스 등 캐릭터가 아닌 오브젝트의 팀 구별 기능도 커버하기 위해서는 다른 방법을 찾아야 한다. 내가 선택한 방법은 인터페이스를 활용하는 것이다. C++에서는 추상 클래스(abstract class
), Java와 C#에서는 같은 이름의 인터페이스(Interface
) 기능과 같은 기능이다.
BPI_TeamSystem
을 만들고 팀 구별이 필요한 액터에게 인터페이스를 추가하는 방식으로 팀 구별 기능을 만들 수 있다.