com.unity.netcode.gameobjects@2.0.0-pre.1
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-pre.1] - 2024-06-17 ### Added - Added event `NetworkManager.OnSessionOwnerPromoted` that is invoked when a new session owner promotion occurs. (#2948) - Added `NetworkRigidBodyBase.GetLinearVelocity` and `NetworkRigidBodyBase.SetLinearVelocity` convenience/helper methods. (#2948) - Added `NetworkRigidBodyBase.GetAngularVelocity` and `NetworkRigidBodyBase.SetAngularVelocity` convenience/helper methods. (#2948) ### Fixed - Fixed issue when `NetworkTransform` half float precision is enabled and ownership changes the current base position was not being synchronized. (#2948) - Fixed issue where `OnClientConnected` not being invoked on the session owner when connecting to a new distributed authority session. (#2948) - Fixed issue where Rigidbody micro-motion (i.e. relatively small velocities) would result in non-authority instances slightly stuttering as the body would come to a rest (i.e. no motion). Now, the threshold value can increase at higher velocities and can decrease slightly below the provided threshold to account for this. (#2948) ### Changed - Changed the client's owned objects is now returned (`NetworkClient` and `NetworkSpawnManager`) as an array as opposed to a list for performance purposes. (#2948) - Changed `NetworkTransfrom.TryCommitTransformToServer` to be internal as it will be removed by the final 2.0.0 release. (#2948) - Changed `NetworkTransformEditor.OnEnable` to a virtual method to be able to customize a `NetworkTransform` derived class by creating a derived editor control from `NetworkTransformEditor`. (#2948)
This commit is contained in:
@@ -243,6 +243,13 @@ namespace Unity.Netcode
|
||||
// Spawn any in-scene placed NetworkObjects
|
||||
networkManager.SpawnManager.ServerSpawnSceneObjectsOnStartSweep();
|
||||
|
||||
// With scene management enabled and since the session owner doesn't send a Synchronize scene event synchronize itself,
|
||||
// we need to notify the session owner that all in-scnee placed NetworkObjects are spawned at this time.
|
||||
foreach (var networkObject in networkManager.SpawnManager.SpawnedObjectsList)
|
||||
{
|
||||
networkObject.InternalInSceneNetworkObjectsSpawned();
|
||||
}
|
||||
|
||||
// Spawn the local player of the session owner
|
||||
if (networkManager.AutoSpawnPlayerPrefabClientSide)
|
||||
{
|
||||
@@ -251,6 +258,17 @@ namespace Unity.Netcode
|
||||
|
||||
// Synchronize the service with the initial session owner's loaded scenes and spawned objects
|
||||
networkManager.SceneManager.SynchronizeNetworkObjects(NetworkManager.ServerClientId);
|
||||
|
||||
// With scene management enabled and since the session owner doesn't send a Synchronize scene event synchronize itself,
|
||||
// we need to notify the session owner that everything should be synchronized/spawned at this time.
|
||||
foreach (var networkObject in networkManager.SpawnManager.SpawnedObjectsList)
|
||||
{
|
||||
networkObject.InternalNetworkSessionSynchronized();
|
||||
}
|
||||
|
||||
// When scene management is enabled and since the session owner is synchronizing the service (i.e. acting like host),
|
||||
// we need to locallyh invoke the OnClientConnected callback at this point in time.
|
||||
networkManager.ConnectionManager.InvokeOnClientConnectedCallback(OwnerClientId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,8 @@ namespace Unity.Netcode
|
||||
internal NetworkTransform.NetworkTransformState State;
|
||||
private FastBufferReader m_CurrentReader;
|
||||
|
||||
internal int BytesWritten;
|
||||
|
||||
private unsafe void CopyPayload(ref FastBufferWriter writer)
|
||||
{
|
||||
writer.WriteBytesSafe(m_CurrentReader.GetUnsafePtrAtCurrentPosition(), m_CurrentReader.Length - m_CurrentReader.Position);
|
||||
@@ -30,7 +32,7 @@ namespace Unity.Netcode
|
||||
}
|
||||
else
|
||||
{
|
||||
NetworkTransform.SerializeMessage(writer, targetVersion);
|
||||
BytesWritten = NetworkTransform.SerializeMessage(writer, targetVersion);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,6 +77,7 @@ namespace Unity.Netcode
|
||||
ownerAuthoritativeServerSide = !isServerAuthoritative && networkManager.IsServer;
|
||||
|
||||
reader.ReadNetworkSerializableInPlace(ref NetworkTransform.InboundState);
|
||||
NetworkTransform.InboundState.LastSerializedSize = reader.Position - currentPosition;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -34,6 +34,9 @@ namespace Unity.Netcode
|
||||
internal class NetworkMessageManager : IDisposable
|
||||
{
|
||||
public bool StopProcessing = false;
|
||||
private static Type s_ConnectionApprovedType = typeof(ConnectionApprovedMessage);
|
||||
private static Type s_ConnectionRequestType = typeof(ConnectionRequestMessage);
|
||||
private static Type s_DisconnectReasonType = typeof(DisconnectReasonMessage);
|
||||
|
||||
private struct ReceiveQueueItem
|
||||
{
|
||||
@@ -524,6 +527,7 @@ namespace Unity.Netcode
|
||||
return new T().Version;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
internal int GetMessageVersion(Type type, ulong clientId, bool forReceive = false)
|
||||
{
|
||||
if (!m_PerClientMessageVersions.TryGetValue(clientId, out var versionMap))
|
||||
@@ -551,16 +555,20 @@ namespace Unity.Netcode
|
||||
return messageVersion;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void ReceiveMessage<T>(FastBufferReader reader, ref NetworkContext context, NetworkMessageManager manager) where T : INetworkMessage, new()
|
||||
{
|
||||
var messageType = typeof(T);
|
||||
var message = new T();
|
||||
var messageVersion = 0;
|
||||
|
||||
// Special cases because these are the messages that carry the version info - thus the version info isn't
|
||||
// populated yet when we get these. The first part of these messages always has to be the version data
|
||||
// and can't change.
|
||||
if (typeof(T) != typeof(ConnectionRequestMessage) && typeof(T) != typeof(ConnectionApprovedMessage) && typeof(T) != typeof(DisconnectReasonMessage) && context.SenderId != manager.m_LocalClientId)
|
||||
if (messageType != s_ConnectionRequestType && messageType != s_ConnectionApprovedType && messageType != s_DisconnectReasonType && context.SenderId != manager.m_LocalClientId)
|
||||
{
|
||||
messageVersion = manager.GetMessageVersion(typeof(T), context.SenderId, true);
|
||||
messageVersion = manager.GetMessageVersion(messageType, context.SenderId, true);
|
||||
if (messageVersion < 0)
|
||||
{
|
||||
return;
|
||||
@@ -612,7 +620,7 @@ namespace Unity.Netcode
|
||||
var messageVersion = 0;
|
||||
// Special case because this is the message that carries the version info - thus the version info isn't populated yet when we get this.
|
||||
// The first part of this message always has to be the version data and can't change.
|
||||
if (typeof(TMessageType) != typeof(ConnectionRequestMessage))
|
||||
if (typeof(TMessageType) != s_ConnectionRequestType)
|
||||
{
|
||||
messageVersion = GetMessageVersion(typeof(TMessageType), clientIds[i]);
|
||||
if (messageVersion < 0)
|
||||
@@ -666,7 +674,7 @@ namespace Unity.Netcode
|
||||
|
||||
// Special case because this is the message that carries the version info - thus the version info isn't populated yet when we get this.
|
||||
// The first part of this message always has to be the version data and can't change.
|
||||
if (typeof(TMessageType) != typeof(ConnectionRequestMessage))
|
||||
if (typeof(TMessageType) != s_ConnectionRequestType)
|
||||
{
|
||||
var messageVersion = GetMessageVersion(typeof(TMessageType), clientIds[i]);
|
||||
if (messageVersion < 0)
|
||||
@@ -746,7 +754,7 @@ namespace Unity.Netcode
|
||||
// Special case because this is the message that carries the version info - thus the version info isn't
|
||||
// populated yet when we get this. The first part of this message always has to be the version data
|
||||
// and can't change.
|
||||
if (typeof(TMessageType) != typeof(ConnectionRequestMessage))
|
||||
if (typeof(TMessageType) != s_ConnectionRequestType)
|
||||
{
|
||||
messageVersion = GetMessageVersion(typeof(TMessageType), clientId);
|
||||
if (messageVersion < 0)
|
||||
|
||||
@@ -4,23 +4,37 @@ namespace Unity.Netcode
|
||||
{
|
||||
private NotServerRpcTarget m_NotServerRpcTarget;
|
||||
private ServerRpcTarget m_ServerRpcTarget;
|
||||
private NotAuthorityRpcTarget m_NotAuthorityRpcTarget;
|
||||
private AuthorityRpcTarget m_AuthorityRpcTarget;
|
||||
|
||||
public override void Dispose()
|
||||
{
|
||||
m_NotServerRpcTarget.Dispose();
|
||||
m_ServerRpcTarget.Dispose();
|
||||
m_NotAuthorityRpcTarget.Dispose();
|
||||
m_AuthorityRpcTarget.Dispose();
|
||||
}
|
||||
|
||||
internal override void Send(NetworkBehaviour behaviour, ref RpcMessage message, NetworkDelivery delivery, RpcParams rpcParams)
|
||||
{
|
||||
m_NotServerRpcTarget.Send(behaviour, ref message, delivery, rpcParams);
|
||||
m_ServerRpcTarget.Send(behaviour, ref message, delivery, rpcParams);
|
||||
if (NetworkManager.IsDistributedAuthority)
|
||||
{
|
||||
m_NotAuthorityRpcTarget.Send(behaviour, ref message, delivery, rpcParams);
|
||||
m_AuthorityRpcTarget.Send(behaviour, ref message, delivery, rpcParams);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_NotServerRpcTarget.Send(behaviour, ref message, delivery, rpcParams);
|
||||
m_ServerRpcTarget.Send(behaviour, ref message, delivery, rpcParams);
|
||||
}
|
||||
}
|
||||
|
||||
internal EveryoneRpcTarget(NetworkManager manager) : base(manager)
|
||||
{
|
||||
m_NotServerRpcTarget = new NotServerRpcTarget(manager);
|
||||
m_ServerRpcTarget = new ServerRpcTarget(manager);
|
||||
m_NotAuthorityRpcTarget = new NotAuthorityRpcTarget(manager);
|
||||
m_AuthorityRpcTarget = new AuthorityRpcTarget(manager);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user