스폰하기
소개
NetworkObjects
는 일반적인 GameObject.Instantiate
함수로 인스턴스화할 수 없으며, 반드시 스폰 되어야 합니다.
런타임에 NetworkObject
를 스폰 하려면 Runner.Spawn()
메소드를 사용합니다. 씬 객체는 스폰이 필요하지 않으며, 씬이 로드될 때 자동으로 스폰 됩니다.
NetworkObject
는 Fusion에서 네트워크 전역적으로 고유한 식별자를 할당하여 모든 클라이언트가 각 인스턴스를 구분하고 네트워크 객체 상태를 올바르게 동기화할 수 있도록 합니다. Runner.Spawn()
메소드는 Fusion에 새로운 객체 인스턴스를 네트워크 상태에 추가할 시점과 방법을 알립니다.
중요!
유니티의 기본 GameObject.Instantiate()
메소드를 네트워크 객체에 사용하지 마십시오. 이는 Fusion 시뮬레이션 루프와 분리된 로컬 게임 객체를 생성하며 네트워크 상태를 손상시킵니다.
Runner.Spawn
Fusion의 NetworkRunner
인스턴스의 Runner.Spawn()
메소드는 유니티의 GameObject.Instantiate()
메소드와 유사합니다. 이 메소드에 전달할 수 있는 매개변수는 다음과 같습니다:
NetworkObject
유형의 프리팹- 위치
- 회전
- 입력 권한이 있는 클라이언트를 식별하는
PlayerRef
(호스트/서버 모드에서만 관련 있음) - 다른 인스턴스에서 객체를 복제하기 전에 실행할
NetworkRunner.OnBeforeSpawned
유형의 대리자
프리팹은 필수 매개변수이며, 나머지는 선택 사항입니다.
참고: Spawn
메소드에 위치 및/또는 회전을 전달하면 해당 위치와 회전은 객체를 스폰 한 피어에만 영향을 미칩니다. 이 위치와 회전이 다른 피어에서도 반영되려면 NetworkTransform
또는 NetworkTRSP
를 상속하는 다른 컴포넌트, 또는 트랜스폼 데이터를 동기화하는 커스텀 컴포넌트를 추가해야 합니다.
C#
var obj = Runner.Spawn(prefab, Vector3.zero, Quaternion.identity, Runner.LocalPlayer, MyOnBeforeSpawnDelegate);
모든 클라이언트가 Runner.Spawn()
을 호출할 수 있지만, 결과는 네트워크 토폴로지에 따라 다릅니다.
- 호스트 및 서버 모드: 호스트/서버만
NetworkObjects
를 스폰 할 수 있습니다. 클라이언트는 RPC와 같은 요청을 통해 호스트/서버에 스폰을 요청해야 합니다. - 공유 모드: 모든 클라이언트가
NetworkObject
를 스폰 할 수 있습니다. 객체를 스폰 하면 자동으로 해당 클라이언트에게 상태 권한이 할당됩니다.
입력 권한
입력 권한은 해당 클라이언트의 PlayerRef
를 메소드에 전달하여 특정 클라이언트에 할당됩니다(선택 사항). 입력 권한을 가진 클라이언트는 객체에 대한 입력 데이터를 제공할 수 있으며, 호스트 또는 서버와 함께 GetInput()
구조를 쿼리 할 수 있습니다.
객체가 입력을 필요로 하지 않거나 입력 권한이 특정 클라이언트에 할당되지 않아도 되는 경우 null
을 전달할 수 있습니다.
OnBeforeSpawned
NetworkRunner.OnBeforeSpawned
매개변수는 대리자 서명과 일치하는 메소드나 람다 표현식을 받을 수 있습니다.
C#
public delegate void OnBeforeSpawned(NetworkRunner runner, NetworkObject obj);
이 대리자는 객체가 생성된 후, 다른 인스턴스에서 동기화되기 전에 호출됩니다. 이를 통해 호출자는 시스템의 다른 부분에서 객체를 접근하기 전에 추가적인 커스텀 초기화를 수행할 수 있습니다. 네트워크 속성을 초기화하기에 적합한 위치입니다.
C#
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);
}
람다 표현식을 사용하여 추가 매개변수를 전달하는 것도 가능합니다.
C#
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
를 연결한 직후 호출됩니다(이는 Runner.Spawn()
호출 또는 씬 로드 시 발생할 수 있습니다). Spawned()
콜백은 Fusion의 Awake()
에 해당하며, 객체가 연결된 후 유효한 상태에서 호출됩니다.
NetworkBehaviour
는 빈 가상 메소드인 Spawned()
를 포함하는 ISpawned
인터페이스를 구현합니다. 커스텀 NetworkBehaviour
에서 Spawned()
를 구현하려면 Spawned()
를 오버라이드 하면 됩니다.
Spawned()
에서 상태 권한이 있는 피어가 수행한 네트워크 속성 변경은 모든 다른 피어에서 객체가 스폰 될 때 초기값으로 사용됩니다.
- 상태 권한이 있는 피어에서는
Runner.Spawn()
직후Spawned()
가 호출됩니다. - 상태 권한이 없는 피어에서는 네트워크 상태를 통해
NetworkObject
가 로컬에 존재하지 않을 때 스폰 됩니다.
객체가 NetworkRunner
에 연결되기 전에 초기화가 필요하면, OnBeforeSpawned 콜백을 사용하십시오.
IAfterSpawned
IAfterSpawned.AfterSpawned()
는 NetworkObject
배치가 완료된 후 호출되며, 모든 ISpawned.Spawned()
콜백이 실행된 후 호출됩니다. 이는 Fusion의 Start()
에 해당하며, 스폰 된 후 다른 NetworkBehaviour
의 값을 가져오거나 설정해야 하는 경우에 사용됩니다.
Despawn
네트워크 객체를 제거하려면 해당 객체에 대한 상태 권한이 있는 피어에서 Runner.Despawn()
을 호출할 수 있습니다.
Despawned
Runner.Spawn()
이 ISpawned
를 구현한 클래스(예: NetworkBehaviour
)에서 Spawned()
메소드를 호출하는 것처럼, Despawn()
은 IDespawned
를 구현한 클래스에서 Despawned()
메소드를 호출합니다.