PUN Classic (v1), PUN 2, Bolt는 휴업 모드입니다. Unity2022에 대해서는 PUN 2에서 서포트하지만, 신기능의 추가는 없습니다. 현재 이용중인 고객님의 PUN 및 Bolt 프로젝트는 중단되지 않고, 퍼포먼스나 성능이 떨어지는 일도 없습니다. 앞으로의 새로운 프로젝트에는 Photon Fusion 또는 Quantum을 사용해 주십시오.

BoltEntity

BoltEntity는 Unity 게임오브젝트로써 Bolt에 의해 네트워크상에서 표시되는 것 입니다.

BoltEntity는 Unity/uLink NetworkView 또는 Photon PhotonView와 유사합니다. BoltEntity는 네트워크 인식 객체의 표현이며, Bolt를 제어하고 Unity에서 실제 게임오브젝트를 복제하기위한 기반입니다.

BoltEntity는 서버 또는 클라이언트 는 아니지만, 다음이 될 수 있습니다:

  1. 소유함, entity.isOwner == true 인 경우
  2. 제어함, entity.hasControl == true 인 경우
  3. 프록시, entity.isOwner == false && entity.hasControl == false 인 경우

소유자, 컨트롤러와 프록시에 대해서는 누가 누구?를 참고하세요.

BoltEntity를 다른사람들에게 동기화하기

소유자로 부터 다른 클라이언트들에게 상태를 동기화하기 위해서는 상태를 생성해야 할 것 입니다. 이것은 Bolt 에디터 를 통해 수행할 수 있습니다. 상태를 생성/변경후에는 Bolt 에셋을 재컴파일 해주어야 합니다

BoltEntity 제어하기

BoltEntity가 어떻게 제어되는지 설정하기 위해서는 엔티티의 ExecuteCommand()SimulateController() 메소드를 오버라이드 해야할 것 입니다. 이것은 클라이언트측 예측 을 위해서 수행합니다. 소유자는 여전히 BoltEntity의 실제 상태에 대한 모든 제어권을 가지고 있다는 것을 참고하세요.

신뢰할 수 있으며 클라이언트 예측 이동을 사용하려면 트랜스폼 컴포넌트를 직접 사용하거나 캐릭터 컨트롤러 컴포넌트를 사용해야합니다. 메카님 루트 모션이나 rigidbody들을 사용하여 캐릭터를 제어 할 수 없습니다.

메소드: BoltEntity.SimulateController()

엔티티의 제어가 할당된 사람에게서만 수행됩니다. 엔티티에 대해 TakeControl() 를 호출하여 자신이 제어권을 가진 소유자 또는 소유자가 AssignControl(BoltConnection connection);를 호출하여 주어진 제어권을 부여받은 객체의 원격 프록시를 가진 누군가가 될 수 있습니다. SimulateController 안에서 QueueCommand를 호출 할 수 있습니다. 이 명령은 실행을 위한 명령을 큐에 입력하는데 사용됩니다.

메소드: BoltEntity.ExecuteCommand(BoltCommand cmd, bool resetState)

이 함수는 소유자와 컨트롤러 모두에서 수행되지만, 소유자 또는 원격 컨트롤러에서 수행되는지에 따라 다른 행동을 가지고 있습니다.

소유자에서는, 소유자가 컨트롤러인지에 관계없이 각각의 명령에 대해서 한번만 수행 됩니다. 명령어가 로컬에서 생성되었는지 소유자 자체에서 생성되었는지 또는 주어진 제어권이 있는 원격 연결에서 왔는지는 상관없습니다. resetState에서 호출된 두 번째 파라미터는 소유자에게서는 절재 true가 될 수 없습니다.

컨트롤러상에서는 소유자가 아닌 경우 ExecuteCommand는 좀더 복잡합니다. 이동의 로컬 예측은 물론 소유자의 상태 보정을 처리해야할 수 있어야 합니다. 각 프레임에서 제일 먼저 일어나는 일은 볼트가 소유자에 의해 확인된 상태를 마지막 명령 내에 전달하는 것 입니다. 이 명령이 resetState 내에 전달되는 파라미터는 true일 것 입니다

가장 마지막으로 확인된 명령이 resetState로 실행되면, Bolt는 소유자에 의해 검증되지 않은 모든 다른 명령어들을 수행할 것 입니다. 이것은 실제로 ExecuteCommand가 소유자가 확인하기 전까지 연속으로 여러 프레임 동안 원격 컨트롤러의 한 명령에 대해 여러번 호출된다는 것을 의미합니다.

'resetState' 는 무엇을 수반하나요?

이것은 매우 혼란스러울 수 있습니다. resetState를 true로 설정되어 있는 명령이 실행될 때, Bolt는 명령을 나타내고 있는 상태로 사용하고 있는 캐릭터 모터의 로컬 상태를 설정하기를 원합니다. 여기에서는 "BoltCommand.Input"를 사용하지 않아야 하며, "BoltCommand.Result" 만 사용합니다. 이것이 Bolt가 원격 컨트롤러(종종 클라이언트)의 로컬 움직임을 소유자(종종 서버)로부터 온 올바른 상태로 보정을 허용하는 것입니다.

재설정해야하는 상태는 엔티티가 어떤 방식으로든 움직이는 상태입니다. 일반적으로 위치, 회전 또는 땅에 닿았는지 웅크렸는지 등의 일부 상태 변수 입니다. 다른 복잡한 것들이 컨트롤러가 있는 경우에 재설정하려는 물건은 속도, 가속도, 외부 힘등 일 수 있습니다.

부정확하게/불완전하게 상태를 재설정하는 것은 컨트롤러 측에서 "불안정한 움직임"과 관련된 가장 일반적인 문제 중 하나입니다

BoltCommand.isFirstExecution는 어떤 경우에 사용하나요?

무기 발사 또는 애니메이션 상태 설정과 같이 명령으로 부터 직접 행동을 수행하는 코드는 다음과 같이 블럭내에서 쌓여 있어야 합니다:

C#

if (cmd.isFirstExecution) {
  // code ...
}

동일한 명령의 원격 컨트롤러상에서 ExecuteCommand는 여러번 호출될 것이기 때문에, 만약 애니메이션과 다른 직접적인 행동에 대해서 첫 번째 실행에서만 발생하는 것을 체크하지 않는다면 - 캐릭터는 원격 컨트롤러에서는 매우 이상하게 행동하게 될 것 입니다.

컨트롤러가 아닌 일반 프록시는 어떻습니까?

엔티티의 직접적인 제어를 하지 않고 엔티티의 소유자가 아닌 일반 프록시에서 실행되는 유일한 콜백은 프록시 상에서 실행되는 SimulateController() 또는 ExecuteCommand() 이 아닌 SimulateProxy() 입니다.

위치, 회전, 애니메이션과 상태 동기화는 이러한 엔티티들에 대한 Bolt 상태 객체를 통해 수행됩니다. 이 뜻은 상태, 액션, 이벤트등의 모든 유형을 의미합니다. Bolt 명령이 컨트롤러와 소유자외에는 실행되지 않으므로 연결된 모든 사람이 볼 수 있도록 하려면 볼트 상태 메커니즘 또는 볼트 이벤트를 통해 전송되어야 합니다.

Back to top