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)
120 lines
3.9 KiB
C#
120 lines
3.9 KiB
C#
using UnityEngine;
|
|
|
|
namespace Unity.Netcode
|
|
{
|
|
|
|
/// <summary>
|
|
/// A NetworkClient
|
|
/// </summary>
|
|
public class NetworkClient
|
|
{
|
|
/// <summary>
|
|
/// Returns true if the session instance is considered a server
|
|
/// </summary>
|
|
internal bool IsServer { get; set; }
|
|
|
|
/// <summary>
|
|
/// Returns true if the session instance is considered a client
|
|
/// </summary>
|
|
internal bool IsClient { get; set; }
|
|
|
|
/// <summary>
|
|
/// Returns true if the session instance is considered a host
|
|
/// </summary>
|
|
internal bool IsHost => IsClient && IsServer;
|
|
|
|
/// <summary>
|
|
/// When true, the client is connected, approved, and synchronized with
|
|
/// the server.
|
|
/// </summary>
|
|
internal bool IsConnected { get; set; }
|
|
|
|
/// <summary>
|
|
/// Is true when the client has been approved.
|
|
/// </summary>
|
|
internal bool IsApproved { get; set; }
|
|
|
|
public NetworkTopologyTypes NetworkTopologyType { get; internal set; }
|
|
|
|
public bool DAHost { get; internal set; }
|
|
|
|
/// <summary>
|
|
/// Is true when the client has been assigned session ownership in distributed authority mode
|
|
/// </summary>
|
|
public bool IsSessionOwner { get; internal set; }
|
|
|
|
/// <summary>
|
|
/// The ClientId of the NetworkClient
|
|
/// </summary>
|
|
public ulong ClientId;
|
|
|
|
/// <summary>
|
|
/// The PlayerObject of the Client
|
|
/// </summary>
|
|
public NetworkObject PlayerObject;
|
|
|
|
/// <summary>
|
|
/// The NetworkObject's owned by this client instance
|
|
/// </summary>
|
|
public NetworkObject[] OwnedObjects => IsConnected ? SpawnManager.GetClientOwnedObjects(ClientId) : new NetworkObject[] { };
|
|
|
|
internal NetworkSpawnManager SpawnManager { get; private set; }
|
|
|
|
internal bool SetRole(bool isServer, bool isClient, NetworkManager networkManager = null)
|
|
{
|
|
ResetClient(isServer, isClient);
|
|
|
|
IsServer = isServer;
|
|
IsClient = isClient;
|
|
|
|
if (networkManager != null)
|
|
{
|
|
SpawnManager = networkManager.SpawnManager;
|
|
NetworkTopologyType = networkManager.NetworkConfig.NetworkTopology;
|
|
|
|
if (NetworkTopologyType == NetworkTopologyTypes.DistributedAuthority)
|
|
{
|
|
DAHost = IsClient && IsServer;
|
|
|
|
// DANGO-TODO: We might allow a dedicated mock CMB server, but for now do not allow this
|
|
if (!IsClient && IsServer)
|
|
{
|
|
Debug.LogError("You cannot start NetworkManager as a server when operating in distributed authority mode!");
|
|
return false;
|
|
}
|
|
|
|
if (DAHost && networkManager.CMBServiceConnection)
|
|
{
|
|
Debug.LogError("You cannot start a host when connecting to a distributed authority CMB Service!");
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Only to be invoked when setting the role.
|
|
/// This resets the current NetworkClient's properties.
|
|
/// </summary>
|
|
private void ResetClient(bool isServer, bool isClient)
|
|
{
|
|
// If we are niether client nor server, then reset properties (i.e. client has no role)
|
|
if (!IsServer && !IsClient)
|
|
{
|
|
PlayerObject = null;
|
|
ClientId = 0;
|
|
IsConnected = false;
|
|
IsApproved = false;
|
|
SpawnManager = null;
|
|
DAHost = false;
|
|
}
|
|
}
|
|
|
|
internal void AssignPlayerObject(ref NetworkObject networkObject)
|
|
{
|
|
PlayerObject = networkObject;
|
|
}
|
|
}
|
|
}
|