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

๊ฐœ์š”

๋Ÿฐํƒ€์ž„์—์„œ NetworkObject๋ฅผ ์Šคํฐํ•˜๋ ค๋ฉด Runner.Spawn() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ(Scene ์˜ค๋ธŒ์ ํŠธ๋Š” ์ž๋™์œผ๋กœ ์Šคํฐ๋˜๋ฏ€๋กœ ๋ณ„๋„๋กœ ์Šคํฐํ•  ํ•„์š”X)

  • NetworkObject๋Š” Fusion์—์„œ ๋„คํŠธ์›Œํฌ ์ „์—ญ์—์„œ ๊ณ ์œ ํ•œ ์‹๋ณ„์ž๋ฅผ ํ• ๋‹นํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ
  • ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ๊ฐ ๋„คํŠธ์›Œํฌ ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘๋™
  • Runner.Spawn() ๋ฉ”์„œ๋“œ๋Š” Fusion์—๊ฒŒ ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์ง‘ํ•ฉ์ ์ธ ๋„คํŠธ์›Œํฌ ์ƒํƒœ์— ์–ธ์ œ ์–ด๋–ป๊ฒŒ ์ถ”๊ฐ€ํ• ์ง€ ๊ณต์ง€

์ค‘์š”!
Unity์˜ ๋‚ด์žฅ GameObject.Instantiate() ๋ฉ”์„œ๋“œ๋ฅผ ๋„คํŠธ์›Œํฌ ๊ฐ์ฒด์— ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด๋Š” ์™„์ „ํžˆ Fusion ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฃจํ”„์™€ ๋ถ„๋ฆฌ๋œ ๋กœ์ปฌ ๊ฒŒ์ž„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ๋„คํŠธ์›Œํฌ ์ƒํƒœ๊ฐ€ ์†์ƒ๋ฉ๋‹ˆ๋‹ค.

Runner.Spawn

Fusion NetworkRunner ์ธ์Šคํ„ด์Šค์˜ Runner.Spawn() ๋ฉ”์„œ๋“œ๋Š” Unity์˜ GameObject.Instantiate() ๋ฉ”์„œ๋“œ ๋ชจ๋ฐฉ

  • NetworkObject ํƒ€์ž…์˜ Prefab
  • ์œ„์น˜ (position)
  • ํšŒ์ „ (rotation)
  • ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ž…๋ ฅ ๊ถŒํ•œ์„ ์‹๋ณ„ํ•  PlayerRef (Host/Server ๋ชจ๋“œ์—์„œ๋งŒ ๊ด€๋ จ๋จ)
  • ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์— ๊ฐ์ฒด๋ฅผ ๋ณต์ œํ•˜๊ธฐ ์ „์— ์‹คํ–‰ํ•  NetworkRunner.OnBeforeSpawned ํƒ€์ž…์˜ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ (ํ”„๋ฆฌํŒน๋งŒ ํ•„์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ด๋ฉฐ, ๋‚˜๋จธ์ง€๋Š” ์„ ํƒ์‚ฌํ•ญ)
var obj = Runner.Spawn(prefab, Vector3.zero, Quaternion.identity, Runner.LocalPlayer, MyOnBeforeSpawnDelegate);

๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๊ฐ€ Runner.Spawn()์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฒฐ๊ณผ๋Š” ๋„คํŠธ์›Œํฌ ๋ชจ๋“œ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„

  • *Host ๋ฐ Server ๋ชจ๋“œ ์˜ค์ง Host/Server๋งŒ NetworkObject๋ฅผ ์Šคํฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” Host/Server์— ์Šคํฐ ์š”์ฒญ ํ•„์š”(์˜ˆ: RPC)
  • *Shared ๋ชจ๋“œ ์–ด๋–ค ํด๋ผ์ด์–ธํŠธ๋ผ๋„ NetworkObject๋ฅผ ์Šคํฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NetworkObject๋ฅผ ์Šคํฐํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ•ด๋‹น ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ StateAuthority๊ฐ€ ํ• ๋‹น

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

  • ์ž…๋ ฅ ๊ถŒํ•œ์€ ๋ฉ”์„œ๋“œ์— ํด๋ผ์ด์–ธํŠธ์˜ PlayerRef๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ํŠน์ • ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ• ๋‹น(์„ ํƒ ์‚ฌํ•ญ)
  • ์ž…๋ ฅ ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋œ ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณต / (Host๋‚˜ Server์™€ ํ•จ๊ป˜) GetInput()์—์„œ ๊ทธ ์ž…๋ ฅ ๊ตฌ์กฐ๋ฅผ ์กฐํšŒ ๊ฐ€๋Šฅ
  • ๊ฐ์ฒด์— ์ž…๋ ฅ์ด ํ•„์š” ์—†๊ฑฐ๋‚˜ ์ž…๋ ฅ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, null ์ „๋‹ฌ

OnBeforeSpawned

NetworkRunner.OnBeforeSpawned ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ์— ๋งž๋Š” ๋ฉ”์„œ๋“œ๋‚˜ ๋žŒ๋‹ค์‹์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ

public delegate void OnBeforeSpawned(NetworkRunner runner, NetworkObject obj);

์ด ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ํ›„, ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ๋™๊ธฐํ™”๋˜๊ธฐ ์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœ์ž๋Š” ์‹œ์Šคํ…œ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๊ธฐ ์ „์— ์ถ”๊ฐ€์ ์ธ ์‚ฌ์šฉ์ž ์ •์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค์Šคํ…€ ๋„คํŠธ์›Œํฌ ์†์„ฑ์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•œ ์œ„์น˜์ž…๋‹ˆ๋‹ค.

private void MySpawnFunction() {
    Runner.Spawn(
        _objPrefab,
        Vector3.zero,
        Quaternion.identity,
        inputAuthority: null,
        InitializeObjBeforeSpawn,
        predictionKey: null
    );
}

private void InitializeObjBeforeSpawn(NetworkRunner runner, NetworkObject obj) {
    var objSB = obj.GetComponent<ObjSimulationBehaviour>();
    objSB.InitializeObjSettings(_currentExplosionForce);
}

๋žŒ๋‹ค ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋งŽ์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

private void MySpawnFunction() {
    Runner.Spawn(
        _objPrefab,
        Vector3.zero,
        Quaternion.identity,
        inputAuthority: null,
        (Runner, NO) => NO.GetComponent<MyCustomBehaviour>().Init(myInt, myParameter),
        predictionKey: null
    );
}

Spawned

ISpawned.Spawned()๋Š” NetworkRunner๊ฐ€ NetworkObject๋ฅผ ์—ฐ๊ฒฐํ•œ ์งํ›„ ํ˜ธ์ถœ
Spawned() ์ฝœ๋ฐฑ์€ Fusion์˜ Awake()์— ํ•ด๋‹น (๊ฐ์ฒด๊ฐ€ ์—ฐ๊ฒฐ๋˜๊ณ  ์œ ํšจํ•œ ์ƒํƒœ)

NetworkBehaviour๋Š” ๋นˆ ๊ฐ€์ƒ Spawned() ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ISpawned ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„
(์ปค์Šคํ…€ NetworkBehaviour์— ๋Œ€ํ•ด Spawned()๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด Spawned()๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œ)

Spawned()์—์„œ State Authority์—์„œ Networked Property ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด, ๋ชจ๋“  ๋‹ค๋ฅธ ํ”ผ์–ด์—์„œ ๊ทธ NetworkObject์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ดˆ๊ธฐ ๊ฐ’ ์„ค์ •
BUT ์›๊ฒฉ ํ”ผ์–ด๋Š” ํ•ญ์ƒ State Authority์™€ ๊ฐ™์€ Tick์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ(Area of Interest, Interest Management, ์ง€์—ฐ ์ž…์žฅ, ์šฐ์„ ์ˆœ์œ„ ์ง€์ • ๋“ฑ์œผ๋กœ ์ธํ•ด)
โ†’ NetworkObject๊ฐ€ State Authority๋ณด๋‹ค ๋‚˜์ค‘์˜ Tick์— ์›๊ฒฉ์œผ๋กœ ์ƒ์„ฑ๋  ๋•Œ๋Š”, State Authority๊ฐ€ ํ•ด๋‹น ๋‚˜์ค‘์˜ Tick์— ๊ฐ€์ง„ ๊ฐ’์œผ๋กœ ์ƒ์„ฑ

  • State Authority๋ฅผ ๊ฐ€์ง„ ํ”ผ์–ด์—์„œ์˜ ์ƒ์„ฑ์€ Runner.Spawn() ํ˜ธ์ถœ ์งํ›„์— Spawned()๊ฐ€ ํ˜ธ์ถœ
  • Non-State Authority ํ”ผ์–ด์—์„œ๋Š” NetworkRunner๊ฐ€ ๋„คํŠธ์›Œํฌ ์ƒํƒœ๋ฅผ ๋ฐ›์•„์„œ ๋กœ์ปฌ์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” NetworkObject๋ฅผ ์ƒ์„ฑ
    โ†’ NetworkRunner์— ์—ฐ๊ฒฐ๋˜๊ธฐ ์ „์— NetworkObject๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, Runner.Spawn()์— ์ œ๊ณต๋œ OnBeforeSpawned ์ฝœ๋ฐฑ ์‚ฌ์šฉ

IAfterSpawned

IAfterSpawned.AfterSpawned()๋Š” NetworkObject์˜ ๋ฐฐ์น˜๊ฐ€ ์™„๋ฃŒ๋˜๊ณ  ๋ชจ๋“  ISpawned.Spawned() ์ฝœ๋ฐฑ์ด ๋๋‚œ ํ›„ ํ˜ธ์ถœ
Fusion์˜ Start()์— ํ•ด๋‹น NetworkBehaviour๊ฐ€ ๋‹ค๋ฅธ NetworkBehaviour์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์„ค์ •ํ•  ๋•Œ, ์‹คํ–‰ ์ˆœ์„œ์— ๋Œ€ํ•œ ๊ฑฑ์ • ์—†์ด ์ด ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉ

Despawn

๋„คํŠธ์›Œํฌ ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด, ๊ฐ์ฒด์— ๋Œ€ํ•œ State Authority๋ฅผ ๊ฐ€์ง„ ํ”ผ์–ด๊ฐ€ Runner.Despawn() ํ˜ธ์ถœ ๊ฐ€๋Šฅ

Despawned

Runner.Spawn()์ด ISpawned๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—์„œ Spawned() ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, Despawn()์€ IDespawned๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์—์„œ Despawned() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ