Bolt에서 마이그레이션
소개
이 문서에서는 API 측면에서 Photon Bolt 및 Photon Fusion의 주요 차이점과 Bolt로 작성된 게임 섹션을 Fusion 프로젝트로 포팅 하는 방법에 대해 설명합니다.
Bolt와 Fusion은 많은 개념을 공유하지만 사용법과 API, 그리고 주로 일반적인 행동이 다릅니다.
Fusion 모드
Bolt에서 Fusion으로 마이그레이션할 때 이해해야 할 매우 중요한 점은 Bolt가 서버/호스트 토폴로지만 제공하고, Fusion은 완전한 클라이언트 권한을 가진 추가적인 공유 모드를 제공한다는 것입니다(Photon 유니티 네트워킹과 유사함).
Bolt에 존재하는 대부분의 개념은 Fusion 호스트/서버 모드로 전환할 수 있지만 공유 모드로는 전환할 수 없습니다.
이 페이지에서는 Bolt 지식을 Fusion 서버/호스트 모드로 마이그레이션하는 방법에 대해 설명합니다.
차이점
다음은 Photon Bolt와 Photon Fusion의 주요 차이점들입니다:
- 일반 API는 Fusion에서 정적 클래스인
BoltNetwork및BoltMatchmaking을 통해 접근할 수 있으며, 이는NetworkRunner의 인스턴스를 사용하여 수행됩니다. - Fusion은 동일한 실행 파일에서 여러 피어를 실행할 수 있는 반면, Bolt는 하나만 실행할 수 있습니다. 이는 동일한 게임 인스턴스에서 여러 클라이언트를 실행할 수 있음을 의미합니다. 이는 테스트 및 디버깅 목적으로 유용합니다.
- Fusion은
NetworkRigidbody및NetworkRigidbody2D에 내장된 컴포넌트를 사용하여 물리 예측과 롤백을 전적으로 지원하고 있으므로 개발자가 이를 처리/실행해야 합니다.Character Controller를 다룰 때도 마찬가지이지만, Fusion은 기본적으로 사용자의 캐릭터를 이동시키기 위한NetworkCharacterController를 기본적으로 갖추고 있지만, Bolt의 경우에는 개발자가 구현해야 합니다.
유사점
다음은 Photon Bolt와 Photon Fusion의 주요 유사점들입니다:
- Fusion은 여러 피어 간에 데이터를 동기화하는 데 사용되는 네트워크 속성을 갖는 유니티
Game Object를 나타내는NetworkObject의 개념을 가지고 있으며, Bolt는BoltEntity라는 이름으로 동일한 개념을 가지고 있습니다.NetworkObject의 상태는Networked속성을 사용하여 모든NetworkBehaviour에서 설명할 수 있으며, 이를 위해서는상태에셋을 생성/편집하는Bolt Assets창을 사용하여 속성을 생성하고 구성해야 합니다. 자세한 내용을 참고하세요. - 모든 주요 SDK 이벤트(시작, 종료, 연결 해제 등)는
GlobalEventListener의 인스턴스를 사용하여 Bolt에서 처리되며, Fusion은NetworkRunner와 관련된INetworkRunnerCallbacks를 구현하여 이와 같은 이벤트를 노출합니다. - 두 SDK 모두
상태 권한과입력 권한이라는 개념을 가지고 있지만, Bolt에서는Ownership및Control로 불리지만 정확히 같은 의미를 가지고 있습니다. 자세한 정보를 참고하세요. - Fusion 역시 Bolt와 마찬가지로 예측 롤백 시스템입니다. Bolt에는
BoltEntity의Controller가 보내는Command가 있지만 Fusion에서는NetworkObject를 통해입력 권한을 가진 피어의NetworkInput을 보내는 방식이지만,FixedUpdateNetwork메소드를 호출하기 전에 새 프레임의 시작 부분에 자동으로 롤백(resetState = true인 경우 실행 명령 내에서)이 수동으로 수행되는 Bolt와는 다릅니다. - 제어되는 모든
BoltEntity에 대해 Bolt는 엔티티와 연관된 각EntityEventListener에서SimulateController메소드를 호출합니다. 이는 Fusion에서는 여러 개의NetworkInput(Bolt의Command) 소스가 존재하지 않으며 모든NetworkObjects에서 특정 Frame에 연결할 수 있는NetworkInput은 단 하나뿐이기 때문에 다르게 수행됩니다. 이는INetworkRunnerCallbacks.OnInput콜백을 구현하는 방식으로 수행됩니다. 자세한 정보를 확인하세요. - Fusion의 잘 알려진 원격 프러시저 호출(
RPC)은 Bolt의이벤트라고 합니다. Fusion의 코드를 통해 직접 정의할 수 있지만, Bolt의 경우에는Bolt Assets창을 사용하여 설정해야 합니다. 자세한 내용을 참고하세요. - Fusion에는 공통 유형의 데이터를 동기화하는 데 도움이 되는 많은 컴포넌트가 내장되어 있는데, 대표적인 예가 Bolt의
Transform Property에 매핑할 수 있는NetworkTransform입니다. 둘 다 스냅샷 간의 위치와 회전을 동기화하는 동시에 데이터 포인트 간의 보간이 가능한 스냅샷 간의 원활한 전환을 제공하는 데 사용됩니다. 자세한 정보를 참고하세요. - Fusion은
관심 영역API를 이용해 원하는NetworkObject세트만 동기화할 수도 있습니다. 상세 정보를 참고하세요. - 두 SDK 모두 씬과 연관된
NetworkObject인Scene Object라는 개념이 있습니다. 이 오브젝트들은 특정 씬이 로드되면 자동으로 시뮬레이션에 연결됩니다. - 두 SDK 모두에서 구현된 또 다른 솔루션은 슈터와 표적 사이의 지연을 고려하여 레이캐스트와의 충돌을 탐지하는 데 주로 사용되는
래그 보상 물리 검사입니다. 자세한 정보를 참고하세요.
참고 테이블
| Bolt | Fusion | 설명 |
|---|---|---|
| BoltNetwork, BoltMatchmaking | NetworkRunner | 주요 API 진입점 |
| BoltEntity | NetworkObject | 네트워크화된 게임 객체를 나타냄 |
| BoltEntity 상태 속성 | 네트워크화된 속성 | 동기화된 속성들의 집합 |
| GlobalEventListener | INetworkRunnerCallbacks | 일반 이벤트 처리 |
| EntityEventListener | NetworkBehaviour, | 네트워크화된 게임 객체 이벤트 처리 |
| BoltNetwork.Instantiate() | NetworkRunner.Spawn() | 새로운 네트워크화된 게임 객체 생성 |
| BoltNetwork.Destroy() | NetworkRunner.Despawn() | 시뮬레이션으로부터 네트워크화된 게임 객체 제거 |
| BoltEntity.IsOwner | NetworkObject.HasStateAuthority | 피어가 네트워크로 연결된 게임 개체의 상태를 수정할 수 있는지 여부에 대한 신호 |
| BoltEntity.HasControl | NetworkObject.HasInputAuthority | 네트워크로 연결된 게임 객체에 입력을 푸시 할 수 있는 피어의 경우 신호 |
| Commands | NetworkInput | 클라이언트에서 예측하고 서버의 상태를 변경하는 데 사용되는 제어 구조체 |
| Objects | NetworkStructs | 네트워크화된 속성들을 포함하며 둘 이상의 상태에서 사용할 수 있는 재사용 가능한 데이터 구조체 |
| Events | RPC | 시뮬레이션의 일부가 될 필요가 없는 정보를 전송하는 데 사용되는 통신 메소드 |
| Transform Property | NetworkTransform | 네트워크 게임 객체의 변환(위치 및 회전) 동기화를 위한 내장 지원 |
| BoltNetwork.LoadScene | NetworkSceneManager | 동기화된 방식으로 장면 전환/로딩을 위한 API |