Update FishNet

This commit is contained in:
2026-04-07 03:11:52 +07:00
parent 9675b7b31d
commit ba7513d478
869 changed files with 3675 additions and 2764 deletions
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/ChangedTransformProperties.cs
uploadId: 866910
uploadId: 892096
@@ -15,11 +15,13 @@ namespace FishNet.Object.Editing
private SerializedProperty _initializeOrder;
private SerializedProperty _preventDespawnOnDisconnect;
private SerializedProperty _defaultDespawnType;
private SerializedProperty _useLevelOfDetail;
private SerializedProperty _enablePrediction;
private SerializedProperty _enableStateForwarding;
private SerializedProperty _networkTransform;
private SerializedProperty _predictionType;
private SerializedProperty _localReconcileCorrectionType;
private SerializedProperty _localLevelOfDetailCalculationType;
private SerializedProperty _graphicalObject;
private SerializedProperty _detachGraphicalObject;
private SerializedProperty _ownerSmoothedProperties;
@@ -44,12 +46,14 @@ namespace FishNet.Object.Editing
_initializeOrder = serializedObject.FindProperty(nameof(_initializeOrder));
_preventDespawnOnDisconnect = serializedObject.FindProperty(nameof(_preventDespawnOnDisconnect));
_defaultDespawnType = serializedObject.FindProperty(nameof(_defaultDespawnType));
_useLevelOfDetail = serializedObject.FindProperty(nameof(_useLevelOfDetail));
_enablePrediction = serializedObject.FindProperty(nameof(_enablePrediction));
_enableStateForwarding = serializedObject.FindProperty(nameof(_enableStateForwarding));
_networkTransform = serializedObject.FindProperty(nameof(_networkTransform));
_predictionType = serializedObject.FindProperty(nameof(_predictionType));
_localReconcileCorrectionType = serializedObject.FindProperty(nameof(_localReconcileCorrectionType));
_localLevelOfDetailCalculationType = serializedObject.FindProperty(nameof(_localLevelOfDetailCalculationType));
_graphicalObject = serializedObject.FindProperty(nameof(_graphicalObject));
_detachGraphicalObject = serializedObject.FindProperty(nameof(_detachGraphicalObject));
@@ -97,8 +101,16 @@ namespace FishNet.Object.Editing
EditorGUILayout.PropertyField(_initializeOrder);
EditorGUILayout.PropertyField(_preventDespawnOnDisconnect);
EditorGUILayout.PropertyField(_defaultDespawnType);
}
bool isPlaying = Application.isPlaying;
if (isPlaying)
GUI.enabled = false;
EditorGUILayout.PropertyField(_useLevelOfDetail, new GUIContent("* Use Level of Detail"));
GUI.enabled = true;
}
void ShowPredictionTab()
{
SaveTabIndex();
@@ -106,8 +118,9 @@ namespace FishNet.Object.Editing
if (_enablePrediction.boolValue == true)
{
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(_localLevelOfDetailCalculationType);
EditorGUILayout.PropertyField(_predictionType);
bool isRigidbodyPredictionType = _predictionType.intValue == (int)NetworkObject.PredictionType.Rigidbody2D || _predictionType.intValue == (int)NetworkObject.PredictionType.Rigidbody;
if (isRigidbodyPredictionType)
{
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Editor/NetworkObjectEditor.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Helping/RpcLink.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Helping/RpcType.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Helping/StaticShortcuts.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkBehaviour/Attributes.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkBehaviour/Delegates.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkBehaviour/EmptyNetworkBehaviour.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkBehaviour/NetworkBehaviour.Callbacks.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkBehaviour/NetworkBehaviour.Logging.cs
uploadId: 866910
uploadId: 892096
@@ -19,6 +19,7 @@ using GameKit.Dependencies.Utilities;
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using FishNet.Managing.Observing;
using GameKit.Dependencies.Utilities.Types;
using Unity.Profiling;
using UnityEngine;
@@ -139,7 +140,7 @@ namespace FishNet.Object
/* The checked data is greater than
* what was being searched. This means
* to insert right before it. */
if (lTick > tick)
{
result = DataPlacementResult.InsertMiddle;
@@ -226,7 +227,7 @@ namespace FishNet.Object
/// <remarks>This is only used by prediction.</remarks>
private TransformProperties _lastCheckedTransformProperties;
#endregion
/// <summary>
/// Called when the object is destroyed.
/// </summary>
@@ -422,6 +423,10 @@ namespace FishNet.Object
else
writer = CreateRpc(hash, methodWriter, PacketId.Reconcile, rpcChannel);
#if !UNITY_SERVER
int observersWrittenTo = 0;
#endif
// If state forwarding is not enabled then only send to owner.
if (!stateForwarding)
{
@@ -430,15 +435,22 @@ namespace FishNet.Object
// State forwarding, send to all.
else
{
foreach (NetworkConnection nc in Observers)
nc.WriteState(writer);
{
#if !UNITY_SERVER
observersWrittenTo = Observers.Count;
#endif
//Send to everyone unconditionally when not using LOD.
foreach (NetworkConnection nc in Observers)
nc.WriteState(writer);
}
}
#if !UNITY_SERVER
if (_networkTrafficStatistics != null)
{
int written = stateForwarding ? writer.Length * Observers.Count : writer.Length;
_networkTrafficStatistics.AddInboundPacketIdData(PacketId.Reconcile, GetRpcName(PacketId.Reconcile, hash), written + Managing.Transporting.TransportManager.PACKETID_LENGTH, gameObject, asServer: true);
int writtenBytes = stateForwarding ? writer.Length * observersWrittenTo : writer.Length;
_networkTrafficStatistics.AddOutboundPacketIdData(PacketId.Reconcile, GetRpcName(PacketId.Reconcile, hash), writtenBytes + Managing.Transporting.TransportManager.PACKETID_LENGTH, gameObject, asServer: true);
}
#endif
@@ -897,7 +909,9 @@ namespace FishNet.Object
#else
methodWriter.WriteReplicate<T>(replicatesHistory, offset);
#endif
_transportManagerCache.CheckSetReliableChannel(methodWriter.Length + MAXIMUM_RPC_HEADER_SIZE, ref channel);
channel = _transportManagerCache.GetReliableChannelIfOverMTU(methodWriter.Length + MAXIMUM_RPC_HEADER_SIZE, channel);
PooledWriter writer = CreateRpc(hash, methodWriter, PacketId.Replicate, channel);
#if !UNITY_SERVER
@@ -912,7 +926,7 @@ namespace FishNet.Object
#if !UNITY_SERVER
written = writer.Length;
#endif
NetworkManager.TransportManager.SendToServer((byte)channel, writer.GetArraySegment(), splitLargeMessages: true);
NetworkManager.TransportManager.SendToServer((byte)channel, writer.GetArraySegment());
}
else
{
@@ -929,7 +943,7 @@ namespace FishNet.Object
#if !UNITY_SERVER
written = writer.Length * (Observers.Count - _networkConnectionCache.Count);
#endif
NetworkManager.TransportManager.SendToClients((byte)channel, writer.GetArraySegment(), Observers, _networkConnectionCache, splitLargeMessages: true);
NetworkManager.TransportManager.SendToClients((byte)channel, writer.GetArraySegment(), Observers, _networkConnectionCache);
}
}
@@ -1085,7 +1099,7 @@ namespace FishNet.Object
}
#endif
NetworkManager.TransportManager.SendToClients((byte)channel, writer.GetArraySegment(), Observers, _networkConnectionCache, false);
NetworkManager.TransportManager.SendToClients((byte)channel, writer.GetArraySegment(), Observers, _networkConnectionCache);
methodWriter.StoreLength();
writer.StoreLength();
@@ -1304,10 +1318,6 @@ namespace FishNet.Object
[MakePublic]
internal void Reconcile_Client<T, T2>(ReconcileUserLogicDelegate<T> reconcileDel, RingBuffer<ReplicateDataContainer<T2>> replicatesHistory, RingBuffer<LocalReconcile<T>> reconcilesHistory, T data) where T : IReconcileData where T2 : IReplicateData, new()
{
bool isBehaviourReconciling = IsBehaviourReconciling;
if (!isBehaviourReconciling)
return;
const long unsetHistoryIndex = -1;
long historyIndex = unsetHistoryIndex;
@@ -1341,6 +1351,19 @@ namespace FishNet.Object
uint lrTick = reconcilesHistory[(int)historyIndex].Tick;
if (lrTick != reconcileTick)
historyIndex = unsetHistoryIndex;
//If index is set and behaviour is not reconciling then apply data.
if (!IsBehaviourReconciling && historyIndex != unsetHistoryIndex)
{
LocalReconcile<T> localReconcile = reconcilesHistory[(int)historyIndex];
//Before disposing get the writer and call reconcile reader so it's parsed.
PooledWriter reconcileWritten = localReconcile.Writer;
/* Although this is actually from the local client the datasource is being set to server since server
* is what typically sends reconciles. */
PooledReader reader = ReaderPool.Retrieve(reconcileWritten.GetArraySegment(), _networkObjectCache.NetworkManager, Reader.DataSource.Server);
data = Reconcile_Reader_Local<T>(localReconcile.Tick, reader);
ReaderPool.Store(reader);
}
}
}
@@ -1358,13 +1381,10 @@ namespace FishNet.Object
reconcilesHistory.RemoveRange(true, (int)historyIndex);
}
//If does not have data still then exit method.
//If this behaviour does not have data still then exit method.
if (!IsBehaviourReconciling)
return;
//Set on the networkObject that a reconcile can now occur.
_networkObjectCache.IsObjectReconciling = true;
uint dataTick = data.GetTick();
_lastReconcileTick = dataTick;
@@ -1407,6 +1427,9 @@ namespace FishNet.Object
replicatesHistory.RemoveRange(true, removeCount);
}
//Set on the networkObject that a reconcile can now occur.
_networkObjectCache.IsObjectReconciling = true;
//Call reconcile user logic.
reconcileDel?.Invoke(data, Channel.Reliable);
}
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkBehaviour/NetworkBehaviour.Prediction.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkBehaviour/NetworkBehaviour.QOL.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkBehaviour/NetworkBehaviour.RPCLinks.cs
uploadId: 866910
uploadId: 892096
@@ -113,7 +113,7 @@ namespace FishNet.Object
continue;
tm.SendToClient((byte)Channel.Reliable, bRpc.Writer.GetArraySegment(), conn, true, bRpc.OrderType);
tm.SendToClient((byte)Channel.Reliable, bRpc.Writer.GetArraySegment(), conn, bRpc.OrderType);
}
}
@@ -338,7 +338,7 @@ namespace FishNet.Object
if (!IsSpawnedWithWarning())
return;
_transportManagerCache.CheckSetReliableChannel(methodWriter.Length + MAXIMUM_RPC_HEADER_SIZE, ref channel);
channel = _transportManagerCache.GetReliableChannelIfOverMTU(methodWriter.Length + MAXIMUM_RPC_HEADER_SIZE, channel);
PooledWriter writer = CreateRpc(hash, methodWriter, PacketId.ServerRpc, channel);
@@ -347,7 +347,7 @@ namespace FishNet.Object
_networkTrafficStatistics.AddOutboundPacketIdData(PacketId.ServerRpc, GetRpcName(PacketId.ServerRpc, hash), writer.Length, gameObject, asServer: false);
#endif
_networkObjectCache.NetworkManager.TransportManager.SendToServer((byte)channel, writer.GetArraySegment(), true, orderType);
_networkObjectCache.NetworkManager.TransportManager.SendToServer((byte)channel, writer.GetArraySegment(), orderType);
writer.StoreLength();
}
@@ -364,12 +364,12 @@ namespace FishNet.Object
if (!IsSpawnedWithWarning())
return;
_transportManagerCache.CheckSetReliableChannel(methodWriter.Length + MAXIMUM_RPC_HEADER_SIZE, ref channel);
channel = _transportManagerCache.GetReliableChannelIfOverMTU(methodWriter.Length + MAXIMUM_RPC_HEADER_SIZE, channel);
PooledWriter writer = lCreateRpc(channel);
SetNetworkConnectionCache(excludeServer, excludeOwner);
_networkObjectCache.NetworkManager.TransportManager.SendToClients((byte)channel, writer.GetArraySegment(), _networkObjectCache.Observers, _networkConnectionCache, true, orderType);
_networkObjectCache.NetworkManager.TransportManager.SendToClients((byte)channel, writer.GetArraySegment(), _networkObjectCache.Observers, _networkConnectionCache, orderType);
/* If buffered then dispose of any already buffered
* writers and replace with new one. Writers should
@@ -428,7 +428,7 @@ namespace FishNet.Object
if (!IsSpawnedWithWarning())
return;
_transportManagerCache.CheckSetReliableChannel(methodWriter.Length + MAXIMUM_RPC_HEADER_SIZE, ref channel);
channel = _transportManagerCache.GetReliableChannelIfOverMTU(methodWriter.Length + MAXIMUM_RPC_HEADER_SIZE, channel);
if (validateTarget)
{
@@ -468,7 +468,8 @@ namespace FishNet.Object
_networkTrafficStatistics.AddOutboundPacketIdData(PacketId.TargetRpc, GetRpcName(PacketId.TargetRpc, hash), writer.Length, gameObject, asServer: true);
#endif
_networkObjectCache.NetworkManager.TransportManager.SendToClient((byte)channel, writer.GetArraySegment(), target, true, orderType);
_networkObjectCache.NetworkManager.TransportManager.SendToClient((byte)channel, writer.GetArraySegment(), target, orderType);
writer.Store();
}
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkBehaviour/NetworkBehaviour.RPCs.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkBehaviour/NetworkBehaviour.SyncTypes.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkBehaviour/NetworkBehaviour.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkBehaviour/RpcLinkType.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkBehaviour/SyncTypeWriteType.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.Broadcast.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.Callbacks.cs
uploadId: 866910
uploadId: 892096
@@ -0,0 +1,84 @@
using System;
using System.Collections.Generic;
using FishNet.Connection;
using GameKit.Dependencies.Utilities;
using UnityEngine;
namespace FishNet.Object
{
public partial class NetworkObject : MonoBehaviour
{
/// <summary>
/// Level of detail levels for observers.
/// </summary>
/// <remarks>This collection will be empty of this NetworkObject does not utilize level of detail.</remarks>
internal Dictionary<NetworkConnection, uint> ObserverLevelOfDetailDivisors;
/// <summary>
/// True if level of detail has been initialized, indicating it can be used.
/// </summary>
internal bool ServerIsLevelOfDetailInitialized { get; private set; }
/// <summary>
/// True if LocalLevelOfDetailCalculationType is set to close only.
/// </summary>
internal bool IsLocalReconcileLODCloseObjectsOnly => _localLevelOfDetailCalculationType == LocalReconcileLODCalculationType.CloseObjectsOnly;
/// <summary>
/// How local reconciles are applied when using level of detail, specifically when the server had not sent a reconcile.
/// </summary>
[Tooltip("How local reconciles are applied when using level of detail calculations, specifically when the server had not sent a reconcile.")]
[SerializeField]
private LocalReconcileLODCalculationType _localLevelOfDetailCalculationType = LocalReconcileLODCalculationType.CloseObjectsOnly;
/// <summary>
/// True if to enable level of detail for this object. Level of detail supports prediction objects. This feature must be enabled on the ObserverManager to function.
/// </summary>
internal bool UseLevelOfDetail => _useLevelOfDetail;
[Tooltip("True if to enable level of detail for this object. Level of detail supports prediction objects. This feature must be enabled on the ObserverManager to function.")]
[SerializeField]
private bool _useLevelOfDetail = false;
/// <summary>
/// True to use the same level of detail as the topmost parent NetworkObject. False to use a separate level of detail if nested.
/// </summary>
[Tooltip("True to use the same level of detail as the topmost parent NetworkObject. False to use a separate level of detail if nested.")]
[SerializeField]
private bool _useRootLevelOfDetail = true;
/// <summary>
/// Default level of detail index for new observers.
/// </summary>
internal const byte DEFAULT_LEVEL_OF_DETAIL_INDEX = 1;
/// <summary>
/// Updates the level of detail status based on current conditions.
/// </summary>
private void SetLevelOfDetailUsage()
{
}
/// <summary>
/// Called ObserversActive has changed.
/// </summary>
private void ObserversActiveChanged_LevelOfDetail()
{
}
/// <summary>
/// Clears observers for level of detail.
/// </summary>
private void ClearObserverLevelOfDetail()
{
}
/// <summary>
/// Adds an observer to level of detail if needed.
/// </summary>
/// <remarks>A connection is only added if this object supports level of detail.</remarks>
private void AddObserverLevelOfDetail(NetworkConnection connection)
{
}
/// <summary>
/// Removes an observer from level of detail if needed.
/// </summary>
private void RemoveObserverLevelOfDetail(NetworkConnection connection)
{
}
}
}
@@ -0,0 +1,18 @@
fileFormatVersion: 2
guid: b36f63f24fb6e2f4794576d1acc151af
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.LevelOfDetail.cs
uploadId: 892096
@@ -205,20 +205,76 @@ namespace FishNet.Object
NetworkObserver = NetworkManager.ObserverManager.AddDefaultConditions(this);
}
internal void ClearObservers()
{
int startCount = Observers.Count;
Observers.Clear();
/* Done before ObserversActiveChanged because
* that trickles into storing the LOD collection.
* Realistically, the collection does not need to be
* cleared because when it's stored it would be
* then, but keeping this here for intent. */
ClearObserverLevelOfDetail();
if (startCount > 0)
ObserversActiveChanged();
}
internal bool AddObserver(NetworkConnection connection)
{
int startCount = Observers.Count;
bool added = Observers.Add(connection);
if (added)
{
if (TimeManager != null)
ObserverAddedTick = TimeManager.LocalTick;
if (startCount == 0)
ObserversActiveChanged();
/* Add after ObserversActiveChanged because
* the LOD might not be setup yet otherwise;
* LOD uses hot loading. */
AddObserverLevelOfDetail(connection);
}
return added;
}
/// <summary>
/// Removes a connection from observers for this object returning if the connection was removed.
/// </summary>
/// <param name = "connection"></param>
internal bool RemoveObserver(NetworkConnection connection)
{
RemoveObserverLevelOfDetail(connection);
int startCount = Observers.Count;
bool removed = Observers.Remove(connection);
if (removed)
TryInvokeOnObserversActive(startCount);
//Like with clear, remove before calling ObserversActiveChange.
RemoveObserverLevelOfDetail(connection);
if (removed && startCount == 0)
ObserversActiveChanged();
return removed;
}
/// <summary>
/// Called when observers active has changed.
/// </summary>
private void ObserversActiveChanged()
{
ObserversActiveChanged_LevelOfDetail();
OnObserversActive?.Invoke(this);
}
/// <summary>
/// Adds the connection to observers if conditions are met.
/// </summary>
@@ -232,17 +288,17 @@ namespace FishNet.Object
NetworkManager.LogWarning($"An invalid connection was used when rebuilding observers.");
return ObserverStateChange.Unchanged;
}
// Valid not not active.
if (!connection.IsActive)
{
/* Just remove from observers since connection isn't active
* and return unchanged because nothing should process
* given the connection isnt active. */
Observers.Remove(connection);
RemoveObserver(connection);
return ObserverStateChange.Unchanged;
}
if (IsDeinitializing)
{
/* If object is deinitializing it's either being despawned
@@ -254,36 +310,16 @@ namespace FishNet.Object
// Update hashgrid if needed.
UpdateForNetworkObject(!timedOnly);
int startCount = Observers.Count;
ObserverStateChange osc = NetworkObserver.RebuildObservers(connection, timedOnly);
if (osc == ObserverStateChange.Added)
Observers.Add(connection);
AddObserver(connection);
else if (osc == ObserverStateChange.Removed)
Observers.Remove(connection);
if (osc != ObserverStateChange.Unchanged)
TryInvokeOnObserversActive(startCount);
RemoveObserver(connection);
return osc;
}
/// <summary>
/// Invokes OnObserversActive if observers are now 0 but previously were not, or if was previously 0 but now has observers.
/// </summary>
/// <param name = "startCount"></param>
private void TryInvokeOnObserversActive(int startCount)
{
if (TimeManager != null)
ObserverAddedTick = TimeManager.LocalTick;
if (OnObserversActive != null)
{
if ((Observers.Count > 0 && startCount == 0) || (Observers.Count == 0 && startCount > 0))
OnObserversActive.Invoke(this);
}
}
/// <summary>
/// Resets this object to starting values.
/// </summary>
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.Observers.cs
uploadId: 866910
uploadId: 892096
@@ -31,6 +31,23 @@ namespace FishNet.Object
Rigidbody2D = 2
}
/// <summary>
/// How local reconciles are applied when using level of detail.
/// </summary>
internal enum LocalReconcileLODCalculationType
{
/// <summary>
/// Local reconciles will only be applied on very near objects.
/// </summary>
/// <remarks>This will cause only very near objects to reconcile using local reconcile data.</remarks>
CloseObjectsOnly,
/// <summary>
/// Local reconciles will be applied on any object which the tick fits the Level of detail window.
/// </summary>
/// <remarks>Using this option will result in more objects reconciling when the server does not send reconcile data due to level of detail, but the client thinks it should have it.</remarks>
ObjectsWithinLevelOfDetail,
}
/// <summary>
/// How to correct, or reset a rigidbody transform after a reconcile when the reconcile state is local, and the rigidbody has near nil differences from when the reconcile started.
/// </summary>
@@ -362,7 +379,8 @@ namespace FishNet.Object
if (_graphicalObject == null)
{
NetworkManager.Log($"GraphicalObject is null on {gameObject.name}. This may be intentional, and acceptable, if you are smoothing between ticks yourself. Otherwise consider assigning the GraphicalObject field.");
//Removed per community request; the document has shown to no longer use this field for a hefty duration.
//NetworkManager.Log($"GraphicalObject is null on {gameObject.name}. This may be intentional, and acceptable, if you are smoothing between ticks yourself. Otherwise consider assigning the GraphicalObject field.");
}
else
{
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.Prediction.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.QOL.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.ReferenceIds.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.RpcLinks.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.Serialized.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.SyncTypes.cs
uploadId: 866910
uploadId: 892096
@@ -44,6 +44,7 @@ namespace FishNet.Object
[DefaultExecutionOrder(short.MinValue + 1)]
[DisallowMultipleComponent]
[AddComponentMenu("FishNet/Component/NetworkObject")]
public partial class NetworkObject : MonoBehaviour, IOrderable
{
#region Public.
@@ -416,11 +417,6 @@ namespace FishNet.Object
ResetState(asServer: true);
ResetState(asServer: false);
}
//Client is started and is scene object.
else if (IsClientStarted && IsSceneObject)
{
ResetState(asServer: false);
}
}
private void OnDestroy()
@@ -428,6 +424,7 @@ namespace FishNet.Object
CollectionCaches<NetworkBehaviour>.Store(_predictionBehaviours);
ResettableT2CollectionCaches<Transform, PreReconcilingTransformProperties>.Store(_rigidbodyTransformsPreReconcileProperties);
CollectionCaches<PreReconcilingTransformProperties>.Store(_updatedPreReconcilingTransformProperties);
CollectionCaches<NetworkConnection, uint>.StoreAndDefault(ref ObserverLevelOfDetailDivisors);
SetIsDestroying(DespawnType.Destroy);
@@ -462,7 +459,7 @@ namespace FishNet.Object
if (Owner.IsValid)
Owner.RemoveObject(this);
Observers.Clear();
ClearObservers();
if (NetworkBehaviours.Count > 0)
{
NetworkBehaviour thisNb = NetworkBehaviours[0];
@@ -651,7 +648,13 @@ namespace FishNet.Object
SetOwner(owner);
if (ObjectId != UNSET_OBJECTID_VALUE)
NetworkManager.LogError($"Object was initialized twice without being reset. Object {ToString()}");
{
if (ObjectId != objectId)
{
ServerManager.Objects.ObjectInitializedWithoutDeinitializing(oldId: objectId, this);
ClientManager.Objects.ObjectInitializedWithoutDeinitializing(oldId: objectId, this);
}
}
ObjectId = objectId;
@@ -715,6 +718,7 @@ namespace FishNet.Object
{
if (!CanChangeParent(true))
return;
if (nob == null)
{
UnsetParent();
@@ -730,6 +734,8 @@ namespace FishNet.Object
NetworkBehaviour newParent = nob.NetworkBehaviours[0];
UpdateParent(newParent);
SetLevelOfDetailUsage();
}
/// <summary>
@@ -989,7 +995,7 @@ namespace FishNet.Object
// Iterate all cached transforms and get networkbehaviours.
List<NetworkBehaviour> nbCache = CollectionCaches<NetworkBehaviour>.RetrieveList();
//
//
List<NetworkBehaviour> nbCache2 = CollectionCaches<NetworkBehaviour>.RetrieveList();
for (int i = 0; i < transformCache.Count; i++)
{
@@ -1020,7 +1026,7 @@ namespace FishNet.Object
// Copy to array.
int nbCount = nbCache.Count;
//
//
for (int i = 0; i < nbCount; i++)
{
NetworkBehaviour nb = nbCache[i];
@@ -1141,7 +1147,7 @@ namespace FishNet.Object
SetInitializedStatus(false, asServer);
if (asServer)
Observers.Clear();
ClearObservers();
}
/// <summary>
@@ -1165,7 +1171,7 @@ namespace FishNet.Object
// // If nested then set active state to serialized value.
// if (IsNested)
// gameObject.SetActive(WasActiveDuringEdit);
//
//
SetOwner(NetworkManager.EmptyConnection);
if (NetworkObserver != null)
NetworkObserver.Deinitialize(false);
@@ -1267,7 +1273,7 @@ namespace FishNet.Object
// If sharing then send to all observers.
if (NetworkManager.ServerManager.ShareIds)
{
NetworkManager.TransportManager.SendToClients((byte)Channel.Reliable, writer.GetArraySegment(), this);
NetworkManager.TransportManager.SendToClients((byte)Channel.Reliable, writer.GetArraySegment());
}
// Only sending to old / new.
else
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkObject/NetworkObject.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/NetworkObject/NetworkObjectData.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Prediction/Attributes.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Prediction/Delegates.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Prediction/Interfaces.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Prediction/LocalReconcile.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Prediction/MoveRates.cs
uploadId: 866910
uploadId: 892096
@@ -105,7 +105,9 @@ namespace FishNet.Object.Prediction
public static void WritePredictionRigidbody(this Writer w, PredictionRigidbody pr)
{
w.Write(pr.Rigidbody.GetState(pr.RotationPacking));
w.WriteList(pr.GetPendingForces());
/* This used to write pr.GetPendingForces() but is no longer needed, assuming the user properly
* reconciles everything that modifies the predictionRigidbody. */
w.WriteList<PredictionRigidbody.EntryData>(null);
}
[DefaultReader]
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Prediction/PredictionRigidbody.cs
uploadId: 866910
uploadId: 892096
@@ -90,7 +90,9 @@ namespace FishNet.Object.Prediction
public static void WritePredictionRigidbody2D(this Writer w, PredictionRigidbody2D pr)
{
w.Write(pr.Rigidbody2D.GetState(pr.RotationPacking));
w.WriteList(pr.GetPendingForces());
/* This used to write pr.GetPendingForces() but is no longer needed, assuming the user properly
* reconciles everything that modifies the predictionRigidbody. */
w.WriteList<PredictionRigidbody2D.EntryData>(null);
}
public static PredictionRigidbody2D ReadPredictionRigidbody2D(this Reader r)
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Prediction/PredictionRigidbody2D.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Prediction/ReplicateDataContainer.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Prediction/ReplicateState.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/ICustomSync.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/InterpolatedSyncVars.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/MissingObjectPacketLength.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/ReadPermissions.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/SyncBase.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/SyncDictionary.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/SyncDictionaryOperation.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/SyncHashSetOperation.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/SyncHashset.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/SyncList.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/SyncListOperation.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/SyncStopwatch.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/SyncStopwatchOperation.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/SyncTimer.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/SyncTimerOperation.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/SyncTypeSetting.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/SyncTypeWriteFlag.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/SyncVar.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/Synchronizing/WritePermissions.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/TransformProperties.cs
uploadId: 866910
uploadId: 892096
@@ -13,6 +13,6 @@ AssetOrigin:
serializedVersion: 1
productId: 207815
packageName: 'FishNet: Networking Evolved'
packageVersion: 4.6.22R
packageVersion: 4.7.1R
assetPath: Assets/FishNet/Runtime/Object/TransformPropertiesFlag.cs
uploadId: 866910
uploadId: 892096