언리얼에서 게임을 구현하는 다양한 기능은
플러그인, 모듈 등을 통해서 추가할 수 있다.
하지만 게임 구현의 주춧돌은 역시 게임 모드 클래스이다.
언리얼 게임 모드 클래스
게임에 일시 정지 기능을 추가하고 싶은 경우를 생각해보자.
게임을 일시 정지시키기 위한 모든 로직 및 구현 내용이 하나의 클래스 안에 배치돼야 할 것이다.
게임 모드 클래스는 플레이어가 게임에 입장하면
게임 흐름을 처리하는 역할을 담당하게 된다.
게임 흐름은 게임에서 발생하는 모든 상황(ex. 일시정지, 플레이, 재시작 등 게임 흐름 행동)이 될 수 있다.
이와 비슷하게 멀티플레이어 게임에서는
네트워크와 관련된 게임플레이 로직이 한 곳에 배치돼야 한다.
게임 모드 클래스는 바로 이런 역할을 담당한다.
게임 모드는
게임 로직을 실행하고 플레이어에게 게임 관련 규칙을 적용하는 클래스이다.
게임플레이 객체의 모든 관리자를 포함할 수 있으며,
게임 모드는 게임플레이 변수 및 이벤트 등 현재 플레이 중인 게임에 대한 정보를 포함한다.
싱글톤 클래스로 모든 객체 및 게임에 배치된 추상클래스에서 접근할 수 있다.
다른 모든 클래스와 마찬가지로 게임 모드 클래스 역시 블루프린트나 C++로 확장할 수 있다.
이를 통해 게임 안에서 발생하는 상황을 플레이어에게 업데이트하는 데 필요한 추가 기능 및 로직을 포함할 수 있다.
- 게임에 입장할 수 있는 플레이어 수 제한
- 새로 연결된 플레이어의 생성 위치 및 플레이어 컨트롤러 로직 제어
- 게임 점수 계산 및 기록
- 게임 승 / 패 상태 추적
- 게임 오버 및 게임 재시작 시나리오 구현
게임 모드 기본 클래스
로그인 승인과 같은 관리자 수준의 게임 로직을 구현한다.
게임 모드는 다은과 같은 기본 클래스를 지정할 수 있는 기능을 제공한다.
어떤 행동을 해야 할지 결정하는 두뇌로 생각할 수 있다.
•Player State Calss
게임 안에 있는 플레이어의 현재 상태를 저장한다.
이 클래스가 플레이어 캐릭터가 된다.
관람자 폰 클래스는 게임을 관람하는 기능을 담당하는 폰을 지정한다.
기본 클래스를 그대로 사용하거나, 고유 구현 및 동작을 위해 클래스를 지정할 수도 있다.
이 클래스들은 게임 모드와 함께 동작하며 월드에 배치되지 않고 자동으로 실행된다.
게임플레이 이벤트
멀티플레이어 게임에서는 많은 플레이어가 게임에 입장할 때
플레이어가 게임으로 입장할 수 있도록 허용하고
플레이어의 상태를 유지하는 로직을 관리할 뿐만 아니라
다른 플레이어의 상태 및 다른 플레이어와의 상호작용을 처리하는 로직을 처리하는 것이 필수적이다.
게임 모드는 이런 멀티플레이어 게임플레이 로직을 처리할 수 있도록
오버라이딩할 수 있는 몇 가지의 이벤트를 제공한다.
다음 이벤트는 네트워킹에 특히 유용하다.
- On Post Log In
이 이벤트는 플레이어가 게임에 성공적으로 로그인한 후에 호출된다.
이 시점 이후에 플레이어 컨트롤러 클래스에서 리플리케이션 로직을 호출하는 것이 안전하다. - Handle Starting New Player
이 이벤트는 On Post Log In 이벤트 이후에 호출되며,
플레이어가 새로 입장했을 때 처리할 일을 정의할 수 있다.
기본적으로는 새로 입장한 플레이어에게 폰을 생성한다. - SpawnDefaultPawnAtTransform
이 이벤트는 게임 안에서 실제 폰 생성을 발생시킨다.
새로 연결된 플레이어는 특정 트랜스폼 또는
레벨에 사전 배치된 플레이어 스타트 위치에서 생성될 수 있다. - On Logout
이 이벤트는 플레이어가 게임을 나가거나 플레이어가 삭제될 때 호출 된다. - On Restart Player
이 이벤트는 플레이어가 리스폰 될 때 호출된다.
SpawnDefaultPawnAtTransform 이벤트와 비슷하게 플레이어는 특정 트랜스폼이나
미리 설정된 위치에 재생성될 수 있다.
네트워킹
게임 모드 클래스는 클라이언트나 입장한 플레이어에게 복제되지 않으며
게임 모드 클래스의 범위는 생성된 서버로 제한한다.
기본적으로 클라이언트 - 서버 모델에서
클라이언트는 서버에서 실행 중인 게임 안에서 입력 역할만 한다.
따라서 게임플레이 로직은 클라이언트에 존재하지 않고 서버에만 존재해야 한다.
'UE5' 카테고리의 다른 글
Delegate 사용방법 (1) | 2023.12.05 |
---|---|
언리얼 내의 포인터 (0) | 2023.11.02 |
UE5 멀티스레딩과 enum을 이용한 상태 변환 (1) | 2023.10.22 |
UFUNCTION() 응용을 위한 가이드 (1) | 2023.10.16 |
Physics Field System _ RPG 부서지는 물체 (1) | 2023.10.16 |