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 |