레플리카를 그대로 두고 장면을 전환하는 방법

게임에서는 플레이가 진행됨에 따라 여러 장면을 옮겨다닐 때가 많습니다.

Strix 서버와 방 연결은 게임 월드, 현재 장면과 분리되어 있습니다. 그러나 장면을 전환하면 기존 레플리카가 망가져 멀티플레이어 동기화에 영향을 줄 수 있습니다.

Strix는 장면 전환 중에 레플리카를 나타내는 네트워크 개체를 자동 파기하지 못하도록 일시정지을 복제했다가 나중에 재가동합니다.

문제

파티 멤버로 RPG를 플레이하고 있는데, 파티가 던전에 들어간다고 합시다. 파티 멤버 전원의 게임 클라이언트 각각에 새 장면(던전 입장)이 로드됩니다. 클라이언트마다 장면이 전환되는 시점은 다를 수 있어서, 가장 빠른 클라이언트는 이미 새 장면에서 개체를 복제하여 다른 클라이언트로 보내기 시작하는데 어떤 클라이언트는 아직 이전 장면을 빠져나오지 못했을 수 있습니다.

그러면 레플리카는 느린 클라이언트의 이전 장면에 인스턴스화됩니다. 그리고 새 장면이 로드되는 동안 레플리카는 망가집니다.

이것은 복제를 잠시 멈추면 해결할 수 있는 문제입니다.

해결책

일시정지

게임 월드에서 네트워크 개체의 생성과 삭제를 일시정지하려면 StrixNetwork 싱글톤의 autoInstantiateReplica 속성값을 거짓으로 설정하면 됩니다.

StrixNetwork.instance.autoInstantiateReplica = false;

장면 전환

파티 멤버가 모두 복제를 일시정지하고 나면 새 장면을 로드합니다.

SceneManager.LoadScene("OtherSceneName");

일시정지 해제

새 장면에서 복제 일시정지를 해제합니다.

일시정지를 해제하려면 삭제된 레플리카를 복원해야 합니다. 이것은 RespawnReplicas 메서드로 가능합니다.

또, 일시정지를 해제하면 autoInstantiateReplica도 참으로 설정해도 됩니다.

StrixNetwork.instance.RespawnReplicas();
StrixNetwork.instance.autoInstantiateReplica = true;