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(序列化為
NetworkId
與NetworkBehaviour
索引) - PlayerRef(序列化為
PlayerRef.PlayerId
)
- NetworkObject(序列化為
- 網路集合
- NetworkArray<T> 使用
[Capacity]
屬性設定最大Length
(預設為1) - NetworkDictionary<K, V> 使用
[Capacity]
設定最大Count
- NetworkLinkedList<T> 使用
[Capacity]
屬性設定最大Count
。 - NetworkString<_size> 使用任何預先定義的
IFixedStorage
類型(名為“_X”)設定最大Size
,舉例而言其中X是存儲結構_32
的大小
- NetworkArray<T> 使用
網路Fusion物件類型
NetworkObject
與NetworkBehaviour
參照可以是NetworkBehaviour
的已連網屬性。(注意: 參照在INetworkStruct
中無效)。
在內部,這些已連網的NetworkObject
與NetworkBehaviour
參照被轉換為NetworkId
與NetworkBehaviourId
值。
請參見網路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]
屬性用於定義NetworkArray
、NetworkDictionary
、NetworkLinkedList
、NetworkString
與字串的最大大小。
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