PUN에서 시작
소개
이 자료에서는 PUN에 대해 기본 지식을 갖고 계신 분들이 Fusion을 시작하는 방법에 대해 설명합니다. 주요 내용은 객체 동기화 및 게임 플레이입니다.
PUN은 매우 성공적이고 사용하기 쉬운 네트워킹 솔루션이지만, 더 많은 플레이어 수, 플레이어 동작의 정밀한 복제 및 권한 처리와 같은 최신의 멀티플레이어 게임 관점을 처리하기에는 부족함이 있습니다. Fusion은 사용하기 쉬우므로 대부분의 프로젝트에서 선호됩니다.
차이점
PUN과 비교해서 몇 가지 주의해야 할 차이점이 있습니다.
Fusion은 플레이어당 Runner
를 인스턴스화하며 어떤 씬에서는 설정되어야 합니다. 이를 위해 계층 패널의 컨텍스트 메뉴에는 설정 씬의 유용한 바로 가기가 포함된 Fusion 하위 메뉴가 있습니다.
Fusion은 여러 개의 Runner
인스턴스를 한 프로세스에서 실행할 수 있으며, 이는 대부분 테스트 및 디버깅을 위한 것입니다. 에디터의 헬퍼 패널을 사용하여 표시할 인스턴스를 선택하고 입력을 받을 수 있습니다.
에디터가 여러 피어를 동시에 실행하면 시작할 때 현재 씬이 다시 로드됩니다. 이를 뒷받침하기 위해 게임 로직을 조정해야 할 수도 있습니다. 독립 실행형 빌드는 PUN에서처럼 에디터와 쉽게 연결할 수 있습니다.
PUN의 많은 API들은 PhotonNetwork
클래스를 통해 이용할 수 있었습니다. 대신 퓨전에는 인스턴스 당 Runner
가 있습니다. SimulationObject
또는 NetworkObject
에서 상속되는 모든 클래스는 Runner
및 객체 멤버에 접근할 수 있으므로 Fusion API에 접근하는 것은 PUN처럼 쉽습니다.
PUN이 "분산" 권한만 제공하는 경우 Fusion은 전용 서버
, 클라이언트 호스팅
, 공유 모드
로 실행할 수 있습니다. 공유 모드
는 PUN과 유사하며 네트워크 객체의 권한이 플레이어에게 분배됩니다. 씬 객체는 한 명의 플레이어가 자동으로 제어합니다.
PUN이 객체에 대한 제어 개념만 가지고 있는 경우, Fusion은 권한을 상태 권한과 입력 권한로 분리합니다(공유 모드
를 사용하지 않는 경우).
PUN의 스크립트는 보통 클라이언트가 객체를 제어하는지 결정하기 위해 photonView.IsMine
만 확인합니다. Fusion은 Object.HasStateAuthority
및 Object.HasInputAuthority
를 별도로 추적합니다. PUN의 포트는 Fusion의 공유 모드
를 사용하고 HasStateAuthority
를 체크해야 합니다.
PUN에서는 새로운 플레이어마다 Player.ActorNumber
가 올라갑니다. Fusion에서 PlayerRef
는 0부터 시작하여 MaxPlayers - 1
까지 올라갑니다. 게임을 진행할 호스트가 있는 경우 해당 플레이어는 항상 MaxPlayers - 1
을 PlayerRef
값으로 받게 됩니다.
Fusion은 프로젝트의 씬을 알아야 합니다. 씬을 프로젝트 빌드 설정에서 정렬한 다음 임포트할 수 있습니다.
유사성
Fusion이 PUN 과는 크게 다르다는 예상을 할 수 있지만, 실제로 많은 아이디어들을 계승합니다.
PUN의 핵심 요소는 NetworkObject
라는 직접적으로 동일한 것을 갖고 있는 PhotonView
입니다. PUN에서처럼 NetworkObject는 식별자에 불과하며 원하는 동작을 제공하기 위해 추가 컴포넌트에 의존합니다.
Fusion은 공통 컴포넌트를 대체한 것을 갖고 있습니다: 예를 들어, PhotonRigidbodyView
를 NetworkRigidbody
로 대체하면 PhotonTransformView
는 NetworkTransform
이 됩니다. 둘 다 PUN에서처럼 2D 변형으로 사용할 수 있습니다.
PhotonAnimatorView
는 NetworkMecanimAnimator
로 대체할 수 있습니다. Fusion은 특히 캐릭터 제어를 위해 PUN이 제공하지 않는 포괄적인 NetworkCharacterController
를 갖추고 있습니다.
컴포넌트의 개별 설정은 다릅니다. 대부분의 경우 기본값으로 시작하기에 적합합니다. NetworkObject
의 모든 컴포넌트와 하위 컴포넌트가 자동으로 검색됩니다. Fusion은 필요한 경우 계층에 여러 개의 NetworkObject
가 있는 것을 완벽하게 지원합니다.
PUN에서처럼 NetworkObject
는 씬에 배치하거나 런타임에 인스턴스화할 수 있습니다. Fusion에서는 PhotonNetwork.Instantiate()
대신에 Runner.Spawn()
을 호출합니다. 씬을 로드하려면 PhotonNetwork.LoadLevel()
을 Runner.SetActiveScene()
으로 교체합니다.
PUN의 다른 중요한 클래스들은 MonoBehaviourPun
와 MonoBehaviourPunCallbacks
입니다. Fusion에서 스크립트는 게임 로직을 작성하고 상태를 유지하기 위해 NetworkBehaviour
로부터 상속받습니다. 스크립트에는 게임 상태가 포함되지 않을 경우 SimulationBehaviour
에서 상속할 수 있습니다. 여기서 PUN OnPhotonInstantiate()
이 호출하는 곳에 Spawned()
콜백을 사용하여 네트워크 스크립트를 초기화합니다.
PUN의 사용자 지정 속성은 setter 메서드를 사용하는 해시테이블이었지만 Fusion은 대신 일반 C# 속성을 동기화합니다. NetworkBehaviour
의 일부로 자동 구현되는 속성은 게임 상태의 일부가 되려면 [Networked]
속성만 있으면 됩니다. 객체의 권한만 값을 변경할 수 있으며 이러한 값은 네트워크를 통해 자동으로 복제되므로 부정행위의 가능성이 줄어듭니다.
원격 프로시저 호출(RPC
)도 지원되고 새로운 수준으로 올라갑니다. 메소드에 [RPC]
속성을 지정하고 로컬 메소드를 호출하는 대로 호출하면 Fusion이 호출을 네트워크를 통해 작동하도록 변환합니다.
참조 테이블
PUN | Fusion |
---|---|
PhotonNetwork | SimulationBehaviour.Runner 그리고 SimulationBehaviour.Object |
MonoBehaviourPunCallbacks | SimulationBehaviour 그리고 NetworkBehaviour |
PhotonNetwork.AddCallbackTarget(this) | N/A (automatic) |
PhotonNetwork.Instantiate() | Runner.Spawn() |
PhotonView | NetworkObject |
IPunObservable.OnPhotonSerializeView() | C# 자동-구현된 속성 그리고 입력 동기화 |
PhotonTransformView | NetworkTransform |
PhotonRigidbodyView | NetworkRigidbody |
PhotonAnimatorView | NetworkMecanimAnimator |
N/A | NetworkCharacterController |
[PunRPC] | [RPC] |
PhotonNetwork.LoadLevel() | Runner.SetActiveScene() |