Skip to content

Commit 06bc67e

Browse files
committed
fix: Avoid throwing exception when using NetworkList without a NetworkManager
1 parent 5f89b96 commit 06bc67e

File tree

4 files changed

+23
-11
lines changed

4 files changed

+23
-11
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
1313

1414
### Fixed
1515

16+
- Fixed `NullReferenceException` on `NetworkList` when used without a NetworkManager in scene. (#3503)
1617
- Fixed issue where `NetworkClient` could persist some settings if re-using the same `NetworkManager` instance. (#3491)
1718
- Fixed issue where a pooled `NetworkObject` was not resetting the internal latest parent property when despawned. (#3491)
1819
- Fixed issue where the initial client synchronization pre-serialization process was not excluding spawned `NetworkObject` instances that already had pending visibility for the client being synchronized. (#3488)

com.unity.netcode.gameobjects/Runtime/NetworkVariable/Collections/NetworkList.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ public IEnumerator<T> GetEnumerator()
428428
public void Add(T item)
429429
{
430430
// check write permissions
431-
if (!CanClientWrite(m_NetworkManager.LocalClientId))
431+
if (LocalClientCannotWrite())
432432
{
433433
LogWritePermissionError();
434434
return;
@@ -455,7 +455,7 @@ public void Add(T item)
455455
public void Clear()
456456
{
457457
// check write permissions
458-
if (!CanClientWrite(m_NetworkManager.LocalClientId))
458+
if (LocalClientCannotWrite())
459459
{
460460
LogWritePermissionError();
461461
return;
@@ -493,7 +493,7 @@ public bool Contains(T item)
493493
public bool Remove(T item)
494494
{
495495
// check write permissions
496-
if (!CanClientWrite(m_NetworkManager.LocalClientId))
496+
if (LocalClientCannotWrite())
497497
{
498498
LogWritePermissionError();
499499
return false;
@@ -542,7 +542,7 @@ public int IndexOf(T item)
542542
public void Insert(int index, T item)
543543
{
544544
// check write permissions
545-
if (!CanClientWrite(m_NetworkManager.LocalClientId))
545+
if (LocalClientCannotWrite())
546546
{
547547
LogWritePermissionError();
548548
return;
@@ -578,7 +578,7 @@ public void Insert(int index, T item)
578578
public void RemoveAt(int index)
579579
{
580580
// check write permissions
581-
if (!CanClientWrite(m_NetworkManager.LocalClientId))
581+
if (LocalClientCannotWrite())
582582
{
583583
throw new InvalidOperationException("Client is not allowed to write to this NetworkList");
584584
}
@@ -610,7 +610,7 @@ public T this[int index]
610610
set
611611
{
612612
// check write permissions
613-
if (!CanClientWrite(m_NetworkManager.LocalClientId))
613+
if (LocalClientCannotWrite())
614614
{
615615
LogWritePermissionError();
616616
return;

com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariable.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public virtual T Value
128128
get => m_InternalValue;
129129
set
130130
{
131-
if (m_NetworkManager && !CanClientWrite(m_NetworkManager.LocalClientId))
131+
if (LocalClientCannotWrite())
132132
{
133133
LogWritePermissionError();
134134
return;
@@ -162,7 +162,7 @@ public bool CheckDirtyState(bool forceCheck = false)
162162
var isDirty = base.IsDirty();
163163

164164
// A client without permissions invoking this method should only check to assure the current value is equal to the last known current value
165-
if (m_NetworkManager && !CanClientWrite(m_NetworkManager.LocalClientId))
165+
if (LocalClientCannotWrite())
166166
{
167167
// If modifications are detected, then revert back to the last known current value
168168
if (!NetworkVariableSerialization<T>.AreEqual(ref m_InternalValue, ref m_InternalOriginalValue))
@@ -245,7 +245,7 @@ public override bool IsDirty()
245245
{
246246
// If the client does not have write permissions but the internal value is determined to be locally modified and we are applying updates, then we should revert
247247
// to the original collection value prior to applying updates (primarily for collections).
248-
if (!NetworkUpdaterCheck && m_NetworkManager && !CanClientWrite(m_NetworkManager.LocalClientId) && !NetworkVariableSerialization<T>.AreEqual(ref m_InternalValue, ref m_InternalOriginalValue))
248+
if (!NetworkUpdaterCheck && LocalClientCannotWrite() && !NetworkVariableSerialization<T>.AreEqual(ref m_InternalValue, ref m_InternalOriginalValue))
249249
{
250250
NetworkVariableSerialization<T>.Duplicate(m_InternalOriginalValue, ref m_InternalValue);
251251
return true;
@@ -307,7 +307,7 @@ public override void ReadDelta(FastBufferReader reader, bool keepDirtyDelta)
307307
{
308308
// If the client does not have write permissions but the internal value is determined to be locally modified and we are applying updates, then we should revert
309309
// to the original collection value prior to applying updates (primarily for collections).
310-
if (m_NetworkManager && !CanClientWrite(m_NetworkManager.LocalClientId) && !NetworkVariableSerialization<T>.AreEqual(ref m_InternalOriginalValue, ref m_InternalValue))
310+
if (LocalClientCannotWrite() && !NetworkVariableSerialization<T>.AreEqual(ref m_InternalOriginalValue, ref m_InternalValue))
311311
{
312312
NetworkVariableSerialization<T>.Duplicate(m_InternalOriginalValue, ref m_InternalValue);
313313
}
@@ -349,7 +349,7 @@ public override void ReadField(FastBufferReader reader)
349349
{
350350
// If the client does not have write permissions but the internal value is determined to be locally modified and we are applying updates, then we should revert
351351
// to the original collection value prior to applying updates (primarily for collections).
352-
if (m_NetworkManager && !CanClientWrite(m_NetworkManager.LocalClientId) && !NetworkVariableSerialization<T>.AreEqual(ref m_InternalOriginalValue, ref m_InternalValue))
352+
if (LocalClientCannotWrite() && !NetworkVariableSerialization<T>.AreEqual(ref m_InternalOriginalValue, ref m_InternalValue))
353353
{
354354
NetworkVariableSerialization<T>.Duplicate(m_InternalOriginalValue, ref m_InternalValue);
355355
}

com.unity.netcode.gameobjects/Runtime/NetworkVariable/NetworkVariableBase.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Runtime.CompilerServices;
23
using UnityEngine;
34

45
namespace Unity.Netcode
@@ -381,6 +382,16 @@ public bool CanClientWrite(ulong clientId)
381382
}
382383
}
383384

385+
/// <summary>
386+
/// Catches if the current <see cref="NetworkManager.LocalClientId"/> is not valid to write to this variable.
387+
/// </summary>
388+
/// <returns>false if the current <see cref="NetworkManager.LocalClientId"/> can write to this variable, true otherwise</returns>
389+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
390+
internal bool LocalClientCannotWrite()
391+
{
392+
return m_NetworkManager && !CanClientWrite(m_NetworkManager.LocalClientId);
393+
}
394+
384395
/// <summary>
385396
/// Returns the ClientId of the owning client
386397
/// </summary>

0 commit comments

Comments
 (0)