티스토리 뷰
GAS in Multiplayer
이번에는 멀티플레이에서의 GAS에 대해서 알아본다.
1. 멀티플레이 기본 개념
멀티플레이 게임에서는 서버와 클라이언트가 존재한다.
서버는 하나의 게임 인스턴스를 실행하고, 서버와 별도로 각 플레이어의 컴퓨터에서 게임이 실행된다.
이때 플레이어의 컴퓨터를 클라이언트라고 부른다.
Server
Client 1
Client 2
Client 3
2. 서버의 2가지 유형
2.1 Dedicates Server (전용 서버)
플레이어와 화면 렌더링 없이 게임 로직만 실행한다.
즉, 서버는 단순히 게임 시뮬레이션만 수행하며, 플레이어 이동, 공격, 마법 사용 등 게임 로직은 여전히 서버에서 실행된다.
2.2 listen Server (리스닝 서버)
리스닝 서버는 플레이어가 직접 서버를 호스팅하는 방식이다.
즉, Host Player = Server, 다른 플레이어 = Client가 된다.
호스트 플레이어는 서버와 같은 컴퓨터에서 실행되며, Host는 데이터를 네트워크로 전송할 필요가 없기 때문에 지연(Latency)이 없는 장점이 있다.
3. 서버의 권위 (Authority)
언리얼 엔진에서는 Server는 권위 있는 버전(Authoritative version) 이다.
멀티플레이에서는 지연 때문에 Client A에서의 플레이어 위치, Client B에서의 플레이어 위치, Server에서의 플레이어 위치가 서로 다를 수 있다.
그래서 어떤 값이 맞는 지 결정해야 하는데, 언리얼에서는 항상 Server의 값이 정답이다.
그래서 중요한 작업은 서버에서 처리되며, 이 중요한 작업에 대해서는 차후 강의에서 다룰 것이다.
4. 서버와 클라이언트에서 존재하는 클래스
멀티플레이에서는 클래스가 어디에 존재하는 지가 다르다.
4.1.Game Mode
Game Mode는 Server에만 존재한다.
클라이언트에서 GameMode에 접근하면 nullptr이 된다.
GameMode의 역할은 플레이어 생성, 게임 시작/재시작, 게임 규칙 관리 등 중요한 게임 로직이기 떄문에 서버에서만 처리된다.
4.2 PlayerController
PlayerController는 Sever에 존재하고, 각 Client에도 존재하지만 구조가 조금 다르다.
플레이어가 3명일 경우 Server에는 PlayerController0~2가 존재하지만, Clinet0에서는 PlayerClinet0만 존재한다.
즉 클라이언트에는 자신의 PlayerController만 존재하며 모든 PlayerController를 가지고 있는 것은 Server 뿐이다.
4.3 PlayerState
PlayerState는 PlayerControllet와 다르게 동작한다.
PlayerState는 Server 및 모든 Client에 존재하며, 모든 플레이어의 PlayerState가 모든 Client에 존재한다.
4.4 Pawn (캐릭터)
Pawn도 PlayerState와 비슷하다.
모든 플레이어는 서로를 볼 수 있어야 하기에 모든 Pawn이 모든 Client에 존재한다.
4.5 HUD/UI
HUD와 UI는 다르게 동작한다.
HUD는 각 Client에만 존재하며, 서버에는 존재하지 않는다.
그리고 Client0은 Client1의 HUD에 접근할 수 없다.
5. Replication (복제)
멀티플레이에서 중요한 개념이 Replication이다.
Replication이란 Server -> Client로 데이터를 전송하는 것이다.
5.1. Repicated 변수 동작
예를 들어 Pawn에 float Health라는 변수가 있다고 가정한다.
이 변수는 Server Pawn, Client Pawn 각각에 존재하며, 만약 Health가 Replcation 변수라면 서버에서 Health가 변경될 때 다음 네트워크 업데이트에서 클라이언트 Health도 변경된다.
이러한 과정을 앞서 언급했던 Replcation이다.
5.2 Replication은 한 방향
Replication은 Server -> Client 한 방향으로만 작동한다.
즉, Client에서 변수를 변경하면 서버랑 다른 클라이언트는 알 수 없으며 Server 값과 동기화가 깨지게 된다.
그래서 Replicated 변수는 클라이언트에서 변경하면 안된다.
6. NetUpdateFrequeny
NetUpdateFrequney = 100의 의미는 서버가 클라이언트로 데이터를 초당 최대 100번 업데이트 한다는 뜻이다.
즉, 서버에서 값이 변경되면 다음 네트워크 업데이트 때 클라이언트로 전송된다.
7. Client -> Server 통신
클라이언트가 서버로 데이터를 보내는 방법은 RPC(REmote Procedure call)이다.
키보드 입력, 마우스 입력, 스킬 사용 등이 RPC 함수를 통해 서버로 전달된다.
8. GAS와 멀티플레이
GAS에서는 많은 멀티플레이 기능이 내부적으로 처리된다.
그래서 싱글플레이로 만든 시스템도 말터플레이에서 동작하도록 설계되어 있다.
'Unreal > Udemy 강의' 카테고리의 다른 글
| Gameplay Ability System - Top Down RPG / Section 3-6 (0) | 2026.03.10 |
|---|---|
| Gameplay Ability System - Top Down RPG / Section 3-4 (0) | 2026.03.08 |
| Gameplay Ability System - Top Down RPG / Section 3-3 (0) | 2026.03.08 |
| Gameplay Ability System - Top Down RPG / Section 3-2 (0) | 2026.03.07 |
| Gameplay Ability System - Top Down RPG / Section 3-1 (0) | 2026.03.07 |
