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() ๋ฉ์๋๋ฅผ ํธ์ถ