{ ๋ฉํฐ ํ๋ ์ด ๊ฒ์ ๊ฐ๋ }
๋ฉํฐ ํ๋ ์ด ๊ฒ์์ ๋คํธ์ํฌ๋ฅผ ํตํด์ ์ฌ๋ฌ ์ฌ๋์ด ํจ๊ป ๊ฒ์์ ์ฆ๊ธฐ๋ ๋ฐฉ์์ด๋ค.
๋ฉํฐ ํ๋ ์ด ๊ฒ์์ ๊ตฌํํ๊ธฐ ์ํด์๋ ํฌ๊ฒ 2๊ฐ์ง ๋ฐฉ์์ด ์๋ค.
(1) P2P ๋ฐฉ์
P2P(Peer to Peer Network) ๋ฐฉ์์ ๊ฐ ํ๋ ์ด์ด์ ์ปดํจํฐ๊ฐ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ํ๋ ์ด์ด๋ค์ ์ปดํจํฐ๋ก ์ง์ ์ก์ ํ๋ ๋ถ์ฐํ ๋คํธ์ํฌ ๋ฐฉ์์ด๋ค.
ํน์ง
- ๊ตฌํ์ด ์ฝ๋ค
- ํ๋ ์ด์ด๊ฐ ๋ง์์๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๊ณณ์ด ๋ง์์ง๊ธฐ ๋๋ฌธ์ ๋๋ฆฌ๊ณ ๋นํจ์จ์ ์ด๋ค.
- ๊ฒ์์ ์๋ณธ ๋ฒ์ ์ด ์กด์ฌํ์ง ์๋๋ค. ์ฆ, ํต์ผ๋ ๊ฒ์ ์ธ์คํด์ค ๋ฒ์ ์ด ์กด์ฌํ์ง ์๊ณ ๊ฐ ์ปดํจํฐ๋ณ๋ก ๋ค๋ฅธ ๊ฒ์ ์ธ์คํด์ค๋ฅผ ๊ฐ๋๋ค.
(2) Client - Server ๋ฐฉ์
Client-Server ๋ฐฉ์์ ํ๋ ์ด์ด์ ์ปดํจํฐ๊ฐ ์๋ฒ์ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ฉด ์๋ฒ๊ฐ ์์ ๊ณผ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ์ปดํจํฐ๋ค์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ์ค์ ์ง์คํ ๋คํธ์ํฌ ๋ฐฉ์์ด๋ค.
ํน์ง
- P2P์ ๋นํด ๊ตฌํ์ด ์ด๋ ต๋ค
- ์๋ฒ์์ ํ๋ ์ด์ด์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ธฐ ๋๋ฌธ์ ๋น์ ์์ ์ธ ๋์์ ์ก์๋ด๊ฑฐ๋ ๊ฒ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ ์ฝ๋ค.
- Authoritative์ ๊ฒฝ์ฐ ์๋ฒ ๋ฒ์ ์ด ๊ฒ์์ ์๋ณธ ๋ฒ์ ์ด ๋๋ค. ์ฆ, ํต์ผ๋ ๊ฒ์ ์ธ์คํด์ค ๋ฒ์ ์ด ์กด์ฌํ๋ค.
์ข ๋ฅ
1. Listen Server : ํ๋ ์ด์ด ์ปดํจํฐ๋ค ์ค ํ๋๊ฐ ์๋ฒ ์ปดํจํฐ์ ์ญํ ์ ํ๋ ๊ฒ. (์๋ฒ ์ปดํจํฐ์์ ๋ ๋๋ง ์์ O)
2. Dedicated Server : ์๋ฒ ์ปดํจํฐ๋ ์๋ฒ์ ์ญํ ๋ง ํ๋ ๊ฒ. (์๋ฒ ์ปดํจํฐ์์ ๋ ๋๋ง ์์ X)
์ธ๋ฆฌ์ผ ์๋ฒ๋ Authoritative Client-Server ๋ชจ๋ธ์ ์ฌ์ฉํ๋ค!
Authoritative Client-Server : ์๋ฒ ๋ฒ์ ์ด ์ ์ ๋ฒ์ ์ธ Client-Server ๋คํธ์ํฌ ๋ฐฉ์
{ ํ์ฉ : LAN ์ฐ๊ฒฐ์ ํ์ฉํ ๋ก์ปฌ ๋ฉํฐ ํ๋ ์ด๋ฅผ ๊ตฌํํด๋ณด์! }
LAN์ ํ์ฉํ์ฌ ๋น ๋ฅด๊ฒ ์จ๋ผ์ธ ๋ฉํฐ ํ๋ ์ด๋ฅผ ๊ตฌํํด๋ณด์.
- LAN : Local Area Network์ ์ค์ธ๋ง๋ก ๊ฐ์ ๋ผ์ฐํฐ์ ์ฐ๊ฒฐ๋์ด ์๋ PC์ ๋ก์ปฌ IP ์ฃผ์๋ฅผ ํตํด ๊ฐ์ ๋คํธ์ํฌ๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์ LAN์ด๋ผ๊ณ ํ๋ค.
- Local IP Address : ๋ก์ปฌ ๋คํธ์ํฌ ๋ผ์ฐํฐ์์ ์ปดํจํฐ์ ํ ๋นํ IP์ฃผ์
- Public IP Address : ์ธํฐ๋ท ์๋น์ค ๊ณต๊ธ์๊ฐ ๋ผ์ฐํฐ์ ํ ๋นํ IP์ฃผ์
- Server ->Pulibc IP -> Local IP ๋ฅผ ๊ฑฐ์ฒ PC์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์๋ค.
์ค๋น๋ฌผ : ๊ฐ์ ๋ผ์ฐํฐ๋ก ์ฐ๊ฒฐ๋์ด ์๋ PC1(Listen Server), PC2(Client)
1. PC1์์ .umap์ Listen ์๋ฒ๋ก ์ฐ๋ค.
// listen ์๋ฒ ์ด๊ธฐ
void AMyProjectCharacter::OpenLobby()
{
UWorld* World = GetWorld();
if (World)
{
// Lobby.umap์ listen ์๋ฒ๋ก ์ด๊ธฐ
World->ServerTravel("/Game/ThirdPerson/Maps/Lobby?listen");
}
}
2. PC2์์ PC1์ Local IP๋ฅผ ์ฌ์ฉํด์ ๊ฒ์์ ์ ์ํ๋ค.
// local IP ์
๋ ฅํด์ ์๋ฒ์ ์ฐ๊ฒฐํ๊ธฐ
void AMyProjectCharacter::CallOpenLevel(const FString& Address)
{
UGameplayStatics::OpenLevel(this, *Address);
}
void AMyProjectCharacter::CallClientTravel(const FString& Address)
{
APlayerController* PlayerController = GetGameInstance()->GetFirstLocalPlayerController();
if (PlayerController)
{
PlayerController->ClientTravel(Address, ETravelType::TRAVEL_Absolute);
}
}
๊ฒฐ๊ณผ!
https://youtube.com/shorts/UzThC748S-A