Fusion 네트워크 오브젝트 타입
개요
NetworkObject
와 NetworkBehaviour
참조는 NetworkBehaviour
의 Networked 속성으로 사용할 수 있습니다.
(참고: INetworkStruct
에서는 사용할 수 없습니다)
내부적으로, 이러한 Networked NetworkObject
와 NetworkBehaviour
참조는 각각 NetworkId
와 NetworkBehaviourId
값으로 변환됩니다.
ILWeaver가 생성한 Set
메소드는 참조를 해당 Id로 감싸서 네트워크를 통해 전송하며,
Get
메소드는 해당 Id를 Runner.TryGetObject()
및 Runner.TryGetBehaviour()
메소드를 통해 다시 참조로 풀어냅니다.
C#
[Networked] public NetworkObject MyNetworkObject { get; set; }
[Networked] public CustomNetworkBehaviour MyNetworkBehaviour { get; set; }
이 자동화 기능은 편리하지만, 다음과 같은 의미도 내포합니다:
- 명시적인 null 값과
- unwrap 실패
이 둘 모두 Get
에서 null을 반환하게 되어, 두 상황을 구분할 수 없습니다.
NetworkObject
와 NetworkBehaviour
대신,
속성에 NetworkId
와 NetworkBehaviourId
를 명시적으로 사용하는 방법도 있습니다.
Id로 직접 참조를 동기화하면 null 값이 다음 중 어느 것인지를 감지할 수 있습니다:
- 값이 0이면 명시적인 null
- 값이 0보다 크지만 로컬에서 해당 오브젝트가 존재하지 않을 경우 (unwrap 실패)
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