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())์ ์ผ๋ถ
- NetworkBehaviour ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ง ๊ณ ์ ํ ๋คํธ์ํฌ ์๋ณ์
- ๋คํธ์ํฌ ์์ฑ or RPC ์ฐธ์กฐ๋ฅผ ์ํด ๋คํธ์ํฌ๋ก ์ ์ก ๊ฐ๋ฅ
- 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)๊ฐ ๋๋ ํ ์คํ๋ฉ๋๋ค
- ์ฌ์ฉ์ ์ ์ 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()
{
// ๋ ๋๋ง ํ ์คํ๋๋ ์ฝ๋
}
}
- ๋ฌธ์ Fusion์ ๊ณ ์ Tick ๊ธฐ๋ฐ ๋คํธ์ํน ์์ง์ด๋ฏ๋ก Unity FixedUpdate()์ ์ ์ฌํ๊ฒ ์ฒ๋ฆฌ
- ํด๊ฒฐ by Render() ์ง์ Tick๊ณผ ํ์ฌ Tick์์ ์๋ฎฌ๋ ์ด์ (์ฒ๋ฆฌ)๋ ์ค๋ ์ท(๊ฒฐ๊ณผ) ์ฌ์ด๋ฅผ ์ ํ ๋ณด๊ฐ(lerp)ํ์ฌ ๋ถ๋๋ฌ์ด ๋ ๋๋ง ์ฒ๋ฆฌ
ํน์ ํ์ด๋ฐ ์ด๋ฒคํธ๋ฅผ ์ํ ์ด๋ฒคํธ ๊ตฌํ ๊ฐ๋ฅ
- IAfterSpawned
- IBeforeTick
- IBeforeAllTicks
- IAfterTick
- IAfterAllTicks
- IStateAuthorityChanged
- IPlayerJoined
- IPlayerLeft
RPC๋ฅผ ํตํด ๋ฉ์์ง ํธ๋ค๋ฌ ์ ์ธ/๊ตฌํ ๊ฐ๋ฅ
- 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; }
}
- bool InvokeRpc
- NetworkBehaviourId Id[get] The unique identifier for this network behaviour.
- 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).