모든 Player가 서로 직접 통신하는 Architecture입니다. 즉, 각 Client가 서로의 Sever 역할을 하며, Game Data를 주고받습니다.
- 장점
Sever가 필요 없고, Network cost가 적게 듭니다.- 단점
모든 Cleient가 동일한 권한을 가지므로 Hacking에 취약하고, Network 동기화가 어려울 수 있습니다. 또한, 각 Client의 Internet Conection 품질에 따라 게임 성능이 영향을 받을 수 있습니다.- 사용 사례
1:1 대전 게임이나 작은 인원으로 이루어진 Game에서 주로 사용됩니다.
한 Player가 Game을 Hosting하고, 다른 Player들이 그 Host에게 접속하는 방식입니다. Host는 Client이면서 동시에 Server 역할을 수행합니다.
- 장점
별도의Dedicated Server가 필요 없으므로 Server Cost가 절감됩니다. P2P보다 보안 이 좀 더 나으며, Server Host의 성능이 우수하면 상대적으로 안정적인 Game을 제공할 수 있습니다.- 단점
Server가 Game을 종료하면 모든 Session이 종료됩니다. 또한 Host의 Network 상태나 Computer 성능이 좋지 않으면 전체 Player에게 영향을 줄 수 있습니다.- 사용 사례
비교적 소규모 Multiplayergame에서 자주 사용됩니다.
Clienet들과 별도로 독립적인 Server에서 Game을 Hosting하는 Architecture입니다. 이 Sever는 Game Play에는 참여하지 않고, 오직 Client들의 Game Data 처리를 담당합니다.
- 장점
가장 안정적이고 성능이 뛰어난 Architecture입니다. Server Host가 Client가 아니기 때 문에 Server 종료 문제나 Host 성능에 따른 제약이 없습니다. 보안 측면에서도 우수합니다.- 단점
서버 유지 비용이 발생하며, 클라우드 또는 물리적 서버를 관리해야 합니다.- 사용 사례
MMORPG, BattleRoyal Game 등 Massively Multiplayer Online Game 에서 사용됩니다.
- UPROPERTY(Replicated)
서버에서 값이 변경되면 클라이언트에 자동으로 동기화
단순한 값 복제만 수행콜백 함수 없음- UPROPERTY(ReplicatedUsing = OnRep_FunctionName)
값이 서버에서 변경되어 클라이언트로 복제되면, 자동으로
OnRep_FunctionName을 호출
클라이언트에서 복제된 값을 처리하는 로직을 작성할 때 사용
On_Rep 함수는 클라이언트에서만 호출되며 서버에서는 호출되지 않음.
- UFUNCTION(Client)
서버 호출 → 특정 클라이언트 실행- UFUNCTION(Server)
특정 클라이언트 호출 → 서버에서 실행- UFUNCTION(NetMulticast)
서버 호출 → 서버 포함 모든 클라이언트 실행- UFUNCTION(Unreliable)
호출을 보장하진 않지만, 빠른 실행가능손실 가능성- UFUNCTION(Reliable)
호출 보장
Server 함수는 반드시 서버 권한이 있어야 실행 가능
UFUNCTION(Client)와 UFUNCTION(Multicast)는 서버에서만 호출해야 정상 작동
- ROLE_None
네트워크에 연결되지 않은 상태- ROLE_SimulatedProxy
클라이언트가 소유하지 않는 액터. 서버의 복제본.- ROLE_AutonomousProxy
클라이언트가 소유하고 직접 제어하는 액터.- ROLE_Authority
서버가 소유하고 있는 액터.- ROLE_MAX
열거형 최대값