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/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