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

๊ฐœ์š”

NetworkBehaviour๋Š” Unity MonoBehaviour ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์•„ ๋‹ค์Œ ๊ธฐ๋Šฅ ํ™•์žฅ

  • Runner ์†์„ฑ์œผ๋กœ ๊ด€๋ จ๋œ NetworkRunner ์ฐธ์กฐ
  • Object ์†์„ฑ์œผ๋กœ ๊ด€๋ จ๋œ NetworkObject ์ฐธ์กฐ
  • ๋„คํŠธ์›Œํฌ ์†์„ฑ(Networked Properties) ์ฒ˜๋ฆฌ
  • Rpc(Remote Procedure Calls) ์ฒ˜๋ฆฌ
  • ๊ฐ€์ƒ ์ด๋ฒคํŠธ ์ฝœ๋ฐฑ Spawned(), Despawned(NetworkRunner runner, bool hasState), FixedUpdateNetwork(), Render()
  • ํ๋ฆ„ ์ œ์–ด๋ฅผ ์œ„ํ•œ ๊ถŒํ•œ ๋ณ„์นญ(Aliases for authority) HasStateAuthority, HasInputAuthority, IsProxy

๊ฐœ์ˆ˜ ์ƒ๊ด€์—†์ด NetworkObject์™€ ๊ทธ ์ž์‹ transform์— ์ปดํฌ๋„ŒํŠธ๋กœ ์‚ฝ์ž… ๊ฐ€๋Šฅ

NetworkBehaviour ์ธ์Šคํ„ด์Šค๋Š” ์‚ฝ์ž…๋œ NetworkObject์˜ ์ƒํƒœ(Networked Properties) ๋ฐ ์‹œ๋ฎฌ๋ ˆ์ด์…˜(FixedUpdateNetwork())์˜ ์ผ๋ถ€

NetworkBehaviourId

  • NetworkBehaviour ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง„ ๊ณ ์œ ํ•œ ๋„คํŠธ์›Œํฌ ์‹๋ณ„์ž
  • ๋„คํŠธ์›Œํฌ ์†์„ฑ or RPC ์ฐธ์กฐ๋ฅผ ์œ„ํ•ด ๋„คํŠธ์›Œํฌ๋กœ ์ „์†ก ๊ฐ€๋Šฅ

๋„คํŠธ์›Œํฌ ์†์„ฑ(Networked Properties / State)

  • NetworkBehaviour์—์„œ ์ •์˜๋œ [Networked] ํŠน์„ฑ์„ ๊ฐ€์ง„ ์†์„ฑ
  • NetworkObject ์ƒํƒœ ํ‘œํ˜„ โ†’ State Authority Peer์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  Peer์—๊ฒŒ ๋ณต์ œ
  • [Server Mode] ์„œ๋ฒ„๊ฐ€ ํ•ญ์ƒ State Authority
  • [Shared Mode] Player๊ฐ€ State Authority
  • ๋ณ„๋„์˜ ์ž‘์—…์—†์ด ์ž๋™ ๊ตฌํ˜„๋œ ์†์„ฑ(๋นˆ {get; set;} ํ˜•ํƒœ)
  • NetworkBehaiour๊ฐ€ Spawned() ํ˜ธ์ถœ๋œ ์ดํ›„๋ถ€ํ„ฐ ์ ‘๊ทผ ๊ฐ€๋Šฅ

์ด๋ฒคํŠธ ํ•จ์ˆ˜

๊ตฌํ˜„ ์ถ”๊ฐ€๋ฅผ ์œ„ํ•ด ์˜ค๋ฒ„๋ผ์ด๋“œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ƒ Lifecycle ์ด๋ฒคํŠธ ํ•จ์ˆ˜

  • FixedUpdateNetwork() Unity์˜ FixedUpdate() ๋Œ€์‹  ์‚ฌ์šฉ Fusion์˜ ๊ณ ์ • ์‹œ๊ฐ„ ๋‹จ๊ณ„ ์ฝœ๋ฐฑ. Simulation Tick๋‹น ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ํ•ต์‹ฌ ๊ฒŒ์ž„ ๋กœ์ง์˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค
  • Spawned() Start() ๋Œ€์‹  ์‚ฌ์šฉ NetworkObject๊ฐ€ NetworkRunner์— ์—ฐ๊ฒฐ๋œ ํ›„ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๊ณ  ๋„คํŠธ์›Œํฌ ์†์„ฑ๊ณผ RPC๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ํ›„ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค
  • Despawned(NetworkRunner runner, bool hasState) OnDestroy() ๋Œ€์‹  ์‚ฌ์šฉ ๋„คํŠธ์›Œํฌ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์†Œ๋ฉธ๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค
    • NetworkRunner runner ์ด ๋„คํŠธ์›Œํฌ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์†ํ•ด ์žˆ๋˜ NetworkRunner
    • bool hasState ๋™์ž‘์˜ ์ƒํƒœ๊ฐ€ ์—ฌ์ „ํžˆ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€
  • Render() Update() ๋Œ€์‹  ์‚ฌ์šฉ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ”„๋ ˆ์ž„ ๋ Œ๋”๋ง ํ›„ ์ฝœ๋ฐฑ. ๋ชจ๋“  ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋‹จ๊ณ„(FixedUpdateNetwork)๊ฐ€ ๋๋‚œ ํ›„ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค

FixedUpdateNetwork() (Simulation)

  • ์‚ฌ์šฉ์ž ์ •์˜ simulation ์ฝ”๋“œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฉ”์„œ๋“œ
    • ์‚ฌ์šฉ์ž ๊ฑด๊ฐ• ์ƒํƒœ ์˜ˆ์ œ
public class Health : NetworkBehaviour
{
    // ๋„คํŠธ์›Œํฌ ์†์„ฑ ์ •์˜
    [Networked] public int CurrentHealth { get; set; }

    public override void FixedUpdateNetwork()
    {
        // ๊ฑด๊ฐ• ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ฝ”๋“œ
        if (Object.HasInputAuthority)
        {
            if (Input.GetKey(KeyCode.Space))
            {
                CurrentHealth--;
            }
        }
    }

    public override void Spawned()
    {
        // ์ดˆ๊ธฐํ™” ์ฝ”๋“œ
        CurrentHealth = 100;
    }

    public override void Despawned(NetworkRunner runner, bool hasState)
    {
        // ์†Œ๋ฉธ ์ „์— ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
        Debug.Log("Object despawned");
    }

    public override void Render()
    {
        // ๋ Œ๋”๋ง ํ›„ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ
    }
}

Render() (Interpolation)

  • ๋ฌธ์ œ Fusion์€ ๊ณ ์ • Tick ๊ธฐ๋ฐ˜ ๋„คํŠธ์›Œํ‚น ์—”์ง„์ด๋ฏ€๋กœ Unity FixedUpdate()์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ฒ˜๋ฆฌ
  • ํ•ด๊ฒฐ by Render() ์ง์ „ Tick๊ณผ ํ˜„์žฌ Tick์—์„œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜(์ฒ˜๋ฆฌ)๋œ ์Šค๋ƒ…์ƒท(๊ฒฐ๊ณผ) ์‚ฌ์ด๋ฅผ ์„ ํ˜• ๋ณด๊ฐ„(lerp)ํ•˜์—ฌ ๋ถ€๋“œ๋Ÿฌ์šด ๋ Œ๋”๋ง ์ฒ˜๋ฆฌ

Callback Interfaces

ํŠน์ • ํƒ€์ด๋ฐ ์ด๋ฒคํŠธ๋ฅผ ์œ„ํ•œ ์ด๋ฒคํŠธ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

  • IAfterSpawned
  • IBeforeTick
  • IBeforeAllTicks
  • IAfterTick
  • IAfterAllTicks
  • IStateAuthorityChanged
  • IPlayerJoined
  • IPlayerLeft

Remote Procedure Calls(RPC)

RPC๋ฅผ ํ†ตํ•ด ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ ์„ ์–ธ/๊ตฌํ˜„ ๊ฐ€๋Šฅ

Generics

  • NetworekBehaviour๋ฅผ ์ƒ์†๋ฐ›๋Š” ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • [Networked] ์†์„ฑ or RPC ์ œ๋„ค๋ฆญ ๊ธฐ๋ณธ ํด๋ž˜์Šค or ์ด๋ฅผ ์ƒ์†๋ฐ›๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์—์„œ ์ •์˜/๊ตฌํ˜„ ๊ฐ€๋Šฅ
    • ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ
// This is VALID
class ValidGenericClass_With_NonGenericProperty<T> : NetworkBehaviour {
    [Networked] public int Prop { get; set; }
}
  • ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ: Networked ์†์„ฑ์— ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฃŒํ˜•์ด ๊ธฐ๋ณธํ˜• or NetworkBehaviour๋ฅผ ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค์ธ์ง€ ์•Œ ์ˆ˜ ์—†์Œ
// This is INVALID
class InValidGenericClass_With_GenericProperty<T> : NetworkBehaviour {
    [Networked] public T Prop { get; set; }
}

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

1. ์†์„ฑ

  • bool InvokeRpc

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

  • NetworkBehaviourId Id[get] The unique identifier for this network behaviour.

3. ๋ฉ”์„œ๋“œ

  • GetInput< T > (out T input) Returns true if it a valid INetworkInput can be found for the current simulation tick (Typically this is used in FixedUpdateNetwork).
โš ๏ธ **GitHub.com Fallback** โš ๏ธ