Fusion 1로 부터
새로운 기능
Fusion 2는 Fusion의 핵심 원칙을 지키면서 API를 향상시키는 Fusion에 다양한 새로운 기능과 개선점을 제공합니다. 다음은 가장 중요한 개선점 목록입니다:
관심 입장/나가기 콜백
새로운 IInterestEnter
및 IInterestExit
콜백이 Fusion에 추가되었습니다. 이러한 콜백은 네트워크 객체가 특정 플레이어의 AOI 영역에 들어가거나 존재할 때뿐만 아니라 플레이어가 명시적으로 추가되거나 제거된 객체(Runner.SetPlayerAlwaysInterested()
를 사용하여)에 관심이 있을 때 발생합니다. 콜백은 서버, 호스트 및 공유 모드의 서버에서 안정적으로 계산됩니다.
보간 대상
특히 네트워크 개체를 보호할 때 보간 대상을 다루는 작업은 Fusion 1을 제대로 수행하기 어려울 수 있습니다. Fusion 2를 사용하여 보간을 단순화했습니다. 더 이상 보간 대상은 없으며 대신 NetworkTransform으로 Transform 자체가 보간 됩니다.
NetworkTransform
NetworkTransform
에 몇 가지 변경 사항이 있습니다. 네트워크 트랜스폼 참고
로컬 스페이스
이제 NetworkTransform
은 TRS 데이터(위치/회전/스케일)를 로컬 공간에 저장합니다. 이는 다음을 의미합니다:
- 하위 및 중첩된
NetworkTransform
을 통해 훨씬 더 효율적인 데이터 제공 - 그러나 관심 지역 위치는 중첩된
NetworkObject
에는 더 이상 유효하지 않습니다. 이를 설명하기 위해AreaOfInterestOverride
가 도입되었으며, 이를 통해NetworkObject
가 플레이어의 관심을 확인하는 데 사용할 다른NetworkObject
위치를 지정할 수 있습니다.
스케일 동기화
이제 트랜스폼의 로컬 스케일을 선택적으로 동기화할 수 있습니다.
부모 동기화
이제 NetworkObject
부모를 선택적으로 동기화할 수 있습니다. 올바른 NetworkBehaviour
가 부모 트랜스폼에 존재해야 하며, NetworkTransform
이 네트워크 객체의 루트에 있어야 합니다.
네트워크 물리
NetworkRigidBody
및 NetworkPhysicsSimulation
이 Fusion DLL에서 삭제되어 현재 Fusion SDK 메인 다운로드에 포함된 유니티 물리 애드온으로 대체되었습니다. 서버 전용 및 전체 예측 물리의 전체 기능 세트를 사용할 수 있으며, 포워드 전용 모드를 새로 추가할 계획입니다.
소스 코드를 통해 물리 애드온을 제공하면 프로젝트에 필요한 대로 수정/확장할 수 있습니다. 이를 통해 VR 게임과 같은 복잡한 사용 사례를 보다 유연하게 처리할 수 있습니다. NetworkTransform
은 Fusion 2에서 InterpolationTarget
요구사항을 제거했지만 NetworkRigidbody
는 여전히 InterpolationTarget
속성을 가지고 있습니다. 그러나 보간 대상은 매우 특정한 사용 사례에만 필요하며 일반적으로 null
(강체 변환이 보간을 위해 이동됨을 나타냄)로 남길 수 있습니다.
변경 감지
새로운 변경 탐지 API를 사용하면 Render
의 변경 사항을 탐지할 수 있을 뿐만 아니라 FixedUpdateNetwork
네트워크의 변경 사항을 탐지하여 게임 플레이 로직을 작동시킬 수 있습니다. 기존의 OnChanged와 같이 동작하는 단순화된 구문 슈거를 제공해야 하는지 조사할 계획이지만 보다 완벽하고 유연합니다.
틱-정확 공유 모드
공유 모드는 이제 틱-정확합니다. 이것은 많은 개선을 가져다줍니다;
- 공유 모드 보간은 이제 훨씬 더 빠르고 정확합니다.
TickTimer
는 이제 공유 모드에서 유효합니다.- 네트워크 연결된
틱
값은 이제 공유 모드에서 의미가 있습니다.
사용자 지정 보간
데이터 포인트에 접근하기 위해 새로운 보간 API를 추가합니다. Fusion이 모든 네트워크 속성을 보간할 때 사용하는 데이터 버퍼와 보간 알파에 접근할 수 있습니다.
지연 보상 개선
지연 보상이 개선되었습니다. 더 이상 애니메이션 히트 박스를 올바른 위치에 두기 위해 렌더 앞에 위치시킬 필요가 없습니다. 지연 보상은 자동으로 렌더에서 플레이어가 화면에서 본 것과 일치하는 올바른 보간 된 애니메이션 위치를 사용합니다. 추가적인 지연 보상은 2d 사용 사례를 지원하고 이제 2d 물리 씬에 대한 쿼리를 허용합니다.
Fusion 2로 업그레이드
동영상
간단한 Fusion 프로젝트의 업그레이드 과정을 다루는 동영상 튜토리얼이 있습니다.
유니티 Version 업그레이드
Fusion 2는 유니티 2021.x 이상 버전의 유니티를 지원합니다. 이전 유니티 버전의 프로젝트의 경우 Fusion 업그레이드를 시도하기 전에 먼저 유니티를 업그레이드합니다.
SDK 업그레이드하기
- 프로젝트를 업그레이드하기 전에 버전 제어 시스템 소프트웨어 또는 이와 동등한 방법을 사용하여 프로젝트를 백업해야 합니다.
NetworkProjectConfig
를Assets/Photon/Fusion/Resources/NetworkProjectConfig
에서Assets/NetworkProjectConfig
로 이동하여 백업합니다.- 프로젝트에서
/Photon
폴더를 삭제합니다. - Fusion 2 SDK를 다운로드하고 유니티 패키지를 가져옵니다.
Assets/Photon/Fusion/Resources/NetworkProjectConfig
아래의NetworkProjectConfig
를 다시 이동합니다.- Fusion 2가 작동하려면 Fusion 1 프로젝트가 아닌 별도의 AppId가 필요합니다. 새로운 AppId를 여기에서 생성하고 생성하는 동안 Fusion 2를 선택합니다. 유니티에서
Fusion > Fusion Hub
아래에 새로운 AppId를 삽입합니다. /Packages/manifest.json
을 열고 기존 주소 지정 가능 패키지를"com.unity.addressables": "1.21.12"
(또는 주소 지정 가능이 설치되지 않은 경우 새로 추가)로 교체합니다. 파일을 저장합니다.
패키지를 다 가져오면 콘솔에 오류가 많이 발생합니다. API를 업그레이드하여 수동으로 수정해야 합니다.
API 변경 사항
간단한 API 변경 사항
이전 API | 신규 API |
---|---|
(int)PlayerRef | PlayerRef.PlayerId |
PlayerRef.IsValid | PlayerRef.IsRealPlayer |
(int)SceneRef | SceneRef.FromIndex |
NetworkObject.NetworkGuid | NetworkObject.NetworkTypeId |
INetworkObjectPool | INetworkObjectProvider. |
NetworkTransform/NetworkTRSP.TeleportToPosition() | NetworkTransform.Teleport() |
Runner.Config.DefaultPlayers | Runner.Config.Simulation.PlayerCount |
[Accuracy] | Remove the attribute. No replacment. |
NetworkRunner.IsVisible | NetworkRunner.GetVisible() and SetVisible() |
Runner.SimulationConfig.Topology | Runner.Topology |
NetworkCharacterControllerPrototype | NetworkCharacterController |
Runner.Simulation.X (Runner.Simulation.Tick) | Runner.X (Runner.Tick) |
Runner.MultiplePeerUnityScene | Runner.SimulationUnityScene |
Runner.SetActiveScene | Runner.LoadScene (must only be called on host/master client) |
NetworkObjectPool
비동기식 로드가 가능하도록 풀링 API가 크게 변경되었습니다.
INetworkObjectPool
이 INetworkObjectProvider
로 이름이 변경되었습니다.
풀링과 같은 간단한 사용 사례에 사용할 수 있는 인스턴스를 제공하는 두 가지 단순 기능이 새로 추가되었습니다:
C#
public class PooledNetworkObjectProvider : NetworkObjectProviderDefault
{
protected override NetworkObject InstantiatePrefab(NetworkRunner runner, NetworkObject prefab)
{
// Get object from pool and return it.
}
protected override void DestroyPrefabInstance(NetworkRunner runner, NetworkPrefabId prefabId, NetworkObject instance)
{
// Return the instance to the pool.
}
}
ReleaseInstance
및 AcquireInstanceFunctions
가 조정되었습니다.
C#
public void ReleaseInstance(NetworkRunner runner, NetworkObject no, bool isSceneObject)
{
....
}
to
C#
public void ReleaseInstance(NetworkRunner runner, in NetworkObjectReleaseContext context)
{
var no = context.Object;
}
AcquireInstance(NetworkRunner runner, NetworkPrefabInfo info)
는 AqcuirePrefabInstance(NetworkRunner runner, in NetworkPrefabAcquireContext context, out NetworkObject result)
입니다. 반환 파라미터는 객체가 아니라 결과인 (NetworkObjectAcquireResult.Success)
입니다. 개체는 대신 out
파라미터를 통해 전달됩니다.
컨텍스트 매개 변수의 IsSceneObject
가 context.TypeId.IsSceneObject
로 대체되었습니다.
이전:
C#
public NetworkObject AcquireInstance(NetworkRunner runner, NetworkPrefabInfo info)
{
NetworkObject prefab;
if (NetworkProjectConfig.Global.PrefabTable.TryGetPrefab(info.Prefab, out prefab))
{
var newO = ...
return newO;
}
return null;
}
현재:
C#
public NetworkObjectAcquireResult AcquirePrefabInstance(NetworkRunner runner, in NetworkPrefabAcquireContext context, out NetworkObject result)
{
NetworkObject prefab;
if (NetworkProjectConfig.Global.PrefabTable.TryGetPrefab(context.PrefabId, out prefab, true) == NetworkPrefabTableGetPrefabResult.Success)
{
var newO = ....
result = newO;
return NetworkObjectAcquireResult.Success;
}
result = null;
return NetworkObjectAcquireResult.Failed;
}
NetworkProjectConfig.Global.PrefabTable.TryGetPrefab(info.Prefab, out prefab)
에는 이제 추가 bool
IsSynchronous 파라미터(동일한 동작을 유지하기 위해 true로 설정됨)가 있으며 bool 대신 NetworkPrefabTableGetPrefabResult
열거형을 반환합니다.
변경 감지
OnChanged
가 제거되었습니다. Fusion 2는 Render 및 FixedUpdateNetwork에서 변경을 감지할 수 있는 보다 확장된 새로운 API를 제공합니다. 새로운 변경 감지 API 여기에 대해 자세히 보실 수 있습니다.
다음은 OnChanged
를 동등한 Render
기반의 변경 탐지로 대체한 간단한 예입니다.
이전:
C#
public class Example : NetworkBehaviour
{
[Networked(OnChanged = nameof(OnStateChanged))]
public int State { get; set; }
public static void OnStateChanged(Changed<Example> changed)
{
var value = changed.Behaviour.State;
changed.LoadOld;
var oldValue = changed.Behaviour.State;
}
}
현재:
C#
public class Example : NetworkBehaviour
{
private ChangeDetector _changes;
[Networked]
public int State { get; set; }
public override void Spawned()
{
_changes = GetChangeDetector(ChangeDetector.Source.SimulationState);
}
public override void Render()
{
foreach (var change in _changes.DetectChanges(this, out var previousBuffer, out var currentBuffer))
{
switch (change)
{
case nameof(State):
var reader = GetPropertyReader<int>(nameof(State));
var (previous,current) = reader.Read(previousBuffer, currentBuffer);
OnStateChanged(previous, current);
break;
}
}
}
private void OnStateChanged(int oldValue,int value)
{
}
}
보간 대상
보간 대상이 더 이상 존재하지 않으므로 NetworkTransform
과 함께 사용할 필요가 없습니다. NetworkTransform
자체가 있는 객체는 Render
에서 그에 따라 보간 됩니다.
예측 스폰 하기
예측 스폰이 제거되어 대체할 새로운 APi가 없습니다. NetworkObjectPredictionKey
가 필요 없어 Spawn
함수에서 제거합니다.
물리
Fusion dll에서 NetworkRigidBody
와 NetworkPhysicsSimulation
이 삭제되었습니다. 이들은 유니티 물리 애드온 IBeforePhysicsStep
(및 그 이후)로 대체되었으며 RunnerPhysicsSimulate.OnBeforeSimulate
(및 그 이후)로 다시 매핑되어야 합니다
공유 모드 개선
이제는 틱이 정렬되어 있습니다. 즉, Runner.Tick
을 사용하여 공유 모드에서 특정 틱을 참조하고 해당 정보를 다른 클라이언트와 공유할 수 있습니다. 또한 공유 모드에서 TickTimer
를 사용할 수 있습니다.
시뮬레이션 행동
SimulationBehaviours
는 NetworkObjects
에서 더 이상 지원되지 않습니다. NetworkBehaviour
로 대체하고 IOnSpawned/IOnDespawned
인터페이스를 제거한 후 Spawned/Despawned을 오버라이드
하여 사용합니다.
프록시에서 FixedUpdateNetwork
FixedUpdateNetwork
는 프록시에서 기본적으로 더 이상 실행되지 않습니다.
Runner.SetIsSimulated(Object, true);
를 호출하여 수동으로 설정할 수 있습니다. FixedUpdateNetwork
가 바로 실행되도록 하려면 Spawned
에서 호출하는 것이 좋습니다.
씬 관리
씬 관리는 주소 지정이 가능한 씬과 추가 로딩이 가능하도록 크게 변경되었습니다.
OrderAfter / Before
OrderAfter
및 OrderBefore
속성이 제거되었습니다. 대신 유니티의 실행 순서를 사용합니다. 기본 제공 Fusion 유형의 스크립트 실행 순서는 Edit > Project Settings > Script Execution Order
아래에서 확인할 수 있습니다. 기본 제공 Fusion 유형의 실행 순서를 수정하지 않습니다.
스크립트의 실행 순서를 조정하려면 프로젝트 설정의 목록에 스크립트를 수동으로 추가하거나 [DefaultExecutionOrder(x)] 속성을 사용합니다.
예: [OrderAfter(typeof(HitboxManager))]
는 [DefaultExecutionOrder(-1995)]
가 됩니다.
AOI INetworkRunnerCallbacks
클라이언트의 AOI 영역에 객체가 들어오거나 나올 때마다 호출되는 새로운 콜백이 두 가지 있습니다. 이 콜백을 사용하여 객체를 숨기거나 보여줍니다.
Fusion 1에서는 대신 AOI의 출입을 수동으로 감지해야 했습니다.
C#
public void OnObjectExitAOI(NetworkRunner runner, NetworkObject obj, PlayerRef player)
{
}
public void OnObjectEnterAOI(NetworkRunner runner, NetworkObject obj, PlayerRef player)
{
}