PlayerRef - cheona-thousand-man/Unity-myBasics-Wiki GitHub Wiki

๊ฐœ์š”

  • Player NetworkRunner๋ฅผ ๊ฐ€์ง„ Peer
  • [Dedicared Server๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ] Fusion์— Player Input ์ œ๊ณต

PlayerRef

  • PlayerRef Player Peer์— ๋Œ€ํ•œ Input์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” NetworkRunner์˜ ๊ณ ์œ  ์‹๋ณ„์ž
    • Plyer ์‹๋ณ„์ž๋กœ๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ, Player ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จX

PlayerCount

  1. Game Session์— ๋™์‹œ์— ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ํ”Œ๋ ˆ์ด์–ด ์ˆ˜
  2. ๊ธฐ๋ณธ ์ตœ๋Œ€ PlayerCount๋Š” NetworkProjectConfig asset ๋‚ด Simulation > Default Players์—์„œ ์ „์—ญ์ ์œผ๋กœ ์ •์˜
  3. [์ƒˆ 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 ์ •์˜

  1. Player Object Game Session์—์„œ PlayerRef๋ฅผ ํŠน์ • NetworkObject Avatar(์บ๋ฆญํ„ฐ)์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•
  2. ๊ฐ PlayerRef๋Š” ํ•˜๋‚˜์˜ NetworkObject์™€ ์—ฐ๊ด€
  3. ์ด ์—ฐ๊ด€์€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ชจ๋“  Client์— ์ž๋™์œผ๋กœ ๋ณต์ œ
  4. 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;
}

์ƒํƒœ ๊ถŒํ•œ (State Authority)

  1. NetworkObject๋Š” StateAuthority๋กœ PlayerRef์™€ ์—ฐ๊ด€
  2. StateAuthority๋Š” Networked Properties์™€ ๊ฐ™์€ NetworkObject์˜ ์ƒํƒœ๋ฅผ ์ œ์–ด
  3. StateAuthority์—์„œ Networked Property์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ์— ๋ณต์ œ
  • Host/Server ๋ชจ๋“œ ํ•ญ์ƒ ์„œ๋ฒ„/ํ˜ธ์ŠคํŠธ๊ฐ€ ์ƒํƒœ ๊ถŒํ•œ์„ ๊ฐ€์ง€๋ฉฐ, ๊ฒŒ์ž„ ์ƒํƒœ์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ํ”Œ๋ ˆ์ด์–ดX
  • Shared ๋ชจ๋“œ ๊ถŒํ•œ์ด ๋ถ„์‚ฐ๋˜์–ด ํ”Œ๋ ˆ์ด์–ด ๊ฐ„์— ๊ณต์œ 
    • ์ƒํƒœ ๊ถŒํ•œ์ด ํ• ๋‹น๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ NetworkObject์— Allow StateAuthorityOverride๊ฐ€ true๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ, ์–ด๋–ค ํ”Œ๋ ˆ์ด์–ด๋ผ๋„ ์ƒํƒœ ๊ถŒํ•œ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ
    • ๊ฐ์ฒด๊ฐ€ ์Šคํฐ๋  ๋•Œ ์ƒํƒœ ๊ถŒํ•œ์ด ํ• ๋‹น๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, NetworkObject.ReleaseStateAuthority() ๋ฐ NetworkObject.RequestStateAuthority()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ถŒํ•œ์„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

์ž…๋ ฅ ๊ถŒํ•œ (Input Authority)

[Share/Host ๋ชจ๋“œ] NetworkObject๋Š” ์ž…๋ ฅ ๊ถŒํ•œ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ

  • ํ”Œ๋ ˆ์ด์–ด๋Š” ์—ฌ๋Ÿฌ NetworkObjects์— ๋Œ€ํ•ด ์ž…๋ ฅ ๊ถŒํ•œ ๋ณด์œ  ๊ฐ€๋Šฅ
  • ํ”Œ๋ ˆ์ด์–ด๊ฐ€ NetworkObject์— ๋Œ€ํ•ด ์ž…๋ ฅ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋•Œ,
    • ํ•ด๋‹น Object์— ๋Œ€ํ•œ ์ž…๋ ฅ์„ ์ „์†ก ๊ฐ€๋Šฅ
    • ์„œ๋ฒ„๋Š” ํŠน์ • ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ž…๋ ฅ์„ ์ฐพ์„ ๋•Œ ์ด๋ฅผ ์ˆ˜์‹ 
    • Client โ†’ Server ์ฃผ์š” ํ†ต์‹  ๋ฐฉ์‹

ํ•˜๋‚˜์˜ ๊ธฐ๊ธฐ์—์„œ ์—ฌ๋Ÿฌ ๋กœ์ปฌ ํ”Œ๋ ˆ์ด์–ด

๊ฒŒ์ž„์ด ๋‹จ์ผ NetworkRunner์—์„œ ์—ฌ๋Ÿฌ ๋กœ์ปฌ ๋ฌผ๋ฆฌ์  ํ”Œ๋ ˆ์ด์–ด๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: ์˜จ๋ผ์ธ ํ”Œ๋ ˆ์ด์–ด์™€ ๊ฒฐํ•ฉ๋œ ์†ŒํŒŒ ํ˜‘๋™ ๊ฒŒ์ž„),

  • Fusion์˜ 'Player' ๊ฐœ๋…๊ณผ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๋กœ์ปฌ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒŒ์ž„ ํŠน์ • ๋กœ์ง์ด ํ•„์š”
  • ์—ฌ๋Ÿฌ ๋กœ์ปฌ ํ”Œ๋ ˆ์ด์–ด์˜ ๋ชจ๋“  ์ž…๋ ฅ์€ Fusion์˜ ์ž…๋ ฅ ์‹œ์Šคํ…œ์œผ๋กœ ํ†ตํ•ฉ
  • ํ•˜๋‚˜์˜ ๋„คํŠธ์›Œํฌ ์ž…๋ ฅ ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๋กœ์ปฌ ํ”Œ๋ ˆ์ด์–ด ์ž…๋ ฅ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ํฌํ•จ

์—ฌ๋Ÿฌ ๋กœ์ปฌ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, SetPlayerObject ๋˜๋Š” OnPlayerJoined์™€ ๊ฐ™์€ PlayerRef์— ์˜์กดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ถ”๊ฐ€์ ์ธ ์‚ฌ์šฉ์ž ์ •์˜ ๋กœ์ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ