Skip to content

Commit e73ddb4

Browse files
fix
This fixes the issue with setting flags on NetworkObjects and the default Everything/All flag causing session owner to be grouped with the rest of the flags. Now all will initially select all flags but the session owner but if the all flag is selected again it toggles to just the SessionOwner flag. This also assures that all root in-scene placed NetworkObjects have the Distributable or SessionOwner flag set (if neither then it defaults to Distributable).
1 parent 711aa02 commit e73ddb4

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

com.unity.netcode.gameobjects/Editor/NetworkObjectEditor.cs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,34 @@ public override void OnInspectorGUI()
114114
{
115115
EditorGUI.BeginChangeCheck();
116116
serializedObject.UpdateIfRequiredOrScript();
117+
var ownershipProperty = serializedObject.FindProperty(nameof(NetworkObject.Ownership));
118+
var sceneObjectProperty = serializedObject.FindProperty(nameof(NetworkObject.IsSceneObject));
119+
var previousOwnership = (NetworkObject.OwnershipStatus)ownershipProperty.intValue;
120+
var allFilter = NetworkObject.OwnershipStatus.RequestRequired | NetworkObject.OwnershipStatus.Transferable | NetworkObject.OwnershipStatus.Distributable;
121+
var hadAll = previousOwnership == allFilter;
122+
var wasNone = previousOwnership == 0;
123+
var hadSessionOwner = ownershipProperty.intValue == (int)NetworkObject.OwnershipStatus.SessionOwner;
117124
DrawPropertiesExcluding(serializedObject, k_HiddenFields);
118-
if (m_NetworkObject.IsOwnershipSessionOwner)
125+
126+
var currentOwnership = (NetworkObject.OwnershipStatus)ownershipProperty.intValue;
127+
if (currentOwnership != previousOwnership)
119128
{
120-
m_NetworkObject.Ownership = NetworkObject.OwnershipStatus.SessionOwner;
129+
var hasSessionOwner = currentOwnership.HasFlag(NetworkObject.OwnershipStatus.SessionOwner);
130+
if (hasSessionOwner)
131+
{
132+
if (ownershipProperty.intValue == -1 && !hadAll)
133+
{
134+
ownershipProperty.intValue = (int)allFilter;
135+
}
136+
else if ((hadAll && !hadSessionOwner) || (!hadAll && !hadSessionOwner))
137+
{
138+
ownershipProperty.intValue = (int)NetworkObject.OwnershipStatus.SessionOwner;
139+
}
140+
else if (hadSessionOwner && hasSessionOwner)
141+
{
142+
ownershipProperty.intValue &= (int)~NetworkObject.OwnershipStatus.SessionOwner;
143+
}
144+
}
121145
}
122146
serializedObject.ApplyModifiedProperties();
123147
EditorGUI.EndChangeCheck();

com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,15 @@ private void CheckForInScenePlaced()
322322

323323
// Default scene migration synchronization to false for in-scene placed NetworkObjects
324324
SceneMigrationSynchronization = false;
325+
326+
// Root In-scene placed NetworkObjects have to either have the SessionOwner or Distributable permission flag set.
327+
if (transform.parent == null)
328+
{
329+
if (!Ownership.HasFlag(OwnershipStatus.SessionOwner) && !Ownership.HasFlag(OwnershipStatus.Distributable))
330+
{
331+
Ownership |= OwnershipStatus.Distributable;
332+
}
333+
}
325334
}
326335
}
327336
#endif // UNITY_EDITOR
@@ -493,6 +502,7 @@ public void DeferDespawn(int tickOffset, bool destroy = true)
493502
/// <see cref="Transferable"/>: When set, a non-owner can obtain ownership immediately (without requesting and as long as it is not locked).
494503
/// <see cref="RequestRequired"/>: When set, a non-owner must request ownership from the owner (will always get locked once ownership is transferred).
495504
/// <see cref="SessionOwner"/>: When set, only the current session owner may have ownership over this object.
505+
/// <see cref="All"/>: Used within the inspector view only. When selected it will set the Distributable, Transferable, and RequestRequired flags or if those flags are already set it will select the SessionOwner flag by itself.
496506
/// </summary>
497507
// Ranges from 1 to 8 bits
498508
[Flags]
@@ -503,6 +513,7 @@ public enum OwnershipStatus
503513
Transferable = 1 << 1,
504514
RequestRequired = 1 << 2,
505515
SessionOwner = 1 << 3,
516+
All = ~0,
506517
}
507518

508519
/// <summary>

0 commit comments

Comments
 (0)