This document is about: FUSION 2
SWITCH TO

Networked Properties

概述

已連網屬性是NetworkBehaviour衍生類別的内容,定義了其關聯網路物件的已連網狀態。

為了定義已連網屬性,只需將[已連網]屬性新增到NetworkBehaviour衍生類別的自動屬性中。這指示Fusion自動生成IL程式碼,其將屬性取得器與設定器連線到相關網路物件的狀態記憶體緩衝區。請參閱允許類型

請不要 自己實作這些屬性 - 將其保留為自動屬性。如果您需要自己的特殊屬性處理,你需要將它們包裝在另一個屬性中。

C#

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

通常,對這些狀態的更改應在FixedUpdateNetwork()中進行,作為模擬的一部分。這確保了它們在客戶端預測中的行為正確,並且在複製時更改將是刷新準確的。

注意:在共享模式下,在其他時間段中修改網路屬性可能是可行的,例如Update()FixedUpdate()

C#

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

允許類型

Fusion支持以下類型,可以是[Networked]

  • 基元
    • byte、sbyte
    • short、int、long
    • ushort、uint、ulong
    • float、double
    • bool(轉換為int)
  • 使用[Capacity]屬性設定最大Length的字串(預設為16)
  • Unity架構類型(在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
  • 網路集合
    • NetworkArray<T> 使用[Capacity]屬性設定最大Length(預設為1)
    • NetworkDictionary<K, V> 使用[Capacity]設定最大Count
    • NetworkLinkedList<T> 使用[Capacity]屬性設定最大Count
    • NetworkString<_size> 使用任何預先定義的IFixedStorage類型(名為“_X”)設定最大Size,舉例而言其中X是存儲結構_32的大小

網路Fusion物件類型

NetworkObjectNetworkBehaviour參照可以是NetworkBehaviour的已連網屬性。(注意: 參照在INetworkStruct中無效)。

在內部,這些已連網的NetworkObjectNetworkBehaviour參照被轉換為NetworkIdNetworkBehaviourId值。

請參見網路Fusion物件類型

設定預設值

可以為[Networked]屬性設定預設值。

常見類型

對於大多數常見類型,簡單的指派就足夠了。

C#

public class PlayerBehaviour : NetworkBehaviour
{
  [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>需要特殊的語法。 請參閱同名頁面以獲取更多資訊。

容量

[Capacity]屬性用於定義NetworkArrayNetworkDictionaryNetworkLinkedListNetworkString與字串的最大大小。

C#

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

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

Ref與Ptr

可以使用適當的建構函式為參照和指標設定預設值。

C#

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

有關處理網路集合的更多資訊,請參閱網路集合頁面。

變更偵測

請參見變更偵測

高級布林值處理

在遊戲網路中,通常建議在值的變化可能未被檢測到的使用案例中,使用整數而不是布林值(例如,在序列化之前,布林值翻轉為真,然後又變回偽,或者由於篩除、資料遺失、共享模式壓縮、玩家加入延遲等原因導致切換遺失)。

對此的一種策略是使用整數符號值對布林值狀態進行編碼,並使用絕對值存儲其他資訊,例如值更改了多少次,或者值上次更改的時間。

C#

public class MyNetworkBehaviour : NetworkBehaviour
{
  // This is the backing value for our virtual bool.
  [Networked] int _intToggle { get; set; }


  // This property will automatically encode the change count into the backing value,
  // while still acting like a normal bool.
  private bool CountToggle
  {
    // This assumes 0 to mean false, <= can be used to make 0 indicate true.
    get => _intToggle > 0;
    // Every call to set increments the absolute value
    // and sets the sign to negative for false, positive for true.
    set =>
      _intToggle = _intToggle >= 0 ?
        value ?   _intToggle + 1 : -(_intToggle + 1) :
        value ? -(_intToggle - 1):   _intToggle - 1;
  }

  private int toggleCount => _intToggle >= 0 ? _intToggle : -_intToggle;
}

C#

public class MyNetworkBehaviour : NetworkBehaviour
{
  // This is the backing value for our virtual bool.
  [Networked] int _intToggle { get; set; }

  // This property will automatically encode the current tick into the backing value,
  // while still acting like a normal bool.
  private bool TickToggle
  {
    get => _intToggle > 0;
    set => _intToggle = value ? Runner.Tick : -Runner.Tick;
  }

  private Tick toggleLastChangedTick => _intToggle >= 0 ? _intToggle : -_intToggle;

}

內插補點

請參閱快照與內插補點

泛型

可以建立從NetworkBehaviour衍生的範本類別。這些甚至可以包含[Networked]屬性。

C#

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

然而, 可以有一個類型<T>的 generic [Networked] 屬性。

C#

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