Pun2에서 마이그레이션
소개
이 문서에서는 PUN에서 Fusion으로 마이그레이션 하는 방법에 대해 설명합니다. 객체 동기화 및 게임 플레이에 중점을 둡니다.
PUN은 엄청나게 성공적이고 사용하기 쉬운 네트워킹 솔루션이지만 더 많은 플레이어 수, 플레이어 행동의 정확한 복제 및 권한 처리와 같은 최신의 멀티플레이어 게임 측면을 처리하기에는 오래되었고 충분하지는 않습니다. Fusion은 사용하기 쉽고 대부분의 프로젝트에서 선호되어야 합니다.
Fusion 모드
PUN에서 Fusion으로 이동할 때 이해해야 할 매우 중요한 것은 PUN이 모든 클라이언트가 공유하는 룸을 통해서만 "분산" 권한 모델을 제공한다는 것입니다.
공유 모드에서 Fusion을 실행하여 PUN의 모델과 유사하게 분산 권한을 허용합니다. 씬 개체는 한 플레이어가 자동으로 제어합니다. PUN에 존재하는 대부분의 개념은 Fusion 공유 모드로 전송할 수 있지만 Fusion 서버/호스트 모드로는 전송할 수 없습니다.
이 페이지에서는 PUN 지식을 Fusion 공유 모드로 마이그레이션하는 방법에 대해 설명합니다. 그러나 응용 프로그램에 따라 호스트/서버 모드가 더 나은 선택일 수 있습니다.
차이점
참조 테이블
PUN | Fusion |
---|---|
PhotonNetwork | SimulationBehaviour.Runner 및 SimulationBehaviour.Object |
MonoBehaviourPunCallbacks | SimulationBehaviour 및 NetworkBehaviour |
PhotonNetwork.AddCallbackTarget(this) | N/A (자동) |
PhotonNetwork.Instantiate() | Runner.Spawn() |
PhotonView | NetworkObject |
IPunObservable.OnPhotonSerializeView() | C# 자동 구현 속성 및 입력 동기화 |
PhotonTransformView | NetworkTransform |
PhotonRigidbodyView | NetworkRigidbody |
PhotonAnimatorView | NetworkMecanimAnimator |
N/A | NetworkCharacterController |
[PunRPC] | [Rpc] |
PhotonNetwork.LoadLevel() | Runner.SetActiveScene() |
연결 및 매치메이킹
매치메이킹의 핵심 개념은 PUN과 Fusion 사이에서 동일하게 유지됩니다. 로비, 매치메이킹, 룸, 매치메이킹를 위한 속성 등이 여전히 존재합니다.
Fusion은 NetworkRunner에 노출된 매치메이킹 호출에 전혀 다른 API를 사용합니다. Fusion을 사용하여 연결 및 매치메이킹 하는 방법은 여기에서 자세히 알아볼 수 있습니다.
설정을 넣을 위치 / ConnectUsingSettings, 버전 관리 방법
PUN은 PhotonServerSettings
파일(스크립트 가능 객체)에 대부분의 설정을 저장합니다. AppId, 서버 설정, 프로토콜 및 로깅이 대부분입니다.
Fusion에서는 설정이 두 개의 파일로 나뉩니다:
PhotonAppSettings
에는 클라이언트가 Photon Cloud에 연결하는 데 사용하는 정보가 포함되어 있습니다. 대부분의 경우 이 구성에서 변경해야 하는 데이터는 애플리케이션의 AppId
뿐이며 Fusion Hub를 통해서도 설정할 수 있습니다.
NetworkProjectConfig
는 Fusion의 다양한 구성 옵션을 보여주는 세부 구성입니다. 기본 구성을 시작점으로 사용할 수 있습니다. 틱 속도, 최대 플레이어 수 등의 설정이 가능합니다.
인증
Fusion은 PUN과 마찬가지로 인증 프로바이더를 지원합니다. 이에 대한 자세한 내용은 인증 페이지에서 확인할 수 있습니다.
오프라인 모드
Fusion 역시 PUN과 마찬가지로 오프라인 모드가 있습니다. NetworkRunner.StartGame
을 호출할 때는 PhotonNetwork.OfflineMode
대신 GameMode.Single
을 사용합니다.
액터 번호
PUN에서는 Player.ActorNumber
가 새로운 플레이어가 될 때마다 올라갑니다. Fusion에서는 PlayerRef
가 0에서 시작하여 MaxPlayers - 1로 올라갑니다. 게임의 호스트가 있는 경우 해당 플레이어는 항상 MaxPlayer - 1을 PlayerRef
값으로 받습니다.
PhotonNetwork 대신 Runner 사용
PUN의 많은 API는 PhotonNetwork
클래스를 통해 사용할 수 있었습니다. 대신 Fusion에는 Runner가 있습니다. NetworkBehaviour
에서 상속받은 클래스는 Runner와 Object 멤버에 접근할 수 있으므로 Fusion API는 PUN과 마찬가지로 쉽게 접근할 수 있습니다.
계층 패널의 컨텍스트 메뉴에는 씬을 설정하는 데 유용한 바로 가기가 포함된 Fusion 하위 메뉴가 있습니다.
콜백 (MonoBehaviourPunCallbacks / PhotonNetwork.AddCallbackTarget(this))
콜백은 연결이 설정되기를 기다리거나 무작위 매칭의 결과를 기다리더라도 PUN 네트워킹 API의 백본입니다. PUN에서 콜백은 어떤 스크립트가 구현하는지 몇 가지 인터페이스 정의로 분류됩니다. 런타임에 이러한 스크립트는 이러한 콜백을 호출하기 위해 등록해야 합니다.
이 워크플로우를 단순화하기 위해 PUN은 MonoBehaviourPunCallbacks
클래스를 상속합니다. 이를 통해 스크립트는 특정 메소드를 재정의하여 콜백을 가져올 수 있습니다.
대부분의 콜백은 INetworkRunnerCallbacks
을 통해 제공됩니다. 이 콜백들은 세션 콜백입니다. 객체별 콜백은 Spawned/Despawned
등 네트워크 행동에서 직접 사용할 수 있습니다.
인스턴스화
Fusion에서는 PhotonNetwork.Instantiate()
대신 Runner.Spawn()
을 호출합니다. 사용자 정의 IPunPrefabPool
대신 INetworkObjectProvider
를 사용하여 인스턴스를 풀링 합니다.
씬 객체
씬 객체는 PUN과 Fusion에서도 비슷한 방식으로 작동합니다. 씬이 처음 로드되면 마스터 클라이언트는 모든 씬 객체에 대해 자동으로 StateAuthority
를 부여합니다.
수동 인스턴스화
Fusion에서 수동 인스턴스화를 PUN에서 대체하려면 생성된 것에 대한 프리팹을 제공하는 맞춤형 INetworkPrefabSource
가 필요합니다. PUN과 달리 NetworkObject의 특정 인스턴스가 생성되지 않고 INetworkObjectProvider
에 의해 인스턴스화되는 프리팹이 생성됩니다.
일반적으로 대부분의 Fusion 애플리케이션에 권장되지도 않고 필요하지도 않습니다.
씬
씬을 로드하기 위해서는 PhotonNetwork.LoadLevel()
을 Runner.SetActiveScene()
으로 변경합니다.
복수 씬
Fusion에서는 여러 씬을 기본적으로 지원합니다. Runner.LoadScene
은 씬을 추가로 로드하기 위한 오버로드를 제공합니다.
PhotonView
PUN의 핵심 요소는 NetworkObject라는 직접 대응어를 가진 PhotonView
입니다. NetworkObject는 PUN에서와 마찬가지로 식별자일 뿐이며 원하는 동작을 제공하기 위해 추가적인 컴포넌트에 의존합니다.
MonoBehaviourPun
Fusion에서 MonoBehaviourPUNs
은 NetworkBehaviours
이라고 하는데, NetworkBehaviours
은 NetworkObject
와 같은 GameObjects
또는 자식 GameObject
에 배치할 수 있습니다.
Fusion은 필요한 경우 계층 내에 여러 개의 중첩된 NetworkObjects
를 보유하는 것을 완벽하게 지원합니다.
PhotonTransformView
PhotonTransformView
는 NetworkTransform
으로 대체할 수 있습니다. NetworkTransform
은 더 나은 구현과 페어런팅 등의 기능을 제공합니다.
PhotonAnimatorView -> NetworkMecanimAnimator
PhotonAnimatorView
는 NetworkMecanimAnimator
로 대체할 수 있습니다. NetworkMecanimAnimator
는 PUNs 버전처럼 작동하며 클라이언트에서 StateAuthority
로 연결된 애니메이션을 다른 모든 클라이언트(프록시)에 동기화합니다.
CharacterController
플레이어 캐릭터를 이동하는 PUN에서는 일반 캐릭터 컨트롤러를 사용할 수 있습니다. Fusion 공유 모드에서는 이것도 옵션이지만, 더 많은 기능을 갖춘 우수한 옵션인 단순 KCC 애드온도 있습니다.
PhotonRigidbodyView -> NetworkRigidbody
Fusion은 PUN과 비슷한 네트워크 물리 시스템을 갖추고 있습니다. PhotonRigidbodyView
대신 NetworkRigidbody3D
컴포넌트를 사용합니다. 객체를 소유한 클라이언트는 강체에 대한 물리 시뮬레이션을 실행하고 다른 모든 클라이언트는 강체에 대한 운동학적 표현을 사용하여 뷰만 제공합니다. 물리 컴포넌트도 2D로 제공됩니다.
Fusion의 경우 일반적인 컴포넌트를 대체합니다. 예를 들어 PhotonRigidbodyView
는 NetworkRigidbody
로 대체할 수 있고, PhotonTransformView
는 NetworkTransform
이 됩니다. 둘 다 PUN과 마찬가지로 2D 변형으로 제공됩니다.
PhotonView.IsMine / 객체의 권한
PUN의 스크립트는 보통 photonView.IsMine
만 확인하여 클라이언트가 객체를 제어하는지 확인합니다. Fusion에서는 photonView.IsMine
이 Object.HasStateAuthority
입니다.
플레이어가 나갔을 때 소유권 이전
마스터 클라이언트가 변경되면 PUN에서 새 마스터는 소유자가 없는 네트워크 객체를 자동으로 제어합니다.
Fusion에서 클라이언트가 연결을 끊거나 룸을 떠날 때 권한 이전을 처리할 수 있는 여러 옵션이 있습니다.
NetworkObject
에서 IsMasterClientObject
를 선택하면 StateAuthority
는 PUNs 동작과 유사한 새 마스터로 자동 전송됩니다.
상태 권한자가 나갈 때 파괴
를 체크하면 대신 해당 객체가 파괴됩니다.
RPCs
가능한 경우 네트워크 변수 사용
원격 프러시저 호출(Rpcs)도 지원되며 새로운 단계로 올라갑니다. 메소드에 [Rpc] 속성을 넣고 로컬 메소드라고 부르는 대로 호출합니다. Fusion은 호출을 네트워크를 통해 작동하도록 변환합니다.
사용자 지정 속성 대신 네트워크로 연결된 변수
PUN의 사용자 지정 속성 세터 메소드를 사용하는 해시 테이블이었다면 Fusion은 일반 C# 속성을 대신 동기화합니다. NetworkBehaviour의 일부로 자동으로 구현된 속성은 [Networked] 속성만 있으면 게임 상태의 일부가 됩니다. 객체 권한자만이 값을 변경할 수 있으며, 네트워크를 통해 자동으로 복제되므로 부정행위 가능성이 줄어듭니다.
플레이어 속성을 대체하려면 NetworkBehaviour
를 NetworkedProperties
으로 추가하기만 하면 됩니다.
룸 속성을 바꾸기 위해 NetworkObject
씬을 만들고 NetworkProperties
가 있는 NetworkBehaviour
를 추가합니다. FindObjectOfType
이나 싱글톤 패턴 등을 사용하여 씬에서 이 개체를 찾아야 합니다.
IPunObservable.OnPhotonSerializeView()는 더 이상 필요하지 않습니다
OnPhotonSerializeView
도 네트워크화된 속성으로 대체되고 있습니다. 네트워크화된 속성은 OnPhotonSerializeView와 CustomProperties의 가장 우수한 기능을 결합한 것입니다. 이들은 틱 정렬과 함께 즉시 업데이트됩니다. 변경 내용만 동기화되며 탐지 변경 콜백을 사용할 수 있습니다.
Fusion 2에서 변화 감지
PUN에서는 룸 또는 플레이어 속성이 변경되면 PropertyChanged
이벤트가 발생합니다. Fusion에서는 OnChangeRender
또는 ChangeDetector
를 사용할 수 있습니다.
멀티 피어
Fusion은 하나의 프로세스에서 여러 개의 NetworkRunner
인스턴스를 실행할 수 있으며, 이는 주로 테스트 및 디버깅을 위한 것입니다. 편집기의 도움말 패널을 사용하여 어떤 인스턴스가 표시되고 입력되는지 선택할 수 있습니다.
편집기가 여러 피어를 동시에 실행하면 시작할 때 현재 씬을 다시 로드합니다. 이를 지원하기 위해 게임 로직을 조정해야 할 수도 있습니다. 독립 실행형 빌드는 PUN에서와 같이 편집기와 쉽게 연결할 수 있습니다.
특별한 경우
공유 모드는 PUN과 동일한 유연성과 사용 편의성을 제공합니다. 그러나 Fusion은 경쟁적이고 더 빠르게 진행되는 일부 유형의 게임에 대해 전용 서버/호스트 모드를 제공합니다.
이 모드에서는 서버 또는 클라이언트 중 하나가 게임 상태에 대한 모든 권한을 보유합니다. 이는 이 피어가 전체 상태를 유지하고 상태를 수정할 수 있는 유일한 피어임을 의미합니다. 다른 피어는 로컬 예측에서 상태를 수정하여 지연 시간을 마스킹 할 수 있지만 유효하려면 서버에서 변경 내용을 복제해야 합니다.
호스트/서버 모드가 게임에 더 적합한 선택인지 확인하려면 Quadrant를 살펴보시기를 제안합니다.
- 소개
- Fusion 모드
- 차이점
- 참조 테이블
- 연결 및 매치메이킹
- 설정을 넣을 위치 / ConnectUsingSettings, 버전 관리 방법
- 인증
- 오프라인 모드
- 액터 번호
- PhotonNetwork 대신 Runner 사용
- 콜백 (MonoBehaviourPunCallbacks / PhotonNetwork.AddCallbackTarget(this))
- 인스턴스화
- 씬 객체
- 수동 인스턴스화
- 씬
- 복수 씬
- PhotonView
- MonoBehaviourPun
- PhotonTransformView
- PhotonAnimatorView -> NetworkMecanimAnimator
- CharacterController
- PhotonRigidbodyView -> NetworkRigidbody
- PhotonView.IsMine / 객체의 권한
- 플레이어가 나갔을 때 소유권 이전
- RPCs
- 사용자 지정 속성 대신 네트워크로 연결된 변수
- IPunObservable.OnPhotonSerializeView()는 더 이상 필요하지 않습니다
- Fusion 2에서 변화 감지
- 멀티 피어
- 특별한 경우