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

๊ฐœ์š”

  • NetworkObject ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€์ง„ GameObject
  • ๋ฃธ(Room) ๋‚ด์—์„œ ๋‹จ์ผ ๋„คํŠธ์›Œํฌ ์—”ํ‹ฐํ‹ฐ
  • Spawning์ด๋‚˜ Scene Object ๋กœ๋”ฉ์œผ๋กœ ์ƒ์„ฑ

NetworkId

  • NetworkId ์„œ๋ฒ„์—์„œ NetworkObject ์ปดํฌ๋„ŒํŠธ์— ํ• ๋‹นํ•˜๋Š” Room ๋‚ด ๊ณ ์œ  ์ •์ˆ˜ ์‹๋ณ„์ž
  • ๋ชจ๋“  Peer ๊ฐ„ ์ผ๊ด€์„ฑ / ๋„คํŠธ์›Œํฌ์—์„œ Object ์ฐธ์กฐ์— ์‚ฌ์šฉ

Spawning Network Objects

Object๊ฐ€ ์„œ๋ฒ„์— ์ƒ์„ฑ๋˜๊ณ , Network Object & State๊ฐ€ ์—ฐ๊ด€๋œ ๋ชจ๋“  Peer์—๊ฒŒ ๋ณต์ œ

  • Runner.Spawn() ํ˜ธ์ถœ
    • NetworkObject ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋Š” GameObject ์ƒ์„ฑ
    • Spawn ์•ก์…˜์ด ๋„คํŠธ์›Œํฌ์— ๋ณต์ œ
    • (Runner.StartGame()์— ์ „๋‹ฌ๋œ) INetworkObjectProvider ์ธ์Šคํ„ด์Šคํ™” ๋œ Prefab, ๊ธฐ์กด ๊ฐ์ฒด ๋ณต์ œ, ์ฝ”๋“œ๋กœ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž Object ์ƒ์„ฑ, Pool์—์„œ ๊ฐ์ฒด ๊ฐ€์ ธ์˜ค๊ธฐ ๋“ฑ spawned Object ๊ตฌํ˜„ ํฌํ•จ
  • Network Object๊ฐ€ ํฌํ•จ๋œ Scene ๋กœ๋“œ

A. Runner.Spawn()์œผ๋กœ NetworkObject ์ƒ์„ฑ

  • [Host Mode] ์„œ๋ฒ„์—์„œ๋งŒ ํ˜ธ์ถœ
  • [Shared Mode] ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ์ƒํƒœ ๊ถŒํ•œ์„ ๊ฐ€์งˆ ํด๋ผ์ด์–ธํŠธ์—์„œ ํ˜ธ์ถœ
  • ํ˜ธ์ถœ ์‹œ,
    • ์ง€์ •๋œ Prefab ์ธ์Šคํ„ด์Šคํ™”
    • NetworkObject ์ปดํฌ๋„ŒํŠธ NetworkRunner์— ์—ฐ๊ฒฐ
    • ์—ฐ๊ด€๋œ ๋ชจ๋“  Client์— ๋ณต์ œ

B. Prefab / Object Table

  • Prefab์˜ ๋„คํŠธ์›Œํฌ Spawn์„ ์œ„ํ•ด์„œ๋Š” Fusion์— ๋“ฑ๋ก ํ•„์š”
    • ์ผ๋ฐ˜์ ์œผ๋กœ Fusion toolset์—์„œ Prefab ์ž๋™ ๊ฐ์ง€/๋“ฑ๋ก
    • Unity Inspector์—์„œ NetworkProjectConfig์—์„œ Rebuild Object Table์„ ๋ˆŒ๋Ÿฌ ๊ฐ์ง€ ์ž‘์—… ์ˆ˜๋™ ํŠธ๋ฆฌ๊ฑฐ

C. ๋Ÿฐํƒ€์ž„ ์‹œ NetworkBehaviour ์ถ”๊ฐ€/์ œ๊ฑฐ

  • Network Object Spawn ์ดํ›„ NetworkBehaviour ์ถ”๊ฐ€/์ œ๊ฑฐ ๋ถˆ๊ฐ€
  • Spawn ์ด์ „ NetworkBehaviour์„ ๋Ÿฐํƒ€์ž„์—์„œ ์ถ”๊ฐ€/์ œ๊ฑฐ ๊ฐ€๋Šฅ
    • NetworkObject ๋„คํŠธ์›Œํ‚น ์‚ฌ์šฉ ์ค€๋น„(bake)
      • NetworkBehaviour ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
      • Rpc ๋ฐ ์ฝœ๋ฐฑ ๋“ฑ๋ก
      • ๋„คํŠธ์›Œํ‚น ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ƒ์„ฑ
      • Prefab ์ •๋ณด ์ €์žฅ
    • INetworkObjectProvider ๊ตฌํ˜„์„ ํ†ตํ•ด ์ธ์Šคํ„ด์Šคํ™”

Scene Network Object ๋กœ๋“œ

  • ISceneManager ์ธ์Šคํ„ด์Šค๋กœ Scene ๋กœ๋“œ
    • Scene ๋‚ด ํ™œ์„ฑํ™”๋œ NetworkObject ์„œ๋ฒ„(Server Mode) or ๋งˆ์Šคํ„ฐ ํด๋ผ์ด์–ธํŠธ(Shared Mode)์— ์ฒจ๋ถ€
    • [Server/Master Client] ๊ฐ Scene Object์— ํ• ๋‹น๋œ NetworkId๊ฐ€ ๋ชจ๋“  Client์— ์ „๋‹ฌ
    • [Client] ๋กœ๋“œ๋œ Scene Objcet ์ฒจ๋ถ€ & NetworkId ํ• ๋‹น

์ฒจ๋ถ€(Attaching)

  • Attaching when NetworkObject Spawn or Load with Scene
    • Network Object์— NetworkId ํ• ๋‹น
    • NetwrokBehaviour ์ปดํฌ๋„ŒํŠธ์˜ ๋„คํŠธ์›Œํฌ ์†์„ฑ์„ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น
    • ๋ชจ๋“  ๊ด€๋ จ๋œ NerworkBehaviour๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๊ณผ์ •
  • After attaching
    • Network Object๋Š” ๋ชจ๋“  ์ž์‹ NetworkBehaviour์—์„œ Spawned() ํ˜ธ์ถœ
    • ์ดํ›„ Network Object ์œ ํšจํ•จ โ†’ ๋„คํŠธ์›Œํฌ ์†์„ฑ / Rpc ๋ฉ”์„œ๋“œ ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • FixedUpdateNetwork() / Render() ๊ฐ™์€ ๋ชจ๋“  ๊ด€๋ จ ์ด๋ฒคํŠธ ๋ฉ”์„œ๋“œ&์ธํ„ฐํŽ˜์ด์Šค ํ˜ธ์ถœ ์‹œ์ž‘

State Authority

  • PlayerRef์— ์˜ํ•ด ๋ชจ๋“  Attached Network Object has (๋ช…์‹œ์ or์•”์‹œ์ ) State Authority
  • [Runner.StateAuthority == PlayerRef.None] ์„œ๋ฒ„ Peer๊ฐ€ ์•”์‹œ์  State Authority ๋ณด์œ 

A. ์„œ๋ฒ„ ๋ชจ๋“œ(Host/Dedicated/Single)

  • Runner.StateAuthority == PlayerRef.None(์„œ๋ฒ„๊ฐ€ ํ•ญ์ƒ ์ƒํƒœ ๊ถŒํ•œ ๋ณด์œ )
  • ์ƒํƒœ ๊ถŒํ•œ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€

B. ๊ณต์œ  ์„œ๋ฒ„ ๋ชจ๋“œ

NetworkObject.StateAuthority๋Š” ์œ ํšจํ•œ PlayerRef

  • ์ƒํƒœ ๊ถŒํ•œ์€ ํ• ๋‹น ๋ถˆ๊ฐ€
    • (ํ˜„์žฌ ์ƒํƒœ ๊ถŒํ•œ์ด ์žˆ๋”๋ผ๋„)ํ”Œ๋ ˆ์ด์–ด๋Š” ์ƒํƒœ ๊ถŒํ•œ์„ ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด์—๊ฒŒ ํ• ๋‹น ๋ถˆ๊ฐ€
  • ์ƒํƒœ ๊ถŒํ•œ์€ ํš๋“ ๊ฐ€๋Šฅ
    • ํ”Œ๋ ˆ์ด์–ด์˜ Object.RequestStateAuthority() ํ˜ธ์ถœ๋กœ ๊ถŒํ•œ ํš๋“ ์‹œ๋„ ๊ฐ€๋Šฅ
  • RequestStateAuthority() ์„ฑ๊ณต ์กฐ๊ฑด(๋‘˜ ์ค‘ ํ•˜๋‚˜)
    • NetworkObject.AllowStateAuthorityOverrider == ture
    • ์ด์ „ ์ƒํƒœ ๊ถŒํ•œ ์†Œ์œ ์ž๊ฐ€ Object.ReleaseStateAuthority()๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฝ์šฐ

C. Input Authority

  • ์„œ๋ฒ„ ๋ชจ๋“œ(Host/Dedicated/Single)์—์„œ๋งŒ ์ ์šฉ(๊ณต์œ  ์„œ๋ฒ„ ๋ชจ๋“œ ์ ์šฉX)
  • GetInput() ํ˜ธ์ถœ ์‹œ, ํ•ด๋‹น ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋ฐ˜ํ™˜๋  Player ์ž…๋ ฅ

D. NetworkObject์˜ [Networked] Property์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ ์„ค์ •

GetComponent().Flags |= NetworkObjectFlags.MasterClientObject;

  • ํ˜ธ์ŠคํŠธ-ํด๋ผ์ด์–ธํŠธ ๋ชจ๋“œ Host๋งŒ ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ์— ์žˆ๋Š” [Networked] ์†์„ฑ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ถŒํ•œ ๋ณด์œ 
  • ๊ณต์œ  ๋ชจ๋“œ Master Client๋งŒ ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ์— ์žˆ๋Š” [Networked] ์†์„ฑ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ถŒํ•œ ๋ณด์œ 
  • ์ผ๋ฐ˜ ํด๋ผ์ด์–ธํŠธ Local Client๋Š” ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ์— ์žˆ๋Š” [Networked] ์†์„ฑ ์ฝ๊ธฐ ๊ถŒํ•œ๋งŒ ๋ณด์œ  / non-Networked ์†์„ฑ์˜ ๊ฒฝ์šฐ ๋กœ์ปฌ ์ธ์Šคํ„ด์Šค๋ณ„๋กœ ๋ณ€๊ฒฝ๊ฐ€๋Šฅ

Replication(๋ณต์ œ)

  • when NetworkObject attached
    • ๊ฐ Tick๊ณผ ํ•จ๊ป˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
    • State Authority๋Š” ๊ฒฐ๊ณผ ์ƒํƒœ๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋“  Peer์—๊ฒŒ ๋ณต์ œ

Interest Management

  • NetworkObject ๋ณต์ œ ๋Œ€์ƒ Player ์ œํ•œ ๊ฐ€๋Šฅ
    • Area Of Interest๋ฅผ ํ™œ์šฉํ•œ ํŠน์ • Player Object ์—…๋ฐ์ดํŠธ ์ œ์™ธ

Netsting(์ค‘์ฒฉ)

  • NetworkObject ์ถฉ์ ‘ ์ง€์›
    • NetworkObject๊ฐ€ ๊ณ„์ธต ๊ตฌ์กฐ์—์„œ ๋‹ค๋ฅธ Object์˜ ์ž์‹์ด ๋˜๋Š” ๊ฒƒ

์ฃผ์š” ์†์„ฑ/ํ”„๋กœํผํ‹ฐ/๋ฉ”์„œ๋“œ

1. ์†์„ฑ

  • NetworkId Id The unique identifier for this network entity.
  • NetworkRunner Runner The NetworkRunner this entity is associated with.

2. ํ”„๋กœํผํ‹ฐ

  • HasInputAuthority[get] Returns if Simulation.LocalPlayer is the designated Input Authority for this network entity.
  • HasStateAuthority[get] Returns if Simulation.LocalPlayer is the designated State Authority for this network entity.
  • IsValid[get] Returns if this network entity is associated with its NetworkRunner, and that runner is not null.
  • Name[get] The ID + Unity GameObject name for this entity.
  • PlayerRef StateAuthority[get] Returns the PlayerRef that has State Authority over this network entity. PlayerRefs are assigned in order from 0 to MaxPlayers-1 and are re-used as players join and leave. The only caveat is that the server player (if one exists), always gets the last index no matter how many clients are connected.

3. ๋ฉ”์„œ๋“œ

  • ReleaseStateAuthority ()
  • RemoveInputAuthority () Removes input authority from whichever player has it for this object. Only valid when called on a Host or Server peer.
  • RequestStateAuthority ()