PlayerRef - cheona-thousand-man/Unity-myBasics-Wiki GitHub Wiki
- Player NetworkRunner๋ฅผ ๊ฐ์ง Peer
- [Dedicared Server๊ฐ ์๋ ๊ฒฝ์ฐ] Fusion์ Player Input ์ ๊ณต
-
PlayerRef Player Peer์ ๋ํ Input์ ์ ๊ณตํ ์ ์๋ NetworkRunner์ ๊ณ ์ ์๋ณ์
- Plyer ์๋ณ์๋ก๋ง ์ฌ์ฉ๋๋ฉฐ, Player ํน์ ๋ฐ์ดํฐ๋ฅผ ํฌํจX
- Game Session์ ๋์์ ์ฐ๊ฒฐ๋ ์ ์๋ ์ต๋ ํ๋ ์ด์ด ์
- ๊ธฐ๋ณธ ์ต๋ PlayerCount๋
NetworkProjectConfig
asset ๋ดSimulation > Default Players
์์ ์ ์ญ์ ์ผ๋ก ์ ์ - [์ Game Session ์์ฑ ์]
NetworkRunner.StartGame()
์ ์ ๋ฌ๋nullable StartGameArgs.PlayerCount
๊ฐ์ ์ํด ๊ฒฐ์
(StartGameArgs.PlayerCount
๊ฐ ๊ฐ์ด ํ ๋น๋์ง ์์ ๊ฒฝ์ฐ(null) ์ Game Session์NetworkProjectConfig
์ ๊ธฐ๋ณธ ํ๋ ์ด์ด ์๋ฅผ ์ฌ์ฉ)
Dedicated Server๋ PlayerRef๋ฅผ ๊ฐ์ง์ง ์์ผ๋ฉฐ ํ๋ ์ด์ด๋ก ๊ฐ์ฃผ๋์ง ์์ผ๋ฏ๋ก PlayerCount ํ๋์ ํฌํจ๋์ง ์์ต๋๋ค.
ex) PlayerCount == 4์ธ Game Session์ ๋ค์์ ์ง์
- 1 Host์ 3 Clients
- 1 Dedicated Server์ 4 Clients
- 4 Shared Mode ํด๋ผ์ด์ธํธ
- Player Object Game Session์์ PlayerRef๋ฅผ ํน์ NetworkObject Avatar(์บ๋ฆญํฐ)์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ
- ๊ฐ PlayerRef๋ ํ๋์ NetworkObject์ ์ฐ๊ด
- ์ด ์ฐ๊ด์ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ชจ๋ Client์ ์๋์ผ๋ก ๋ณต์
- PlayerRef โ NetworkObject ์ฐ๊ด์
NetworkRunner.SetPlayerObject(PlayerRef, NetworkObject)
๋ฉ์๋๋ก ์ค์
- [Host & Server ๋ชจ๋] Player Object๋ Host/Server๋ง ์ค์ ๊ฐ๋ฅ
- [Shared ๋ชจ๋] Player๊ฐ ์์ ์ Player Object ์ฐ๊ด๋ง ์ค์ ๊ฐ๋ฅ / ํด๋น Player๋ ์ฐ๊ด๋ NetworkObject์ ๋ํ State Authority ๋ณด์
์ด๋ค Peer๋ผ๋ NetworkRunner.TryGetPlayerObject(PlayerRef, out NetworkObject)
๋ฉ์๋๋ฅผ ํตํด ํน์ PlayerRef์ ์ฐ๊ด๋ NetworkObject ๊ฒ์ ๊ฐ๋ฅ
// INetworkRunnerCallbacks ์ธํฐํ์ด์ค์ ์๋ ๊ธฐ๋ณธ ๊ตฌํ ์ฝ๋ฐฑ OnPlayerJoined()
// ํ๋ ์ด์ด๊ฐ ํฉ๋ฅํ ๋, ํ๋ ์ด์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ ์ํฉ๋๋ค.
void OnPlayerJoined(PlayerRef player, NetworkRunner runner) {
if (Object.HasStateAuthority == false) return;
var plObject = runner.Spawn(PlayerObjectPrefab);
var plData = plObject.GetComponent<PlayerData>();
// SetData๋ ํด๋น NB์ ๋ํด PlayerRef์ ์๋ช
๋์ ์ ์ํฉ๋๋ค.
plData.SetData(player, 3);
runner.SetPlayerObject(player, plObject);
}
// ํ์ํ ๋, ํ๋ ์ด์ด ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
int GetPlayerLife(PlayerRef player) {
if (Runner.TryGetPlayerObject(player, out var plObject)) {
return plObject.GetComponent<PlayerData>().Lifes;
}
Debug.LogError("Player Object Not found");
return 0;
}
- NetworkObject๋ StateAuthority๋ก PlayerRef์ ์ฐ๊ด
- StateAuthority๋ Networked Properties์ ๊ฐ์ NetworkObject์ ์ํ๋ฅผ ์ ์ด
- StateAuthority์์ Networked Property์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ค๋ฅธ ํด๋ผ์ด์ธํธ์ ๋ณต์
- Host/Server ๋ชจ๋ ํญ์ ์๋ฒ/ํธ์คํธ๊ฐ ์ํ ๊ถํ์ ๊ฐ์ง๋ฉฐ, ๊ฒ์ ์ํ์ ๋ํ ๊ถํ์ ๊ฐ์ง ํ๋ ์ด์ดX
-
Shared ๋ชจ๋ ๊ถํ์ด ๋ถ์ฐ๋์ด ํ๋ ์ด์ด ๊ฐ์ ๊ณต์
- ์ํ ๊ถํ์ด ํ ๋น๋์ง ์์๊ฑฐ๋ NetworkObject์
Allow StateAuthorityOverride
๊ฐtrue
๋ก ์ค์ ๋ ๊ฒฝ์ฐ, ์ด๋ค ํ๋ ์ด์ด๋ผ๋ ์ํ ๊ถํ์ ๊ฐ์ง ์ ์์ - ๊ฐ์ฒด๊ฐ ์คํฐ๋ ๋ ์ํ ๊ถํ์ด ํ ๋น๋ ์ ์์ผ๋ฉฐ,
NetworkObject.ReleaseStateAuthority()
๋ฐNetworkObject.RequestStateAuthority()
๋ฅผ ํธ์ถํ์ฌ ๊ถํ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ
- ์ํ ๊ถํ์ด ํ ๋น๋์ง ์์๊ฑฐ๋ NetworkObject์
[Share/Host ๋ชจ๋] NetworkObject๋ ์ ๋ ฅ ๊ถํ์ ๊ฐ์ง ์ ์์
- ํ๋ ์ด์ด๋ ์ฌ๋ฌ NetworkObjects์ ๋ํด ์ ๋ ฅ ๊ถํ ๋ณด์ ๊ฐ๋ฅ
- ํ๋ ์ด์ด๊ฐ NetworkObject์ ๋ํด ์
๋ ฅ ๊ถํ์ ๊ฐ์ง๊ณ ์์ ๋,
- ํด๋น Object์ ๋ํ ์ ๋ ฅ์ ์ ์ก ๊ฐ๋ฅ
- ์๋ฒ๋ ํน์ ๊ฐ์ฒด์ ๋ํ ์ ๋ ฅ์ ์ฐพ์ ๋ ์ด๋ฅผ ์์
- Client โ Server ์ฃผ์ ํต์ ๋ฐฉ์
๊ฒ์์ด ๋จ์ผ NetworkRunner์์ ์ฌ๋ฌ ๋ก์ปฌ ๋ฌผ๋ฆฌ์ ํ๋ ์ด์ด๋ฅผ ํ์ฉํ๋ ๊ฒฝ์ฐ(์: ์จ๋ผ์ธ ํ๋ ์ด์ด์ ๊ฒฐํฉ๋ ์ํ ํ๋ ๊ฒ์),
- Fusion์ 'Player' ๊ฐ๋ ๊ณผ๋ ๋ ๋ฆฝ์ ์ผ๋ก ๋ก์ปฌ ํ๋ ์ด์ด๋ฅผ ๊ตฌ๋ถํ๋ ๊ฒ์ ํน์ ๋ก์ง์ด ํ์
- ์ฌ๋ฌ ๋ก์ปฌ ํ๋ ์ด์ด์ ๋ชจ๋ ์ ๋ ฅ์ Fusion์ ์ ๋ ฅ ์์คํ ์ผ๋ก ํตํฉ
- ํ๋์ ๋คํธ์ํฌ ์ ๋ ฅ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๋ก์ปฌ ํ๋ ์ด์ด ์ ๋ ฅ์ ๋ํ ๋ฐ์ดํฐ ํฌํจ
์ฌ๋ฌ ๋ก์ปฌ ํ๋ ์ด์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ,
SetPlayerObject
๋๋OnPlayerJoined
์ ๊ฐ์ PlayerRef์ ์์กดํ๋ ํจ์๋ฅผ ์ฌ์ฉํ ๋ ์ถ๊ฐ์ ์ธ ์ฌ์ฉ์ ์ ์ ๋ก์ง์ด ํ์ํฉ๋๋ค.