장면을 전환하는 방법

Unreal의 레벨 시스템은 Strix의 네트워크 기능과 별개입니다. 따라서 레벨을 바꿔도 Strix의 액터 동기화에는 영향이 없습니다.

단, 새 레벨로 이동할 때는 앞선 레벨에 있던 액터가 모두 자동으로 Unreal Engine에 의해 파괴됩니다. 실제 레벨 전환의 시점과 다른 클라이언트에서 레플리카 생성으로 인해 레플리카 손실이라는 문제가 생길 수도 있습니다. (일시정지 참조)

다음 조치로 위와 같은 문제를 방지할 수 있습니다.

일시정지

클라이언트가 레벨을 바꾸기 전에 클라이언트 전체가 Pause Network Object Manager 함수를 호출합니다. 이를 위해서는 RPC를 이용하면 됩니다. 예를 들면 방장이 Send Rpc To All을 호출하여 일시정지하는 것입니다.

이어서 다음 단계로 넘어가기 전에 (즉 새 레벨을 열기 전에) 클라이언트가 일시정지 상태인지 확인합니다. 이 목적으로는 RPC를 한 번 더 이용해도 됩니다. 또는, 커스텀 방 멤버 속성을 이용하여 클라이언트가 일시정지했음을 보고해도 됩니다.

Event graph for level switcher to pause all clients Pause This Client Check if All Clients Are Paused

수준 변경

클라이언트가 모두 일시정지한 후에는 클라이언트가 모두 (대부분 Open Level 함수를 호출하여) 새 레벨로 이동합니다.

레벨을 열기 전에 방장에게 받은 RPC를 다시 보내도 되고, 각 클라이언트에서 일시정지 확인 코드를 실행해도 됩니다.

../../_images/level.png

개체 일시정지 해제

클라이언트가 레벨 열기를 완료한 후 Unpause Network Object Manager 함수를 호출하고 다른 레벨 설정을 진행합니다. 올바른 액터 복제와 동기화를 목적으로 일시정지 해제를 할 때는 다른 클라이언트를 기다리지 않아도 됩니다. (레벨 설정 과정에 레플리카가 방해하거나 레플리카를 파괴할 수도 있는 것이 있다면 일시정지 해제 전에 무언가를 더 해야 할 수도 있습니다. 또, 올바른 게임 플레이를 위해 새 레벨에서 게임 플레이를 시작하기 전에 다른 클라이언트들이 레벨 설정을 끝내기를 기다려야 할 수도 있습니다.)

../../_images/unpause.png

방 멤버의 레벨

Strix Movement Synchronizer 또는 Strix Transform Sync 요소의 Strix 액터 동기화에서는 레플리카를 방장 액터와 같은 월드 좌표로 보내려고 합니다. 이 동기화 메커니즘은 방 멤버가 모두 같은 월드에 있을 때만 작동합니다. 그래서 위 기법에서는 클라이언트가 모두 함께 레벨 전환을 한다고 가정하는 것입니다.