This document is about: FUSION 2
SWITCH TO

Fusion 1로 부터

새로운 기능

Fusion 2는 Fusion의 핵심 원칙을 지키면서 API를 향상시키는 Fusion에 다양한 새로운 기능과 개선점을 제공합니다. 다음은 가장 중요한 개선점 목록입니다:

관심 입장/나가기 콜백

새로운 IInterestEnterIInterestExit 콜백이 Fusion에 추가되었습니다. 이러한 콜백은 네트워크 객체가 특정 플레이어의 AOI 영역에 들어가거나 존재할 때뿐만 아니라 플레이어가 명시적으로 추가되거나 제거된 객체(Runner.SetPlayerAlwaysInterested()를 사용하여)에 관심이 있을 때 발생합니다. 콜백은 서버, 호스트 및 공유 모드의 서버에서 안정적으로 계산됩니다.

보간 대상

특히 네트워크 개체를 보호할 때 보간 대상을 다루는 작업은 Fusion 1을 제대로 수행하기 어려울 수 있습니다. Fusion 2를 사용하여 보간을 단순화했습니다. 더 이상 보간 대상은 없으며 대신 NetworkTransform으로 Transform 자체가 보간 됩니다.

NetworkTransform

NetworkTransform에 몇 가지 변경 사항이 있습니다. 네트워크 트랜스폼 참고

로컬 스페이스

이제 NetworkTransform은 TRS 데이터(위치/회전/스케일)를 로컬 공간에 저장합니다. 이는 다음을 의미합니다:

  • 하위 및 중첩된 NetworkTransform을 통해 훨씬 더 효율적인 데이터 제공
  • 그러나 관심 지역 위치는 중첩된 NetworkObject에는 더 이상 유효하지 않습니다. 이를 설명하기 위해 AreaOfInterestOverride가 도입되었으며, 이를 통해 NetworkObject가 플레이어의 관심을 확인하는 데 사용할 다른 NetworkObject 위치를 지정할 수 있습니다.

스케일 동기화

이제 트랜스폼의 로컬 스케일을 선택적으로 동기화할 수 있습니다.

부모 동기화

이제 NetworkObject 부모를 선택적으로 동기화할 수 있습니다. 올바른 NetworkBehaviour가 부모 트랜스폼에 존재해야 하며, NetworkTransform이 네트워크 객체의 루트에 있어야 합니다.

네트워크 물리

NetworkRigidBodyNetworkPhysicsSimulation이 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 업그레이드하기

  1. 프로젝트를 업그레이드하기 전에 버전 제어 시스템 소프트웨어 또는 이와 동등한 방법을 사용하여 프로젝트를 백업해야 합니다.
  2. NetworkProjectConfigAssets/Photon/Fusion/Resources/NetworkProjectConfig에서 Assets/NetworkProjectConfig로 이동하여 백업합니다.
  3. 프로젝트에서 /Photon 폴더를 삭제합니다.
  4. Fusion 2 SDK를 다운로드하고 유니티 패키지를 가져옵니다.
  5. Assets/Photon/Fusion/Resources/NetworkProjectConfig 아래의 NetworkProjectConfig를 다시 이동합니다.
  6. Fusion 2가 작동하려면 Fusion 1 프로젝트가 아닌 별도의 AppId가 필요합니다. 새로운 AppId를 여기에서 생성하고 생성하는 동안 Fusion 2를 선택합니다. 유니티에서 Fusion > Fusion Hub 아래에 새로운 AppId를 삽입합니다.
  7. /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가 크게 변경되었습니다.

INetworkObjectPoolINetworkObjectProvider로 이름이 변경되었습니다.

풀링과 같은 간단한 사용 사례에 사용할 수 있는 인스턴스를 제공하는 두 가지 단순 기능이 새로 추가되었습니다:

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.
    }
}

ReleaseInstanceAcquireInstanceFunctions가 조정되었습니다.

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 파라미터를 통해 전달됩니다.

컨텍스트 매개 변수의 IsSceneObjectcontext.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에서 NetworkRigidBodyNetworkPhysicsSimulation이 삭제되었습니다. 이들은 유니티 물리 애드온 IBeforePhysicsStep (및 그 이후)로 대체되었으며 RunnerPhysicsSimulate.OnBeforeSimulate(및 그 이후)로 다시 매핑되어야 합니다

공유 모드 개선

이제는 틱이 정렬되어 있습니다. 즉, Runner.Tick을 사용하여 공유 모드에서 특정 틱을 참조하고 해당 정보를 다른 클라이언트와 공유할 수 있습니다. 또한 공유 모드에서 TickTimer를 사용할 수 있습니다.

시뮬레이션 행동

SimulationBehavioursNetworkObjects에서 더 이상 지원되지 않습니다. NetworkBehaviour 로 대체하고 IOnSpawned/IOnDespawned 인터페이스를 제거한 후 Spawned/Despawned을 오버라이드하여 사용합니다.

프록시에서 FixedUpdateNetwork

FixedUpdateNetwork는 프록시에서 기본적으로 더 이상 실행되지 않습니다.

Runner.SetIsSimulated(Object, true);를 호출하여 수동으로 설정할 수 있습니다. FixedUpdateNetwork가 바로 실행되도록 하려면 Spawned에서 호출하는 것이 좋습니다.

씬 관리

씬 관리는 주소 지정이 가능한 씬과 추가 로딩이 가능하도록 크게 변경되었습니다.

OrderAfter / Before

OrderAfterOrderBefore 속성이 제거되었습니다. 대신 유니티의 실행 순서를 사용합니다. 기본 제공 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)
{
}
Back to top