수정중인 페이지 입니다.
fusion | v1 switch to V2  

Network Behaviour

개요

NetworkBehaviour는 동일 노드 또는 부모 노드에 NetworkObject가 필요합니다.

NetworkBehaviour 함수는 SimulationBehaviour와 유사하게 동작하며 동기화된 상태를 전달할 수 있습니다. 이것이 연관된 NetworkObject가 있어야 하는 이유입니다.

메인 화면으로
 

재정의 가능한 메소드

NetworkObject에는 여러 가지 라이프 사이클 메소드가 있으며, 이 모든 메소드는 SimulationBehaviourNetworkBehaviour를 구현할 때 재정의될 수 있습니다.

함수 설명
FixedUpdateNetwork() Fusion의 고정 시간 단계 콜백입니다. 핵심 게임 로직에 사용됩니다.
Spawned() 스폰 후 콜백.
Despawned(bool hasState) 네트워크 객체가 스폰 해제되기 전 호출됨.
---
bool hasState: 동작 상태에 여전히 액세스할 수 있는 경우
Render() 콜백을 렌더링 하는 시뮬레이션 프레임 이후. 모든 시뮬레이션이 완료된 후 실행됩니다. Fusion이 물리를 처리할 때 유니티의 Update 대신 사용합니다.

메인 화면으로
 

Networked 상태

내부적으로 Fusion은 각 틱에 대한 전체 네트워크 상태를 Snapshot이라고 하는 단일 메모리 버퍼로 저장합니다. 네트워크 속성은 NetworkedBehaviour의 어떤 변수가 네트워크 상태의 일부인지 정의합니다.

Networked 속성

네트워크 속성을 정의하려면 [Networked] 속성을 사용하십시오. Fusion은 이러한 태그가 지정된 속성을 자체 고성능 데이터 버퍼 및 델타 압축에 자동으로 연결합니다. 속성 setter 및 getter는 메모리 할당 오버헤드를 제거하고 최적의 성능을 제공하기 위해 컴파일 시간을 사용자 지정 코드로 대체합니다.

public class PlayerBehaviour : NetworkedBehaviour
{
  [Networked] public float Health { get; set; }
}

컴파일 시 Fusion은 빈 get/set 스텁을 실제 네트워크 상태 데이터에 접근하는 코드로 대체합니다. 직접 접근은 메모리 할당 오버헤드를 제거하고 최적의 성능을 제공합니다. 수동으로 구현하지 마십시오.

상태 버퍼에 대한 직접 속성 접근은 변경 사항이 발생할 때마다 상태가 해당 변경 사항을 즉시 반영한다는 것을 의미합니다.

네트워크 상태에 영향을 미치는 로직을 작성하려면 FixedUpdateNetwork()를 재정의하고 구현하세요.

public override void FixedUpdateNetwork()
{
    Health += Runner.DeltaTime * HealthRegen;
}

메인 화면으로
 

허용된 타입

다음은 [Networked]화 될 수 있는 Fusion에서 지원하는 타입입니다:

  • 원시 타입
    • byte, sbyte
    • short, int, long
    • ushort, uint, ulong
    • float, double
    • bool (converted to int)
  • [Capacity] 속성을 사용하여 최대 Length를 설정하는 문자열 (기본값: 16)
  • 유니티 구조체 타이 (ILWeaver.cs에서 정의)
    • Vector2, Vector3, Vector4
    • Quaternion
    • Matrix4x4
    • Vector2Int, Vector3Int
    • BoundingSphere
    • Bounds
    • Rect
    • BoundsInt
    • RectInt
    • Color, Color32
  • 열거형
  • System.Guid
  • 사용자 정의 INetworkStructs
  • Fusion 정의된 INetworkStructs
    • NetworkString<>
    • IFixedStorage<>
    • NetworkBool
    • Ptr
    • Angle
    • BitSet64, BitSet128, BitSet192, BitSet256
    • PlayerRefSet
    • NetworkId
    • NetworkButtons
    • NetworkRNG
    • NetworkObjectGuid
    • NetworkPrefabRef
    • NetworkObjectHeader
    • NetworkPrefabId
    • SceneRef
    • TickTimer
    • IFixedStorage (_2, _4, _8, _16, _32, _64, _128, _256, _512)
  • Fusion 타입
    • NetworkObject (NetworkId로 직렬화)
    • NetworkBehaviour (NetworkIdNetworkBehaviour 인덱스로 직렬화)
    • PlayerRef (PlayerRef.PlayerId로 직렬화)
  • Network 컬렉션

메인 화면으로
 

네트워킹 Fusion 객체 타입

NetworkObjectNetworkBehaviour 참조들은 NetworkBehaviour의 네트워크 된 속성이 될 수 있습니다. (노트:_ INetworkStruct에서는 유효하지 않습니다).

내부적으로, 이러한 네트워크 된 NetworkObjectNetworkBehaviour 참조들은 NetworkIdNetworkBehaviourId로 변환됩니다.

ILWeaver에서 생성한 Set 메소드는 참조를 ID로 변환(랩)하고 해당 ID가 네트워크로 연결됩니다.

ILWeaver가 생성한 Get 메서드는 Runner.TryGetObject()Runner.TryGetBehaviour()를 사용하여 ID를 참조로 변환(언랩) 합니다.

[Networked] public NetworkObject MyNetworkObject { get; set; }
[Networked] public CustomNetworkBehaviour MyNetworkBehaviour { get; set; }

이러한 자동화는 편리한 반면 다음을 의미합니다.

  • 명시적 null 값
  • 언랙의 실패

둘 다 Get에 대해 null 값을 리턴합니다 - 둘 사이의 차이는 없습니다.

속성에 NetworkObjectNetworkBehaviour를 사용하는 대신 NetworkIdNetworkBehaviourId 값을 사용하는 방법도 있습니다.

ID별로 이러한 참조를 명시적으로 동기화하면 null 값이 다음과 같은지 여부를 감지할 수 있습니다.

  • 명시적 null(0)을 나타내고, 또는
  • 개체(value > 0)를 나타내지만 해당 객체가 현재 로컬에 존재하지 않습니다(랩을 해제하지 못함).

메인 화면으로
 

NetworkId 사용 방법 예제

using Fusion;

public class SyncNetworkObjectExample : NetworkBehaviour
{
  // NetworkId is backed by one int value.
  // A zero value (default) represents null.
  [Networked] public NetworkId SyncedNetworkObjectId { get; set; }

  private void SetObject(NetworkObject netObj)
  {
    SyncedNetworkObjectId = netObj != null ? netObj.Id : default;
  }

  bool TryResolve(out NetworkObject no)
  {
    // A default (0) value indicates an explicit null value.
    // Return true to represent successfully resolving this to null.
    if (SyncedNetworkObjectId == default)
    {
      no = null;
      return true;
    }

    // Find the object using the non-null id value.
    // Return true if the lookup was successful.
    // Return false and null if the NetworkObject could not be found on the local Runner.
    bool found = Runner.TryFindObject(SyncedNetworkObjectId, out var obj);
    no = obj;
    return found;
  }
}

메인 화면으로
 

NetworkBehaviourId 사용 예제

using Fusion;

public class SyncNetworkBehaviourExample : NetworkBehaviour
{
  // NetworkId is backed by two int values.
  // Object = NetworkObject.Id (value of 0 represents null/Invalid).
  // Behaviour = NetworkBehaviour index in GameObject hierarchy.
  [Networked] public NetworkBehaviourId SyncedNetworkBehaviourId { get; set; }

  private void SetBehaviour(NetworkBehaviour nb)
  {
    SyncedNetworkBehaviourId = nb != null ? nb.Id : default;
  }

  bool TryResolve(out NetworkBehaviour no)
  {
    // A default (0) value indicates an explicit null value.
    // Return true to represent successfully resolving this to null.
    if (SyncedNetworkBehaviourId == default)
    {
      no = null;
      return true;
    }

    // Find the NetworkBehaviour using the non-default id value.
    // Return true if the lookup was successful.
    // Return false and null if the NetworkObject could not be found on the local Runner.
    bool found = Runner.TryFindBehaviour(SyncedNetworkBehaviourId, out var obj);
    no = obj;
    return found;
  }
}

메인 화면으로
 

기본값 설정하기

[Networked] 속성의 기본값을 설정할 수 있습니다.

메인 화면으로
 

일반 타입

대부분의 일반 타입의 경우 간단한 할당으로 충분합니다.

public class PlayerBehaviour : NetworkedBehaviour
{
  [Networked] public float Health { get; set; } = 100;
  [Networked] public NetworkObject DefaultNetworkObject { get; set; } = GameObject.FindGameObjectWithTag("Foo").GetComponent<NetworkObject>();
}

메인 화면으로
 

컬렉션

NetworkArray<T> , NetworkDictionary<K, V> , NetworkLinkedList<T> 그리고 NetworkString<_size>와 같은 네트워크 컬렉션은 특정 구문이 필요합니다. 자세한 내용은 같은 이름의 페이지를 참조하십시오.

메인 화면으로
 

Ref 및 Ptr

적절한 생성자를 사용하여 참조 및 포인터의 기본값을 설정할 수 있습니다.

[Networked] public ref Byte Prop => ref MakeRef<Byte>(123);
[Networked] public Byte* Prop => MakePtr<Byte>(123);

메인 화면으로
 

추가적인 속성

[Networked] 속성은 네트워크 상태가 처리되는 방법을 보다 구체적으로 정의하기 위해 여러 다른 속성과 결합할 수 있습니다.

정확성

[Accuracy] 속성을 사용하여 개별 숫자 타입 속성의 정확도를 제어할 수 있습니다.

public class PlayerBehaviour : NetworkedBehaviour
{
  [Networked, Accuracy(0.001)]
  public float Health { get; set; }
}

메인 화면으로
 

Capacity

[Capacity]NetworkArray, NetworkDictionary, NetworkLinkedList, NetworkString 및 문자열의 최대 크기를 정의하는 데 사용됩니다.

public class MyNetworkBehaviour : NetworkedBehaviour
{
  [Networked, Capacity(14)]
  string MyString { get; set; }

  [Networked, Capacity(8)]
  NetworkArray<byte> MyArray { get; }
}

네트워크 컬렉션 처리에 대한 상세 정보는, 네트워크 컬렉션 페이지를 참고하세요.

메인 화면으로
 

OnChanged

게임 코드는 두 렌더 프레임 사이의 네트워크 속성에서 변경이 감지될 때 트리거 될 수 있습니다. 반응형 코드를 작성하려면 [Networked] 속성에서 (OnChanged) 파라미터를 사용하십시오.

public class Powerup : NetworkBehaviour
{
    [Networked(OnChanged = nameof(OnXyzChanged))] public TypeOfProperty Xyz { get; set; }

    // Has to be public static void
    public static void OnXyzChanged(Changed<Powerup> changed)
    {
        changed.Behaviour.OnXyzChanged();
    }

    private void OnXyzChanged()
    {
        // Some logic reacting to the value change of the "Xyz" property
    }
}

콜백 이름을 지정하는 것 외에도 콜백이 실행되는 기기를 제어할 수 있습니다.

  • OnChangedTargets (기본값 All): Proxies, InputAuthorityStateAuthority중에서 콜백을 호출할 피어를 제한하는 권한을 선택합니다. 대상을 지정하지 않으면 모든 피어에서 콜백이 호출됩니다.

두 개의 유니티 Update 호출 사이에 변경 사항이 감지되면 OnChanged 콜백이 호출됩니다. 즉, 이러한 콜백은 체크 정렬되지 않으며 두 렌더 프레임 사이에서 발생하는 변경 사항만 감지하므로 게임 플레이 로직에 사용해서는 안 됩니다. OnChange 콜백의 주요 사용 사례는 특히 프록시에서 시각적 또는 오디오 효과를 트리거 하는 것입니다.

Changed<T> 파라미터는 변경 전과 후 모두 동작의 모든 속성에 대한 접근을 제공합니다. - LoadOldLoadNew를 사용하여 둘 사이를 전환합니다.

private static void OnXyzChanged(Changed<Powerup> changed)
{
  var new_value = changed.Behaviour.Xyz;
  changed.LoadOld();
  var old_value = changed.Behaviour.Xyz;
}

메인 화면으로
 

지네릭

NetworkBehaviour에서 파생된 템플릿 클래스를 만들 수 있습니다. 여기에는 [Networked] 속성도 포함될 수 있습니다.

// This is VALID
class ValidGenericClass_With_NonGenericProperty<T> : NetworkBehaviour {
    [Networked] public int Prop { get; set; }
}

하지만 <T> 타입의 generic [Networked] 속성을 갖는 것은 불가능 합니다.ty of type <T>.

// This is INVALID
class InValidGenericClass_With_GenericProperty<T> : NetworkBehaviour {
    [Networked] public T Prop { get; set; }
}

기술 문서 TOP으로 돌아가기