Update FishNet
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user