This document is about: FUSION 2
SWITCH TO

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에서 MonoBehaviourPUNsNetworkBehaviours이라고 하는데, NetworkBehavioursNetworkObject와 같은 GameObjects 또는 자식 GameObject에 배치할 수 있습니다.

Fusion은 필요한 경우 계층 내에 여러 개의 중첩된 NetworkObjects를 보유하는 것을 완벽하게 지원합니다.

PhotonTransformView

PhotonTransformViewNetworkTransform으로 대체할 수 있습니다. NetworkTransform은 더 나은 구현과 페어런팅 등의 기능을 제공합니다.

PhotonAnimatorView -> NetworkMecanimAnimator

PhotonAnimatorViewNetworkMecanimAnimator로 대체할 수 있습니다. NetworkMecanimAnimator는 PUNs 버전처럼 작동하며 클라이언트에서 StateAuthority로 연결된 애니메이션을 다른 모든 클라이언트(프록시)에 동기화합니다.

CharacterController

플레이어 캐릭터를 이동하는 PUN에서는 일반 캐릭터 컨트롤러를 사용할 수 있습니다. Fusion 공유 모드에서는 이것도 옵션이지만, 더 많은 기능을 갖춘 우수한 옵션인 단순 KCC 애드온도 있습니다.

PhotonRigidbodyView -> NetworkRigidbody

Fusion은 PUN과 비슷한 네트워크 물리 시스템을 갖추고 있습니다. PhotonRigidbodyView 대신 NetworkRigidbody3D 컴포넌트를 사용합니다. 객체를 소유한 클라이언트는 강체에 대한 물리 시뮬레이션을 실행하고 다른 모든 클라이언트는 강체에 대한 운동학적 표현을 사용하여 뷰만 제공합니다. 물리 컴포넌트도 2D로 제공됩니다.

Fusion의 경우 일반적인 컴포넌트를 대체합니다. 예를 들어 PhotonRigidbodyViewNetworkRigidbody로 대체할 수 있고, PhotonTransformViewNetworkTransform이 됩니다. 둘 다 PUN과 마찬가지로 2D 변형으로 제공됩니다.

PhotonView.IsMine / 객체의 권한

PUN의 스크립트는 보통 photonView.IsMine만 확인하여 클라이언트가 객체를 제어하는지 확인합니다. Fusion에서는 photonView.IsMineObject.HasStateAuthority입니다.

플레이어가 나갔을 때 소유권 이전

마스터 클라이언트가 변경되면 PUN에서 새 마스터는 소유자가 없는 네트워크 객체를 자동으로 제어합니다.

Fusion에서 클라이언트가 연결을 끊거나 룸을 떠날 때 권한 이전을 처리할 수 있는 여러 옵션이 있습니다.

networkobject 권한 설정

NetworkObject에서 IsMasterClientObject를 선택하면 StateAuthority는 PUNs 동작과 유사한 새 마스터로 자동 전송됩니다.

상태 권한자가 나갈 때 파괴를 체크하면 대신 해당 객체가 파괴됩니다.

RPCs

가능한 경우 네트워크 변수 사용

원격 프러시저 호출(Rpcs)도 지원되며 새로운 단계로 올라갑니다. 메소드에 [Rpc] 속성을 넣고 로컬 메소드라고 부르는 대로 호출합니다. Fusion은 호출을 네트워크를 통해 작동하도록 변환합니다.

사용자 지정 속성 대신 네트워크로 연결된 변수

PUN의 사용자 지정 속성 세터 메소드를 사용하는 해시 테이블이었다면 Fusion은 일반 C# 속성을 대신 동기화합니다. NetworkBehaviour의 일부로 자동으로 구현된 속성은 [Networked] 속성만 있으면 게임 상태의 일부가 됩니다. 객체 권한자만이 값을 변경할 수 있으며, 네트워크를 통해 자동으로 복제되므로 부정행위 가능성이 줄어듭니다.

플레이어 속성을 대체하려면 NetworkBehaviourNetworkedProperties으로 추가하기만 하면 됩니다.

룸 속성을 바꾸기 위해 NetworkObject 씬을 만들고 NetworkProperties가 있는 NetworkBehaviour를 추가합니다. FindObjectOfType이나 싱글톤 패턴 등을 사용하여 씬에서 이 개체를 찾아야 합니다.

IPunObservable.OnPhotonSerializeView()는 더 이상 필요하지 않습니다

OnPhotonSerializeView도 네트워크화된 속성으로 대체되고 있습니다. 네트워크화된 속성은 OnPhotonSerializeView와 CustomProperties의 가장 우수한 기능을 결합한 것입니다. 이들은 틱 정렬과 함께 즉시 업데이트됩니다. 변경 내용만 동기화되며 탐지 변경 콜백을 사용할 수 있습니다.

Fusion 2에서 변화 감지

PUN에서는 룸 또는 플레이어 속성이 변경되면 PropertyChanged 이벤트가 발생합니다. Fusion에서는 OnChangeRender 또는 ChangeDetector를 사용할 수 있습니다.

멀티 피어

Fusion은 하나의 프로세스에서 여러 개의 NetworkRunner 인스턴스를 실행할 수 있으며, 이는 주로 테스트 및 디버깅을 위한 것입니다. 편집기의 도움말 패널을 사용하여 어떤 인스턴스가 표시되고 입력되는지 선택할 수 있습니다.

편집기가 여러 피어를 동시에 실행하면 시작할 때 현재 씬을 다시 로드합니다. 이를 지원하기 위해 게임 로직을 조정해야 할 수도 있습니다. 독립 실행형 빌드는 PUN에서와 같이 편집기와 쉽게 연결할 수 있습니다.

특별한 경우

공유 모드는 PUN과 동일한 유연성과 사용 편의성을 제공합니다. 그러나 Fusion은 경쟁적이고 더 빠르게 진행되는 일부 유형의 게임에 대해 전용 서버/호스트 모드를 제공합니다.

이 모드에서는 서버 또는 클라이언트 중 하나가 게임 상태에 대한 모든 권한을 보유합니다. 이는 이 피어가 전체 상태를 유지하고 상태를 수정할 수 있는 유일한 피어임을 의미합니다. 다른 피어는 로컬 예측에서 상태를 수정하여 지연 시간을 마스킹 할 수 있지만 유효하려면 서버에서 변경 내용을 복제해야 합니다. 호스트/서버 모드가 게임에 더 적합한 선택인지 확인하려면 Quadrant를 살펴보시기를 제안합니다.

쿼드런트

전체 화면

Back to top