엔티티 범위, Idle, Freeze
Photon Bolt에는 특정 엔티티에 대한 상태 업데이트가 전송되는지 여부를 제어할 수 있는 세 가지 방법이 있습니다.
이 기능은 큰 맵을 가지고 있고 플레이어에서 멀리 떨어져 있는 다른 엔티티로부터 데이터를 수신할 필요가 없는 경우에 유용할 수 있습니다.
이러한 유틸리티는 주로 플레이어의 일부만 특정 엔티티 업데이트를 인식해야 하는 경우 게임 서버의 대역폭 및 처리 전력을 절약하는 데 사용됩니다.
다음의 모든 방법은 BoltEntity
를 통해 직접 사용할 수 있으며 개별적으로, 엔티티별로 또는 경우에 따라 연결하여 설정할 수 있습니다. 이렇게 하면 클라이언트가 어떤 엔티티에 대해 알릴지 필터링하는 데 필요한 유연성을 얻을 수 있습니다.
엔티티 범위설정
Bolt에게 어떤 실체가 존재해야 하는지, 존재해서는 안 된다는 신호를 보내기 위해, Scope
에 대해 이야기 하고 있습니다.
이것은 BoltEntity
의 API에 포함되어 있습니다. SetScope(BoltConnection connection, bool inScope, bool force)
메소드를 통해 설정 할수가 있습니다.
이 메소드를 호출할 때 연결을 통과하면 inScope
및 force
부울변수에 대한 부울 값이 입력됩니다.
true
를 전달하면 연결의 다른 쪽 끝에 이 엔티티가 생성되고 상태 업데이트를 받게 됩니다.
엔티티가 원격 끝에 이미 있으면 아무 일도 일어나지 않습니다.
false
을 전달하면 연결의 다른 쪽 끝에 있는 엔티티가 완전히 파괴됩니다.
실체가 다른 쪽 끝에 존재하지 않으면 false
를 전달해도 아무 일도 일어나지 않습니다.
기본적으로 연결이 제어하는 엔티티를 범위에서 제거할 수 없으며, 이를 알리는 오류 메시지가 표시됩니다.
이러한 행동이 정말로 필요한 경우, force
매개변수에 true
을 전달하여 이 장벽을 제거할 수 있습니다.
true
을 전달하여 원격 연결에서 엔티티를 파괴하는 경우 다음에 이 엔티티에 대한 모든 데이터에 있는 true
을 네트워크를 통해 다시 보내야 합니다.
SetScope
를 사용하려면 Bolt Settings
창에서 Scoping Mode
를 Automatic
에서 Manual
로 전환해야 합니다.
범위 지정의 Manual
모드를 사용할 때는 각 연결에서 각 엔티티에 대한 범위 값을 설정해야 합니다.
SetScope를 사용하기 위한 시나리오의 예는 무엇입니까?
플레이어의 캐릭터가 로드 스크린이 필요한 세계의 다른 부분으로 이동되는 경우 entity.SetScope(playerConnection, false)
는 플레이어가 떠난 이전 플레이스에 존재했던 모든 엔티티를 삭제하는 데 사용할 수 있습니다(그리고 사용해야 합니다).
놀고있는 엔티티
엔티티를 유휴로 설정하는 것은 업데이트 흐름을 제어하는 데 사용되는 또 다른 기법입니다.
이것을 위한 방법은 entity.Idle(BoltConnection connection, bool idle)
이며 true/false
값을 전달합니다.
true
를 전달하면 전달된 연결에 대해 이 엔티티를 idle로 설정하면 상태 업데이트 전송이 중지됩니다.
false
를 전달하면 idle 상태가 제거되고 상태 업데이트가 다시 진행됩니다.
이 작업은 연결별으로 수행해야 하며 설정할 수 있는 글로벌 idle 상태가 없습니다.
유휴를 사용하기 위한 예시 시나리오는 무엇입니까?
특정 플레이어가 관심 영역을 전 세계에 남겨 두고 관심 영역의 유형을 구현하는 경우 entity.Idle(playerConnection, true)
를 설정하면 모든 상태 업데이트가 플레이어로 전송되는 것을 중지합니다.
엔티티 프리즈
Freeze
는 네트워크 트래픽과 CPU의 절약을 다루는 최신 방법입니다.
엔티티의 owner에서만 활성화/비활성화할 수 있는 전역 설정입니다.
당신이 entity.Freeze(true)
호출할 때 다음 상황이 발생됩니다:
- 모든 Bolt는
Simulate*
메소드를 더 이상 호출하지 않습니다. - 프로퍼티 콜백은 호출되지 않습니다.
- 네트워크를 통해 아무에게도 상태 변경 사항이 전송되지 않습니다.
엔티티는 여전히 프록시를 받은 모든 사용자에게 존재하며 이벤트 발생 또는 다른 상태 속성 등에 대한 매개 변수로 설정과 같은 다른 볼트 기능과 함께 사용할 수 있습니다.
entity.Freeze(false)
를 호출할때 다음 사항이 발생됩니다:
- Bolt가 다시 "Simulate*"라고 부르기 시작합니다.
- 보류 중인 모든 프로퍼티 콜백이 호출됩니다.
- 변경된 상태가 네트워크를 통해 모든 리모테로 복제되기 시작합니다.
Freeze 사용의 예시 시나리오는 무엇입니까?
만약 여러분이 큰 세계를 위한 관심 영역을 만들고, 각각의 특정 플레이어 연결에 대해 Idle
라고 부르는 것과 동시에 서버의 CPU 리소스를 절약하기 위해 전세계에 있는 엔티티 근처에 전혀 플레이어가 없을 경우 entity.Freeze(true)
를 호출하고 싶을 수도 있습니다.