com.unity.netcode.gameobjects@2.0.0-exp.4
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Additional documentation and release notes are available at [Multiplayer Documentation](https://docs-multiplayer.unity3d.com). ## [2.0.0-exp.4] - 2024-05-31 ### Added - Added `NetworkRigidbodyBase.AttachToFixedJoint` and `NetworkRigidbodyBase.DetachFromFixedJoint` to replace parenting for rigid bodies that have `NetworkRigidbodyBase.UseRigidBodyForMotion` enabled. (#2933) - Added `NetworkBehaviour.OnNetworkPreSpawn` and `NetworkBehaviour.OnNetworkPostSpawn` methods that provide the ability to handle pre and post spawning actions during the `NetworkObject` spawn sequence. (#2912) - Added a client-side only `NetworkBehaviour.OnNetworkSessionSynchronized` convenience method that is invoked on all `NetworkBehaviour`s after a newly joined client has finished synchronizing with the network session in progress. (#2912) - Added `NetworkBehaviour.OnInSceneObjectsSpawned` convenience method that is invoked when all in-scene `NetworkObject`s have been spawned after a scene has been loaded or upon a host or server starting. (#2912) ### Fixed - Fixed issue where non-authoritative rigid bodies with `NetworkRigidbodyBase.UseRigidBodyForMotion` enabled would constantly log errors about the renderTime being before `StartTimeConsumed`. (#2933) - Fixed issue where in-scene placed NetworkObjects could be destroyed if a client disconnects early and/or before approval. (#2924) - Fixed issue where a `NetworkObject` component's associated `NetworkBehaviour` components would not be detected if scene loading is disabled in the editor and the currently loaded scene has in-scene placed `NetworkObject`s. (#2912) - Fixed issue where an in-scene placed `NetworkObject` with `NetworkTransform` that is also parented under a `GameObject` would not properly synchronize when the parent `GameObject` had a world space position other than 0,0,0. (#2898) ### Changed - Change all the access modifiers of test class from Public to Internal (#2930) - Changed messages are now sorted by enum values as opposed to ordinally sorting the messages by their type name. (#2929) - Changed `NetworkClient.SessionModeTypes` to `NetworkClient.NetworkTopologyTypes`. (#2875) - Changed `NetworkClient.SessionModeType` to `NetworkClient.NetworkTopologyType`. (#2875) - Changed `NetworkConfig.SessionMode` to `NeworkConfig.NetworkTopology`. (#2875)
This commit is contained in:
@@ -2,6 +2,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using Unity.Netcode.Components;
|
||||
#if UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
#if UNITY_2021_2_OR_NEWER
|
||||
@@ -14,6 +15,7 @@ using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
|
||||
|
||||
namespace Unity.Netcode
|
||||
{
|
||||
/// <summary>
|
||||
@@ -55,6 +57,34 @@ namespace Unity.Netcode
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// All <see cref="NetworkTransform"></see> component instances associated with a <see cref="NetworkObject"/> component instance.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// When parented, all child <see cref="NetworkTransform"/> component instances under a <see cref="NetworkObject"/> component instance that do not have
|
||||
/// another <see cref="NetworkObject"/> component instance will be associated with the initial component instance. This list does not contain any parented
|
||||
/// children <see cref="NetworkObject"/> instances with one or more <see cref="NetworkTransform"/> component instance(s).
|
||||
/// </remarks>
|
||||
public List<NetworkTransform> NetworkTransforms { get; private set; }
|
||||
|
||||
#if COM_UNITY_MODULES_PHYSICS
|
||||
/// <summary>
|
||||
/// All <see cref="NetworkRigidbodyBase"></see> component instances associated with a <see cref="NetworkObject"/> component instance.
|
||||
/// NOTE: This is only available if a physics package is included. If not, then this will not be available!
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// When parented, all child <see cref="NetworkRigidbodyBase"/> component instances under a <see cref="NetworkObject"/> component instance that do not have
|
||||
/// another <see cref="NetworkObject"/> component instance will be associated with the initial component instance. This list does not contain any parented
|
||||
/// child <see cref="NetworkObject"/> instances with one or more <see cref="NetworkTransform"/> component instance(s).
|
||||
/// </remarks>
|
||||
public List<NetworkRigidbodyBase> NetworkRigidbodies { get; private set; }
|
||||
#endif
|
||||
/// <summary>
|
||||
/// The current parent <see cref="NetworkObject"/> component instance to this <see cref="NetworkObject"/> component instance. When there is no parent then
|
||||
/// this will be <see cref="null"/>.
|
||||
/// </summary>
|
||||
public NetworkObject CurrentParent { get; private set; }
|
||||
|
||||
#if UNITY_EDITOR
|
||||
private const string k_GlobalIdTemplate = "GlobalObjectId_V1-{0}-{1}-{2}-{3}";
|
||||
|
||||
@@ -398,8 +428,11 @@ namespace Unity.Netcode
|
||||
|
||||
/// <summary>
|
||||
/// Determines whether a NetworkObject can be distributed to other clients during
|
||||
/// a <see cref="SessionModeTypes.DistributedAuthority"/> session.
|
||||
/// a <see cref="NetworkTopologyTypes.DistributedAuthority"/> session.
|
||||
/// </summary>
|
||||
#if !MULTIPLAYER_SDK_INSTALLED
|
||||
[HideInInspector]
|
||||
#endif
|
||||
[SerializeField]
|
||||
internal OwnershipStatus Ownership = OwnershipStatus.Distributable;
|
||||
|
||||
@@ -1894,7 +1927,6 @@ namespace Unity.Netcode
|
||||
|
||||
internal bool InternalTrySetParent(NetworkObject parent, bool worldPositionStays = true)
|
||||
{
|
||||
|
||||
if (parent != null && (IsSpawned ^ parent.IsSpawned))
|
||||
{
|
||||
if (NetworkManager != null && !NetworkManager.ShutdownInProgress)
|
||||
@@ -1907,10 +1939,12 @@ namespace Unity.Netcode
|
||||
|
||||
if (parent == null)
|
||||
{
|
||||
CurrentParent = null;
|
||||
transform.SetParent(null, worldPositionStays);
|
||||
}
|
||||
else
|
||||
{
|
||||
CurrentParent = parent;
|
||||
transform.SetParent(parent.transform, worldPositionStays);
|
||||
}
|
||||
|
||||
@@ -2209,6 +2243,18 @@ namespace Unity.Netcode
|
||||
}
|
||||
}
|
||||
|
||||
internal void InvokeBehaviourNetworkPreSpawn()
|
||||
{
|
||||
var networkManager = NetworkManager;
|
||||
for (int i = 0; i < ChildNetworkBehaviours.Count; i++)
|
||||
{
|
||||
if (ChildNetworkBehaviours[i].gameObject.activeInHierarchy)
|
||||
{
|
||||
ChildNetworkBehaviours[i].NetworkPreSpawn(ref networkManager);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal void InvokeBehaviourNetworkSpawn()
|
||||
{
|
||||
NetworkManager.SpawnManager.UpdateOwnershipTable(this, OwnerClientId);
|
||||
@@ -2238,6 +2284,42 @@ namespace Unity.Netcode
|
||||
}
|
||||
}
|
||||
|
||||
internal void InvokeBehaviourNetworkPostSpawn()
|
||||
{
|
||||
for (int i = 0; i < ChildNetworkBehaviours.Count; i++)
|
||||
{
|
||||
if (ChildNetworkBehaviours[i].gameObject.activeInHierarchy)
|
||||
{
|
||||
ChildNetworkBehaviours[i].NetworkPostSpawn();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
internal void InternalNetworkSessionSynchronized()
|
||||
{
|
||||
for (int i = 0; i < ChildNetworkBehaviours.Count; i++)
|
||||
{
|
||||
if (ChildNetworkBehaviours[i].gameObject.activeInHierarchy)
|
||||
{
|
||||
ChildNetworkBehaviours[i].NetworkSessionSynchronized();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal void InternalInSceneNetworkObjectsSpawned()
|
||||
{
|
||||
for (int i = 0; i < ChildNetworkBehaviours.Count; i++)
|
||||
{
|
||||
if (ChildNetworkBehaviours[i].gameObject.activeInHierarchy)
|
||||
{
|
||||
ChildNetworkBehaviours[i].InSceneNetworkObjectsSpawned();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
internal void InvokeBehaviourNetworkDespawn()
|
||||
{
|
||||
NetworkManager.SpawnManager.UpdateOwnershipTable(this, OwnerClientId, true);
|
||||
@@ -2271,6 +2353,25 @@ namespace Unity.Netcode
|
||||
if (networkBehaviours[i].NetworkObject == this)
|
||||
{
|
||||
m_ChildNetworkBehaviours.Add(networkBehaviours[i]);
|
||||
var type = networkBehaviours[i].GetType();
|
||||
if (type.IsInstanceOfType(typeof(NetworkTransform)) || type.IsSubclassOf(typeof(NetworkTransform)))
|
||||
{
|
||||
if (NetworkTransforms == null)
|
||||
{
|
||||
NetworkTransforms = new List<NetworkTransform>();
|
||||
}
|
||||
NetworkTransforms.Add(networkBehaviours[i] as NetworkTransform);
|
||||
}
|
||||
#if COM_UNITY_MODULES_PHYSICS
|
||||
else if (type.IsSubclassOf(typeof(NetworkRigidbodyBase)))
|
||||
{
|
||||
if (NetworkRigidbodies == null)
|
||||
{
|
||||
NetworkRigidbodies = new List<NetworkRigidbodyBase>();
|
||||
}
|
||||
NetworkRigidbodies.Add(networkBehaviours[i] as NetworkRigidbodyBase);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2862,6 +2963,9 @@ namespace Unity.Netcode
|
||||
// in order to be able to determine which NetworkVariables the client will be allowed to read.
|
||||
networkObject.OwnerClientId = sceneObject.OwnerClientId;
|
||||
|
||||
// Special Case: Invoke NetworkBehaviour.OnPreSpawn methods here before SynchronizeNetworkBehaviours
|
||||
networkObject.InvokeBehaviourNetworkPreSpawn();
|
||||
|
||||
// Synchronize NetworkBehaviours
|
||||
var bufferSerializer = new BufferSerializer<BufferSerializerReader>(new BufferSerializerReader(reader));
|
||||
networkObject.SynchronizeNetworkBehaviours(ref bufferSerializer, networkManager.LocalClientId);
|
||||
@@ -3051,6 +3155,11 @@ namespace Unity.Netcode
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
m_ChildNetworkBehaviours = null;
|
||||
NetworkTransforms?.Clear();
|
||||
#if COM_UNITY_MODULES_PHYSICS
|
||||
NetworkRigidbodies?.Clear();
|
||||
#endif
|
||||
SetCachedParent(transform.parent);
|
||||
SceneOrigin = gameObject.scene;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user