Networking Fusion Object Types
概述
NetworkObject
和NetworkBehaviour
參照可以是NetworkBehaviour
的已連網屬性。(注意: 這些在INetworkStruct
中無效)。
在內部,這些已連網的NetworkObject
和NetworkBehaviour
參照被轉換為NetworkId
和NetworkBehaviourId
值。
ILWeaver生成的Set
方法將參照轉換(包裝)為其ID,而該ID就是已連網ID。
ILWeaver生成的Get
方法使用Runner.TryGetObject()
及Runner.TryGetBehaviour()
方法將ID轉換(解包)為參照。
C#
[Networked] public NetworkObject MyNetworkObject { get; set; }
[Networked] public CustomNetworkBehaviour MyNetworkBehaviour { get; set; }
雖然方便,但這種自動化確實意味著:
- 顯式空值,及;
- 未能解包
兩者都將為Get
返回空值,兩者之間沒有區別。
對屬性使用NetworkObject
和NetworkBehaviour
的另一種方法是使用NetworkId
和NetworkBehaviourId
值。
透過ID顯式同步這些參照,您可以檢測空值是否:
- 表示顯式空值(0),或;
- 表示一個物件(值>0),但該物件當前在本機不存在(無法解包)。
NetworkId用途示例
C#
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用途示例
C#
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;
}
}
Back to top