๐ Server-Client ๋ชจ๋ธ
Unreal Engine์ ๋ฉํฐํ๋ ์ด์ด ๊ฒ์์์ Server-Client ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค.
์ด๋ Server๋ก ์ ์๋ ์ธ์คํด์ค๊ฐ ๊ฒ์์ ์ํ์ ๋ํ Authority์ ๊ฐ์ง๋ฉฐ, ๋ค๋ฅธ ๋ชจ๋ ์ธ์คํด์ค๋ Server๋ก๋ถํฐ ์
๋ฐ์ดํธ๋ฅผ ๋ฐ๋ Client ์์ ์๋ฏธํ๋ค.
Client๋ค๋ผ๋ฆฌ๋ ์ง์ ํต์ ํ์ง ์๊ณ , Client๊ฐ ์ทจํ๋ ๋ชจ๋ ํ๋(e.g. ์บ๋ฆญํฐ ์ด๋, ๋ฐ์ฌ ๋ฑ)์ ๋จผ์ Server๋ก ์ ์ก๋๊ณ , Server๊ฐ ์ด๋ฅผ ๊ฒ์ฆํ ํ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ Client๋ค์๊ฒ Broadcast ํ๋ค.
Server๋ ๊ฒ์์ ์ง์ ํ ์ํ๋ฅผ ์ ์งํ๋ฉฐ ๋ชจ๋ ์ต์ข
๊ฒฐ์ ์ ๋ด๋ฆฐ๋ค.
์ด๋ฐ ๋ชจ๋ธ์ ์ ์งํ๋ ํต์ฌ ์ด์ ๋ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ Cheat๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์์ด๋ฉฐ,
โNever Trust the Clientโ๋ผ๋ ๋ณดํธ์ ์ธ ์์น์ผ๋ก ์์ฝ๋๋ค.
!
๐Unreal Engine์์๋ ์ด๋ฌํ Server-Client ๊ตฌ์กฐ์ ๊ด๋ จํ์ฌ ์ฌ๋ฌ ์คํ ๋ชจ๋๋ฅผ ์ง์ํ๋ฉฐ, ์ด๋ฅผ ์ ํํ ๊ตฌ๋ถํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
| ์คํ ๋ชจ๋ | ์ ์ | ํน์ง |
|---|---|---|
| Standalone | ๋คํธ์ํน์ ๊ณ ๋ คํ์ง ์๋ ๋จ์ผ ์ธ์คํด์ค | โข ์ฑ๊ธ ํ๋ ์ด์ด (Local ์ธ์
) โข ๋ค๋ฅธ ์ธ์คํด์ค์ Replicate ํ์ง ์์ โข ๋ชจ๋ Gameplay ํด๋์ค๊ฐ ํ๋์ ํ๋ก์ธ์ค์์ ์คํ |
| Dedicated Server | Server ์ ์ฉ ์ธ์คํด์ค | โข Local ํ๋ ์ด์ด ์์ โข ๋ ๋๋ง ํ์ง ์์ (GPU ์์ด ๊ตฌ๋ ๊ฐ๋ฅ) โข ๊ฒ์ ๋ก์ง๊ณผ ๋คํธ์ํฌ ํต์ ๋ง ์ฒ๋ฆฌ โข ์๊ฒฉ ๋จธ์ ์ด๋ ํด๋ผ์ฐ๋์ ๋ฐฐํฌ |
| Listen Server | ํ ํ๋ ์ด์ด๊ฐ ๋์์ Server ํธ์คํธ ์ญํ | โข Server์ด์ Client ์ญํ ์ํ โข ํธ์คํธ์๊ฒ UI์ PlayerController ์กด์ฌ โข ํธ์คํธ๊ฐ ๋๊ฐ๋ฉด Server๋ ์ข ๋ฃ โข P2P ์คํ์ผ ๊ฒ์์ ๋ง์ด ์ฌ์ฉ |
| Client | ํธ์คํธ๊ฐ ์๋ ๋ชจ๋ ํ๋ ์ด์ด | โข Server๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ํ์ โข ์์ ์ ์ ๋ ฅ์ Server์ ์ ์ก โข ์์จ์ (autonomous) ํ๋ ์ด์ด ์ปจํธ๋กค๋ฌ ๋ณด์ โข ๊ถํ ์๋ ๊ฒฐ์ ๊ณผ ๊ฒ์ ์ํ ์ ๋ฐ์ดํธ๋ Server์ ์์กด |
๐ Gameplay Framework
Unreal์ Gameplay Framework๋ ๋ฉํฐํ๋ ์ด์ด ๊ฒ์์์ ๊ฐ Class๊ฐ ์ด๋ค ์ธ์คํด์ค(Server/Client)์ ์กด์ฌํ๋์ง ์ ์ํ๋ค.
!
| ํด๋์ค | ์กด์ฌ ์์น | ์ญํ |
|---|---|---|
| GameMode | Server | ๊ฒ์ ๊ท์น ์ ์ด |
| GameState | Server์ ๋ชจ๋ Client | ๊ฒ์์ ์ ์ฒด์ ์ธ ์ ๋ณด(e.g. ์ ์, ์๊ฐ) ๋๊ธฐํ |
| PlayerController | Server์์์ ์ ์์ ํ Client | ๊ฐ ํ๋ ์ด์ด์ ์ ๋ ฅ์ ์๊ธฐ Client์ Server์๋ง ์ ์ ์์ |
| Pawn | Server์ ๋ชจ๋ Client | ๋ชจ๋ ํ๋ ์ด์ด๊ฐ ์์ ์ธ์ Pawn๋ ๋ณผ ์ ์๋๋ก Server์ Replicate |
๐ก Server-Client ์ํธ์์ฉ
์ด๋ฌํ ์ญํ ๋ถ๋ด์ ํตํด Server๊ฐ Gameplay์ ๊ด๋ จ๋ ๊ฒฐ์ ์ ๋ ์ ์ ์ธ ๊ถํ์ ๊ฐ๊ณ , Client๋ ๊ทธ์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๋ฉฐ ์ ๋ ฅ์ Server์ ๋ณด๋ด๋ ๊ตฌ์กฐ๋ฅผ ๋ช ํํ ํ๋ค.
์๋ฅผ ๋ค์ด Client์์ Pawn์ ์ด๋ํ ๋, ์ ๋ ฅ ์ฆ์ Pawn์ ์์ง์์ ์์ธก ํ ๋ฐ์ํ์ฌ ์ค์๊ฐ์ฑ์ ํ๋ณดํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋์์ ์ด๋ ์์ฒญ์ Server๋ก ๋ณด๋ธ๋ค
Server๋ ๊ทธ ์์ฒญ์ ๋ฐ์ ๊ถํ ์๋ ์์น์์ ์บ๋ฆญํฐ๋ฅผ ์์ง์ด๊ณ , ๊ทธ ์๋ก์ด ์์น/์ํ๋ฅผ ๋ชจ๋ Client์๊ฒ Broadcast ํ๋ค. (Client ์์ ๋ ํฌํจ)
๋ง์ฝ Client์ ์์ฒด์ ์ธ ์์ธก์ด ์ ํํ๋ค๋ฉด, ์์ ํ ๊ฒ์ด ์์ผ๋ ๋ถ๋๋ฝ๊ฒ ํ๋ ์ด๋ฉ๋๋ค.
๋ง์ฝ ์ฐจ์ด๊ฐ ์์๋ค๋ฉด, Server์ ์
๋ฐ์ดํธ๊ฐ ๋น์ ์บ๋ฆญํฐ์ ์์น๋ฅผ ์กฐ์ ํ ๊ฒ์ด๋ค. (์ด ์กฐ์ ๊ณผ์ ์ ๋์ค์ ๋ค๋ฃฐ โ๋ณด์ (Reconciliation)โ์ ์ผ๋ถ์
๋๋ค).
ํต์ฌ์ ํญ์ Server์ ์ํ๊ฐ ์ต์ข ์ผ๋ก ์ ๋ขฐํ๋ ๊ฐ์ด๋ผ๋ ๊ฒ.
๐ Unreal Engine ๋ฉํฐํ๋ ์ด์ด ํต์
Unreal์์ Server-Client ๊ฐ ํต์ ์ ์ํ ๋ ๊ฐ์ง ํต์ฌ ๋ฉ์ปค๋์ฆ์ด Replication๊ณผ RPC(Remote Procedure Call)์
๋๋ค. ์ด๋ค์ ๋ชฉ์ ๊ณผ ๋์์ด ๋ค๋ฅด๋ฏ๋ก ๊ตฌ๋ถํด์ ์ดํดํด์ผ ํ๋ค.
1๏ธโฃ Replication
Replication์ Server์์ Client๋ก ๊ฐ์ฒด ์ํ๋ฅผ ์๋ ๋๊ธฐํํด์ฃผ๋ ๊ธฐ๋ฅ.
์ด๋ค Property๋ Actor๋ฅผ Replicates = true๋ก ์ค์ ํ๋ฉด, Engine์ ๋คํธ์ํน ์์คํ
์ด ์ฃผ๊ธฐ์ ์ผ๋ก ํด๋น ๋ฐ์ดํฐ๋ฅผ ๊ด๋ จ๋ Client๋ค์๊ฒ ๋ณด๋ธ๋ค.
๋ณ๋๋ก ์ฝ๋๋ฅผ ์ฐ์ง ์์๋ Engine์ด ์ง์์ ์ผ๋ก ์ํ๋ฅผ ๋ง์ถฐ์ฃผ๋ ๊ฒ.
์ด๋ ์บ๋ฆญํฐ์ ์์น, ์ฒด๋ ฅ, ๋ฌธ์ด ์ด๋ ธ๋์ง/๋ซํ๋์ง ๋ฑ ๊ณ์ ๋ณํ ์ ์๋ ์ํ๋ฅผ ๋๊ธฐํํ๋๋ฐ ์ ํฉ.
๐ก ์ค์: Replication์ ๋จ๋ฐฉํฅ์
๋๋ค. Server -> Client๋ก๋ง ๊ฐ๋ค.
Client์์ Server๋ก Property๋ฅผ Replicate ํ ์๋ ์์ต๋๋ค. Client๊ฐ ์ด๋ค ๊ถํ ์๋ ์ ๋ณด๋ฅผ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด, ์ง์ ๋ฐ๊พธ๋ ๋์ Server์ ์์ฒญ์ ํด์ผ ํ๋ค(e.g. RPC).
๋ํ Replication์ ๋ณดํต State ๊ธฐ๋ฐ์ด์ด์, Property์ ํ์ฌ ๊ฐ์ ๋ณด๋ด์ง โ๋ณ๊ฒฝ Eventโ ์์ฒด๋ฅผ ๋ณด๋ด์ง๋ ์๋๋ค (๋ค๋ง RepNotify ๋ฑ์ ํตํด ๊ฐ ๋ณ๊ฒฝ ์์ ์ ํฌ์ฐฉํ ์ ์๋ค).
2๏ธโฃ RPC (Remote Procedure Call)
RPC (Remote Procedure Call)๋ ์๊ฒฉ ๋จธ์ ์์ ํจ์๋ฅผ ํธ์ถํ๋ ๋ช
์์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
Unreal์์ RPC๋ UFUNCTION์ Server, Client, NetMulticast ๊ฐ์ ์ง์ ์๋ฅผ ๋ถ์ฌ ๋ง๋ค๋ฉฐ, ์ด๋ฅผ ํธ์ถํ๋ฉด ์ค์ ๋ ๋์(Server ๋๋ Client๋ค)์์ ํจ์๊ฐ ์คํ๋๋ค.
์๋ฅผ ๋ค์ด, Client์์ โFireWeaponโ์ด๋ผ๋ Server RPC๋ฅผ ํธ์ถํ๋ฉด, ๊ทธ ํจ์๊ฐ Server ์ธก์์ ์คํ๋์ด ์ด์ ๋ฐ์ฌ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค. Replication์ด ์ํ๋ฅผ ์ง์์ ์ผ๋ก ๋๊ธฐํํ๋ ๊ฒ์ด๋ผ๋ฉด, RPC๋ ํน์ ์๊ฐ์ ์คํ๋๋ ๋์/Event๋ฅผ ์๊ฒฉ์ผ๋ก ํธ์ถํ๋ ๊ฒ.
๐ ์ฃผ์ ์ฐจ์ด ๋ฐ ํ์ฉ ์ํฉ
๐ ๋ฐ์ดํฐ ํ๋ฆ ๋ฐฉํฅ
Server โ Client ๋จ๋ฐฉํฅ ์๋ ๋๊ธฐํ| RPC ์ข ๋ฅ | ํธ์ถ ๋ฐฉํฅ | ์คํ ์์น | ์ฃผ์ ์ฉ๋ |
|---|---|---|---|
| Server RPC | Client โ Server | Server | ๋ฌธ ์ด๊ธฐ, ์์ดํ ์ต๋ ๋ฑ ์ ์ ์์ฒญ ์ ๋ฌ |
| Client RPC | Server โ Client | ํน์ Client(Actor Owner) | UI ์ ๋ฐ์ดํธ, ์๋ฆผ ๋ฑ ๊ฐ์ธํ๋ ํผ๋๋ฐฑ ์ ๋ฌ |
| Multicast RPC | Server โ ๋ชจ๋ Client | ๋ชจ๋ Client ๋ฐ Server(Optional) | ์๊ฐํจ๊ณผ, ์๋ฆฌ ๋ฑ ๋์ multicast |
๐ State vs Event
์ผ๋ฐ์ ์ผ๋ก ์ง์์ ์ธ ์ํ์ ๋๊ธฐํ์๋ Replication๋ Property๋ฅผ ์ฌ์ฉํ๊ณ , ์ผํ์ฑ Event์ ๊ฐ์ ๋ RPC๋ฅผ ์ฌ์ฉํ๋ค.
์๋ฅผ ๋ค์ด FPS ๊ฒ์์์ ํ๋ ์ด์ด์ ์ด์ ๊ฐฏ์๋ (๊ณ์ ๋ณํ ์ ์๊ณ ํ์ฌ ๊ฐ์ ์ ์งํด์ผ ํ๋ ์ ๋ณด)์ Replicated Property๋ก ๋ง๋ค๊ณ , ํ๋ ์ด์ด๊ฐ ์ด์ ์๋ค๋ ํ์๋ RPC๋ก Server์ ๋ณด๋ด๋ ์์ด๋ค.
๐ Automatic vs Manual
Replication์ Unreal Engine์ด ์์์ (ํ๋ ์๋ง๋ค ํน์ ํ์ํ ์์ ๋ง๋ค) ๊ฐ์ ๋ณด๋ด์ฃผ๋ฉฐ ๋ด๋ถ์ ์ผ๋ก ์ต์ ํ๋๋ค.
RPC๋ ๊ฐ๋ฐ์๊ฐ ํ์ํ ์๊ฐ์ ์ง์ ํธ์ถํด์ผ ํ๊ณ , ํธ์ถํ ๋๋ง๋ค ๋คํธ์ํฌ Packet์ ์์ฑํ๋ค .
๐ ์์์ Reliability
์ฌ๋ฌ ๋ณ์์ Replication์ ํ ๋ฒ์ ๋ญ์ณ์ ๋ณด๋ด์ง๊ณ , ํน์ ์์๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค.
RPC๋ Reliable๋ก ๋ณด๋ผ์ง Unreliable๋ก ๋ณด๋ผ์ง ์ ํํ ์ ์๋๋ฐ, ๊ฐ์ ์ข
๋ฅ์ RPC๋ค๋ผ๋ฆฌ๋ ํธ์ถ ์์๊ฐ ๋ณด์ฅ๋๋ค. (์ด ๋ถ๋ถ์ ๋ค์์ ๋ ์์ธํ ๋ค๋ฃน๋๋ค.)
โ Replication vs RPC ๊ฐ๋ ์ ๋ฆฌ
๊ฐ๋จํ ๋น์ ํ์๋ฉด,
โ Replication = ๊ฐ ๋๊ธฐํ
โ RPC = ์๊ฒฉ ํจ์ ํธ์ถ
์ด ๋์ ์์ํ์ผ์ด ์๋๋ผ ํ์์ ๋ฐ๋ผ ๋ณํํด์ ์ฌ์ฉํ๊ฒ ๋๋ค.
์๋ฅผ ๋ค์ด, Client๊ฐ Server RPC๋ก โ์ด ๋ฌธ์ ์ด๊ณ ์ถ์ด์โ๋ผ๊ณ ์๋ฆฌ๋ฉด (Event ์ ๋ฌ), Server๋ ๋ฌธ์ ์ฌ๋ ๊ถํ์ด ์์ผ๋ ๋ฌธ์ State์ ๋ํ Property๋ฅผ Open์ผ๋ก ๋ณ๊ฒฝํ๊ณ , ๊ทธ Property๋ฅผ Replicationํ์ฌ ๋ชจ๋ Client์๊ฒ ์๋ฆฐ๋ค.
์ฌ๊ธฐ์ ๋ช
์ฌํด์ผ ๋ ๊ฒ์ Client๋ Server์ Replicated Variable์ ์ง์ ๋ฐ๊ฟ ์ ์๋ค๋ ๊ฒ์ด๋ค
Client๊ฐ Local ํ๊ฒฝ์์ Replicated Varialbe์ ๊ฐ์ ๋ฐ๊ฟ๋ด์ผ ๊ทธ๊ฒ์ ์๊ธฐ ํ๋ฉด์๋ง ์ผ์์ ์ผ๋ก ๋ฐ๋ ๋ฟ, Server๋ ๋ค๋ฅธ Client์ ๋ฐ์๋์ง ์๋. ๊ทธ์ ๋ํด์ ๋ฐ๋์ Server์ ๋ณ๊ฒฝ์ ์์ฒญํด์ผ ํ๋ฉฐ, ์ด๊ฒ์ ๋ฉํฐํ๋ ์ด์ Golden Rule์ด.
์ ๋ฆฌํ์๋ฉด Client์์ Server๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ Server RPC (Run on Server) ๋ฟ์ด๋ฉฐ,
๋ชจ๋ Client์ Server์ ๋ฐ์๋์ด์ผ ํ ๊ฒ์ ์ํ ๋ณ๊ฒฝ์ Server์์๋ง ํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค
Client๋ Server์ ์์ฒญํ๊ฑฐ๋, ์ผ์์ ์ผ๋ก ์๊ธฐ ํ๋ฉด์์ ๋ณด์ฌ์ค ๋ด์ฉ์ ์์ธก๋ง ํด์ผํ๋ค