게임공부

[Unreal 5.5.1] Gameplay Framework

happytanuki 2025. 1. 3. 00:50

유니티는 어떤지 모르겠지만 언리얼에서는 엔진이 알아서 해주는 부분이 엄청나게 많고, 유니티에서처럼 기본 객체를 가지고 무엇이든지 다 만들 수 있는 것이 아니라 언리얼의 엄격한 틀에 맞춰서 적절한 클래스를 상속받고 적절한 위치에 적절한 코드를 배치해야 최적화와 확장성을 다 챙길 수 있다.

 

물론 Level Blueprint 내지 GameInstance, GameMode에 모든 코드를 다 써넣는다거나 하는 짓은 가능하지만 일단 된다고 넘어갔다가 피본다.. 꼭 하라는대로 안하고 왜? 를 좋아하는 내가 되는대로 짰다가 코드를 여러번 뒤집어 엎었다..

 

예를 들어 GameMode가 있다면 이 게임모드를 교체함으로써 플레이 도중에 게임의 규칙을 바꾼다거나 할 수 있는 행동을 위탁하는 전략 패턴(Strategy pattern)을 사용할 수 있게 되므로 유연하고 창의적인 자유도를 위해서 역설적으로 구조를 강제하는 것이다.

 

게임플레이 프레임워크의 요소를 몇 개 보면. 각 클래스는 에픽게임즈의 의도대로 적절히 활용한다면 코드 수정없이 멀티플레이 게임을 구성할 수 있도록 모듈화되어 있으므로 멀티플레이어 게임을 상정하고 있다면 각 클래스의 멀티플레이어에서의 역할도 잘 보아 놓는 것이 중요할 것이다.
GameInstance

GameMode
GameState
PlayerState

HUD

Controller

Pawn

etc..

 

GameInstance:

게임이 실행중인 동안 계속 저장해야 할 정보를 저장한다. 이 객체는 서버와 클라이언트가 각각 가지고 있으나 서로의 값을 가져올 수 없고 리플리케이트되지 않는다.

GameMode:

게임의 규칙이나 게임 승리 조건 등등을 정의한다, 이 객체는 서버에서 각 클라이언트로 리플리케이트(Replicate)되지 않는다.

다시말해 여기에서 정의한 규칙은 클라이언트에서 읽으려고 시도할 수 없다.

따라서 이 객체에는 플레이 도중에 바뀔 필요가 있거나 클라이언트가 알아야 하는 데이터 (예) 팀 스코어)를 포함할 수 없다.

GameState:

게임의 현재 상황에 대한 정보를 가지고 있다. 또한 각 클라이언트가 알아야 할 정보 (예) 접속한 플레이어의 수, 팀 스코어 등등.)를 가지고 있으며 이 객체는 서버에서 각 클라이언트로 리플리케이트된다.

다시말해 여기에서 정의한 규칙은 클라이언트에서 읽을 수 있다.

하지만 읽기 전용이므로 GameState의 값을 수정할 수는 없다.

PlayerState:

플레이어의 현재 상황에 대한 정보를 가지고 있다. 또한 각 클라이언트가 알아야 할 정보 (예) 플레이어의 점수, 플레이어의 이름 등등.)를 가지고 있다. 이 객체는 서버에서 각 클라이언트로 리플리케이트된다.

다시말해 여기에서 정의한 규칙은 클라이언트에서 읽을 수 있다는 뜻이다.

또한 모든 클라이언트와 서버에게 리플리케이트되므로 다른 클라이언트나 서버에서도 값을 읽을 수 있다.

클라이언트에서 다른 클라이언트의 값을 수정할 수 없다.

HUD:

클라이언트에만 존재하는 객체로, 화면에 오버레이로 표시되는 체력 바, 글씨, UI등등이 포함된다. 보통 각 클라이언트의 PlayerController가 소유하고 있도록 설계된다.

다시 말해, 서버에서는 각 클라이언트의 HUD객체를 얻을 수 없고, 그럴 필요도 없다.

Controller:

Pawn을 소유하는 객체로, 주로 AIController와 PlayerController가 있다.

AIController는 NPC를 조종하는 컨트롤러로, 서버에만 존재하며 각 클라이언트에게 리플리케이트되지 않는다.

PlayerController는 플레이어의 입력을 처리하여 서버에 적절히 전달하며, 서버와 각 클라이언트에 전부 존재하나 클라이언트에서는 다른 클라이언트의 PlayerController를 읽을 수 없다.

Pawn:

Possessable(소유 가능)한 Actor로, AIController나 PlayerController가 소유(Possess)함으로써 조종할 수 있다.

Pawn 또는 Actor 또는 Charactor 객체는 서버에서 각 클라이언트에 리플리케이트 될 수도, 되지 않을 수도 있다.(조정할 수 있다.)

 

마지막으로 언리얼을 다룬 지 오래됐고, 인터넷에는 이 객체를 부적절하게 활용하는 예제가 많아 틀린 내용이 있을 수 있다. 인지하는대로 고치도록 하겠다.

틀린 내용이 있다면 댓글로 알려주면 수정하도록 하겠다.