새로운 사항
Fusion 1은 Bolt의 틱 기반 넷코드와 PUN의 클라우드 기반 편의성을 결합하여 업계 최고의 상태 동기화 SDK로 기준을 높였습니다. 이 독특한 아키텍처를 통해 Fusion은 다양한 게임 장르를 다룰 수 있으며 놀라운 CPU 및 대역폭 사용과 결합하여 진정한 차세대 네트워킹 SDK가 되었습니다.
Fusion 2는 기존 API에 새로운 기능과 삶의 질 업데이트를 제공함으로써 이러한 기반을 구축합니다. 또한 Fusion의 내부 작업을 개선하고 효율화하기 위해 Fusion의 내부 코어의 상당 부분이 다시 작성되었습니다. 데이터 전송, 시간 동기화, 메모리 관리 및 전반적인 CPU 성능과 같은 분야에 광범위한 변화를 주었습니다.
이 페이지에서는 Fusion 2를 위해 변경한 내용에 대한 개요를 제공합니다.
관심 관리 시스템 재작업
새로운 시스템은 훨씬 더 성능이 뛰어나며 이제 객체가 클라이언트의 관심 집합에 들어가거나 나갈 때마다 안정적인 Enter/Exit 콜백을 제공합니다.
이것들은 Network 객체가 특정 플레이어의 AOI 영역에 들어가거나 나갈 때뿐만 아니라 플레이어가 명시적으로 객체가 추가되거나 제거된 ( Runner.SetPlayerAlwaysInterested()를 사용하여)
에 관심이 있을 때 실행됩니다. 콜백은 서버, 호스트 및 공유 모드에서 서버에서 안정적으로 계산됩니다.
또한 NetworkObject/NetworkBehaviour.ReplicateTo API를 사용하여 어떤 동작이 어떤 클라이언트에게 복제되는지 세부적인 동적 제어를 할 수 있습니다.
프록시의 FixedUpdateNetwork
FixedUpdateNetwork는 기본적으로 프록시에서 더 이상 실행되지 않습니다. 프록시는 클라이언트가 InputAuthority를 보유하지 않는 클라이언트의 NetworkObject입니다.
대부분의 애플리케이션이 프록시를 시뮬레이션할 필요가 없기 때문에 이러한 변경은 전체 CPU 사용량을 감소시킵니다. 이 작업이 필요한 경우(예: 예측된 물리학을 사용하는 경우), 프록시는 다음을 사용하여 FixedUpdateNetwork 콜백을 시뮬레이션하고 호출하도록 설정할 수 있습니다:
C#
networkRunner.SetIsSimulated(networkObject, true);
새로운 시간 동기화
Fusion 2는 렌더링 전에 클라이언트가 서버 스냅샷을 얼마나 빨리 예측하고 버퍼링 하는지를 제어하는 시스템을 개선했습니다. Fusion 1.1과 비교했을 때, 새로운 시스템은 여전히 변화하는 네트워크 상황에 매끄럽게 적응하지만 훨씬 더 빠르고 안정적으로 적응합니다.
또한 설정이 더 단순하고 의미가 있습니다. 예측에 대한 클라이언트의 요구와 스냅샷 버퍼링에 소요되는 시간은 모두 두 가지 설정(각각), 즉 대상 패킷 손실과 추가적인 정적 오프셋에서 발생합니다.
이것들이 무엇을 하는지 설명하기 위해, 이 시스템은 최근 네트워크 조건을 샘플링하고 네트워크 지연이 지정된 손실만 유도하도록 클라이언트가 얼마나 앞서 있는지 동적으로 조정합니다. 지연이 증가하면 클라이언트는 더 앞을 예측할 것입니다. 지연이 다시 내려가면 클라이언트는 다시 더 작은 리드로 떨어질 것입니다. 정적 오프셋은 본질적으로 더 많은 "전달 시도"를 제공할 뿐입니다
예를 들어, 클라이언트 입력의 ~1%가 서버에 늦게 도달하는 것은 허용되지만 각 입력이 제시간에 도착하는 두 번째 기회를 갖는 것도 바람직하다고 가정합니다(첫 번째 패킷을 잃어버린 경우). 이러한 요구 사항을 사용하면 TimeSyncConfiguration.MaxLateInputs
를 1
로 설정하고 TimeSyncConfiguration.ExtraSimulationOffset
을 1
로 설정할 수 있습니다.
공유 모드
공유 모드는 이제 클라이언트 간의 정확한 틱 정렬 데이터에도 의존합니다.
이를 통해 Runner.Tick
을 사용하여 여러 클라이언트에서 공유 모드의 특정 틱을 참조할 수 있습니다. 현재 공유 모드에서 지원되는 TickTimers
가 그 예입니다.
틱 기반 공유 모드는 이제 서버 모드에서 동일한 정확한 스냅샷 보간을 사용하여 시각적 정확도와 인지된 대기 시간을 모두 향상시킵니다.
감지 변경
새로운 변경 탐지 API를 사용하면 Render
뿐만 아니라 FixedUpdateNetwork
에서도 변경 사항을 탐지하여 게임 플레이 로직을 트리거 할 수 있습니다.
다음과 같이 ChangeDetector
를 만듭니다:
C#
_changes = GetChangeDetector(ChangeDetector.Source.SimulationState);
그런 다음 FixedUpdateNetwork
또는 Render
등 언제든지 ChangeDetector
에서 DetectChanges
를 호출하여 변경사항을 검출합니다.
새로운 네트워크 데이터 액세스 시스템
새로운 API를 통해 기본 네트워크 데이터 버퍼에 직접 접근할 수 있습니다. TryGetSnapshotsBuffers
를 사용하여 스냅샷 버퍼에 접근합니다. 데이터를 읽을 수 있는 기능과 사용자 정의 보간을 위해 데이터를 보간하는 헬퍼 기능이 있습니다.
보간 대상
특히 네트워크 객체를 보호할 때 보간 대상을 다루는 작업은 Fusion 1에서 제대로 수행하기 어려웠습니다. Fusion 2를 사용하여 보간을 단순화했습니다. NetworkTransform을 사용할 때 더 이상 필요한 보간 대상은 없으며 NetworkTransform 컴포넌트 자체를 사용하여 유니티 Transform을 보간합니다.
NetworkTransform 개선
이제 NetworkTransform은 TRS 데이터(위치/회전/스케일)를 로컬 공간에 저장합니다. 이는 다음을 의미합니다:
- 하위 네트워크 및 중첩 네트워크 변환은 데이터 효율성이 훨씬 뛰어납니다.
- 그러나 관심 영역 위치는 중첩된 NetworkObject에 대해 더 이상 유효하지 않습니다. 이를 설명하기 위해 AreaOfInterestOverride가 도입되었으며 NetworkObject가 플레이어 관심을 확인하는 데 사용할 다른 NetworkObject 위치를 지정할 수 있습니다.
이제 Transform의 LocalScale을 선택적으로 동기화할 수 있습니다.
이제 NetworkObjects 상위를 선택적으로 동기화할 수 있습니다. 올바른 NetworkBehaviour가 상위 변환에 있어야 하며 NetworkTransform은 네트워크 객체의 루트에 있어야 합니다.
네트워크 물리
NetworkRigidBody 및 NetworkPhysicsSimulation은 Fusion DLL에서 제거되었으며, 유니티 물리 애드온으로 대체되었으며, 이는 Fusion SDK 메인 다운로드에 포함되어 있습니다. 서버 전용 및 전체 예측 물리의 전체 기능 세트를 사용할 수 있습니다.
소스 코드를 통해 물리 애드온을 제공하면 프로젝트 필요에 맞게 수정/확장할 수 있습니다. 이를 통해 VR 게임과 같은 복잡한 사용 사례가 물리 작업을 할 때 더 유연하게 사용할 수 있습니다. NetworkTransform은 Fusion 2에서 InterpolationTarget 요구 사항을 제거했지만 NetworkRigidbody는 여전히 InterpolationTarget 속성을 가지고 있습니다. 그러나 보간 대상은 매우 특정한 사용 사례에만 필요하며 일반적으로 null(강체 변환이 보간을 위해 이동됨을 나타냄)로 남겨질 수 있습니다.
VR 입력 모드
VR 게임을 위해 설계된 새로운 입력 전송 모드입니다. 기본적으로 Fusion은 신뢰할 수 없는 전송을 사용하여 클라이언트에서 서버로 입력을 보냅니다. 패킷 손실을 완화하기 위해 과거 입력의 작은 이력이 각 입력 패킷에 포함됩니다. 이를 통해 서버는 몇 개의 개별 패킷이 손실되더라도 완전한 입력 스트림으로 작동할 수 있지만 입력 패킷의 크기는 증가합니다.
VR 입력 모드는 머리/손의 위치 데이터가 포함된 큰 입력 구조를 가진 VR 게임의 대역폭을 획기적으로 줄이기 위해 최신 입력 상태만 전송합니다.
이 모드를 활성화하려면 NetworkProjectConfig
에서 Input Transfer Mode
를 최신 상태
로 설정합니다.
암호화
Fusion 2는 끊김 없는 엔드 투 엔드 암호화를 도입하여 게임 플레이 트래픽의 보안을 보장합니다. 암호화 시스템은 기존의 Realtime SDK를 기반으로 구축된 클라이언트와 Photon Cloud 간의 통신을 지원합니다. Fusion 2의 주요 추가 기능은 클라이언트와 서버 간에 교환되는 데이터를 자동으로 암호화하는 것으로 프로세스의 번거로움이 없습니다. Fusion 2는 공유 모드나 클라이언트-서버 모드에 상관없이 피어 간에 전송되는 전체 데이터 패킷을 암호화하여 보안을 강화하는 강력한 암호화 솔루션을 제공합니다.
간단한 KCC
Simple KCC를 통해 Fusion에 사용자 친화적이고 직관적인 3D 캐릭터 컨트롤러를 추가했습니다. Fusion을 사용하여 게임 프로젝트에서 캐릭터 이동을 쉽게 만들 수 있도록 설계되었습니다.
유니티 CharacterController
와 비교하여 더 많은 기능을 제공하고 모든 멀티플레이어 사용 사례를 완벽하게 지원하기 때문에 공유, 호스트, 서버 모드에서 사용할 수 있습니다.
새로운 힙 시스템
Fusion 2는 메모리를 동적으로 미리 할당하는 새로운 내부 힙과 함께 제공됩니다. 새로운 힙은 Fusion에서 사용되는 관리되지 않는 내부 메모리의 누수 탐지 및 가비지 컬렉션을 허용합니다.
통합 데이터 전송 모델
Fusion 1은 두 가지 데이터 전송 모델(델타 스냅샷과 궁극적 일관성)을 제공했습니다. 두 모델 모두 사용 사례가 있었지만, 우리는 단일 모델에 초점을 맞추면 거의 모든 사용 사례에 대해 더 효율적인 CPU와 대역폭의 데이터 전송을 제공할 수 있다는 것을 발견했습니다.
Fusion의 새로운 궁극적 일관성 모드는 이전 버전에 비해 성능이 많이 향상되었을 뿐만 아니라 기본적으로 네트워크 속성
업데이트가 하나의 NetworkObject
로 모두 동일한 틱으로 클라이언트에 도착하도록 보장하여 개체별로 일관된 틱 정확한 데이터를 제공합니다. 속성별 클래식 궁극적 일관성 전송의 경우 SimulationConfig.ObjectDataConsistency
를 Eventual
로 설정할 수 있습니다.
씬 관리
더 많은 경우에 즉시 사용할 수 있도록 씬 관리를 완전히 다시 작성했습니다. 이제는 유니티의 SceneManager를 대체하여 더 정교한 씬 전환을 구축할 수 있습니다.
더 이상 주소 지정 가능한 씬에 대한 맞춤형 지원을 작성할 필요가 없습니다. 주소 지정 가능한 씬 에셋에 FusionScenes
주소 지정 가능 레이블을 추가하기만 하면 Fusion이 자동으로 인식합니다.
추가 씬 로드 준비 완료! 새로운 NetworkSceneInfo
는 최대 8개의 씬을 동시에 지원합니다. 단일 피어 모드와 다중 피어 모드 모두에서 작동합니다.
Versioning을 사용하면 SceneAuthority
에서 원하는 씬을 제거하고 다시 추가하거나 Single
모드로 로드하는 것만으로 클라이언트가 씬을 다시 로드할 수 있습니다.
여기에 씬이 추가된 여러 피어 모드에서도 객체를 DontDestroyOnLoad
로 생성할 수 있습니다.
Fusion 2 App Ids
Fusion 2 애플리케이션은 Photon 관리 화면에서 Fusion 2 AppId를 명시적으로 생성해야 합니다.
자세한 내용은 Fusion 공유 모드 기본 - AppID 생성 튜토리얼을 참조하십시오.
새로운 데모 메뉴
새로운 데모 메뉴를 사용하면 시제품 제작을 위한 템플릿 메뉴를 제공하여 Fusion 개발을 시작할 수 있습니다.
파티 코드를 공유하여 랜덤 매치메이킹, 파티 기반 매치메이킹 등 일반적으로 사용되는 많은 기능을 보여줍니다.
확장 가능하고 연결 로직을 다루는 복잡성을 처리하도록 설계되었습니다. 이러한 설계 목표는 서로 경쟁하며 이 솔루션은 합리적으로 균형을 잡으려고 합니다.
지연 보상
지연 보상이 개선되었습니다. 애니메이션 히트 박스를 렌더 앞에 배치하여 올바른 위치에 놓을 필요가 없습니다. 지연 보상은 자동으로 렌더에서 플레이어가 화면에서 본 것과 일치하는 올바른 보간 된 애니메이션 위치를 사용합니다.
지연 보상은 2D 사용 사례를 지원하고 이제 2D 물리 씬에 대한 쿼리를 허용합니다.
또한, 3D 캡슐 히트 박스도 이제 지원됩니다.
NetworkObjectProvider
INetworkObjectPool
이 INetworkObjectProvider
로 대체되어 보다 일관성 있고 완벽한 API를 제공하고 있습니다. 기본적인 구현은 비동기적으로 객체를 로드 및 스폰 할 수 있습니다.
이러한 새로운 기능을 수용하기 위해 NetworkRunner.TrySpawn
과 사용 가능한 NetworkRunner.SpawnAsync
메소드가 추가되었습니다. Addressable은 더 이상 WaitForCompletion
와 함께 미리 로드하거나 기다릴 필요가 없습니다!
사용되지 않은 Addressable 프리팹은 인스턴스 수가 0에 도달한 후 즉시 또는 NetworkRunner.Prefabs.UnloadUnreferenced
를 사용하여 사용자의 재량에 따라 언로드할 수 있습니다.
위의 모든 것을 이제 NewtorkPrefabsInspector
창에서 확인할 수 있습니다. 이 창에서는 어떤 네트워크 프리팹이 로드되고, 생성되었는지, 그리고 그들의 인스턴스 수는 얼마인지를 검사할 수 있습니다.
SendReliableData
신뢰할 수 있는 데이터 스트리밍 API를 재작업하여 많은 새로운 삶의 질 향상을 가져왔습니다. 자동으로 데이터를 조각들로 분할하여 타깃 클라이언트로 스트리밍하고 재조립합니다. 전체 데이터가 수신되면 데이터와 함께 콜백이 호출됩니다. 데이터 전송 상태를 추적하기 위해 또 다른 콜백이 제공됩니다.
예제 코드:
C#
byte[] largeData = new byte [10000];
// Provide 4 numbers as a unique key for the data
var key = ReliableKey.FromInts(42, 0, 0, 0);
// Use in shared mode or as the server/host to send data to players
runner.SendReliableDataToPlayer(playerRef, key, largeData);
// Use as a client to send data to the server/host
runner.SendReliableDataToServer(key, largeData);
데이터 수신을 위한 콜백(INetworkRunnerCallbacks):
C#
public void OnReliableDataReceived(NetworkRunner runner, PlayerRef player, ReliableKey key, ArraySegment<byte> data){}
public void OnReliableDataProgress(NetworkRunner runner, PlayerRef player, ReliableKey key, float progress){}
Back to top