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). ## [1.8.0] - 2023-12-12 ### Added - Added a new RPC attribute, which is simply `Rpc`. (#2762) - This is a generic attribute that can perform the functions of both Server and Client RPCs, as well as enabling client-to-client RPCs. Includes several default targets: `Server`, `NotServer`, `Owner`, `NotOwner`, `Me`, `NotMe`, `ClientsAndHost`, and `Everyone`. Runtime overrides are available for any of these targets, as well as for sending to a specific ID or groups of IDs. - This attribute also includes the ability to defer RPCs that are sent to the local process to the start of the next frame instead of executing them immediately, treating them as if they had gone across the network. The default behavior is to execute immediately. - This attribute effectively replaces `ServerRpc` and `ClientRpc`. `ServerRpc` and `ClientRpc` remain in their existing forms for backward compatibility, but `Rpc` will be the recommended and most supported option. - Added `NetworkManager.OnConnectionEvent` as a unified connection event callback to notify clients and servers of all client connections and disconnections within the session (#2762) - Added `NetworkManager.ServerIsHost` and `NetworkBehaviour.ServerIsHost` to allow a client to tell if it is connected to a host or to a dedicated server (#2762) - Added `SceneEventProgress.SceneManagementNotEnabled` return status to be returned when a `NetworkSceneManager` method is invoked and scene management is not enabled. (#2735) - Added `SceneEventProgress.ServerOnlyAction` return status to be returned when a `NetworkSceneManager` method is invoked by a client. (#2735) - Added `NetworkObject.InstantiateAndSpawn` and `NetworkSpawnManager.InstantiateAndSpawn` methods to simplify prefab spawning by assuring that the prefab is valid and applies any override prior to instantiating the `GameObject` and spawning the `NetworkObject` instance. (#2710) ### Fixed - Fixed issue where a client disconnected by a server-host would not receive a local notification. (#2789) - Fixed issue where a server-host could shutdown during a relay connection but periodically the transport disconnect message sent to any connected clients could be dropped. (#2789) - Fixed issue where a host could disconnect its local client but remain running as a server. (#2789) - Fixed issue where `OnClientDisconnectedCallback` was not being invoked under certain conditions. (#2789) - Fixed issue where `OnClientDisconnectedCallback` was always returning 0 as the client identifier. (#2789) - Fixed issue where if a host or server shutdown while a client owned NetworkObjects (other than the player) it would throw an exception. (#2789) - Fixed issue where setting values on a `NetworkVariable` or `NetworkList` within `OnNetworkDespawn` during a shutdown sequence would throw an exception. (#2789) - Fixed issue where a teleport state could potentially be overridden by a previous unreliable delta state. (#2777) - Fixed issue where `NetworkTransform` was using the `NetworkManager.ServerTime.Tick` as opposed to `NetworkManager.NetworkTickSystem.ServerTime.Tick` during the authoritative side's tick update where it performed a delta state check. (#2777) - Fixed issue where a parented in-scene placed NetworkObject would be destroyed upon a client or server exiting a network session but not unloading the original scene in which the NetworkObject was placed. (#2737) - Fixed issue where during client synchronization and scene loading, when client synchronization or the scene loading mode are set to `LoadSceneMode.Single`, a `CreateObjectMessage` could be received, processed, and the resultant spawned `NetworkObject` could be instantiated in the client's currently active scene that could, towards the end of the client synchronization or loading process, be unloaded and cause the newly created `NetworkObject` to be destroyed (and throw and exception). (#2735) - Fixed issue where a `NetworkTransform` instance with interpolation enabled would result in wide visual motion gaps (stuttering) under above normal latency conditions and a 1-5% or higher packet are drop rate. (#2713) - Fixed issue where you could not have multiple source network prefab overrides targeting the same network prefab as their override. (#2710) ### Changed - Changed the server or host shutdown so it will now perform a "soft shutdown" when `NetworkManager.Shutdown` is invoked. This will send a disconnect notification to all connected clients and the server-host will wait for all connected clients to disconnect or timeout after a 5 second period before completing the shutdown process. (#2789) - Changed `OnClientDisconnectedCallback` will now return the assigned client identifier on the local client side if the client was approved and assigned one prior to being disconnected. (#2789) - Changed `NetworkTransform.SetState` (and related methods) now are cumulative during a fractional tick period and sent on the next pending tick. (#2777) - `NetworkManager.ConnectedClientsIds` is now accessible on the client side and will contain the list of all clients in the session, including the host client if the server is operating in host mode (#2762) - Changed `NetworkSceneManager` to return a `SceneEventProgress` status and not throw exceptions for methods invoked when scene management is disabled and when a client attempts to access a `NetworkSceneManager` method by a client. (#2735) - Changed `NetworkTransform` authoritative instance tick registration so a single `NetworkTransform` specific tick event update will update all authoritative instances to improve perofmance. (#2713) - Changed `NetworkPrefabs.OverrideToNetworkPrefab` dictionary is no longer used/populated due to it ending up being related to a regression bug and not allowing more than one override to be assigned to a network prefab asset. (#2710) - Changed in-scene placed `NetworkObject`s now store their source network prefab asset's `GlobalObjectIdHash` internally that is used, when scene management is disabled, by clients to spawn the correct prefab even if the `NetworkPrefab` entry has an override. This does not impact dynamically spawning the same prefab which will yield the override on both host and client. (#2710) - Changed in-scene placed `NetworkObject`s no longer require a `NetworkPrefab` entry with `GlobalObjectIdHash` override in order for clients to properly synchronize. (#2710) - Changed in-scene placed `NetworkObject`s now set their `IsSceneObject` value when generating their `GlobalObjectIdHash` value. (#2710) - Changed the default `NetworkConfig.SpawnTimeout` value from 1.0s to 10.0s. (#2710)
161 lines
5.4 KiB
C#
161 lines
5.4 KiB
C#
using System.Collections.Generic;
|
|
using Unity.Collections;
|
|
|
|
namespace Unity.Netcode
|
|
{
|
|
public enum LocalDeferMode
|
|
{
|
|
Default,
|
|
Defer,
|
|
SendImmediate
|
|
}
|
|
/// <summary>
|
|
/// Generic RPC
|
|
/// </summary>
|
|
public struct RpcSendParams
|
|
{
|
|
public BaseRpcTarget Target;
|
|
|
|
public LocalDeferMode LocalDeferMode;
|
|
|
|
public static implicit operator RpcSendParams(BaseRpcTarget target) => new RpcSendParams { Target = target };
|
|
public static implicit operator RpcSendParams(LocalDeferMode deferMode) => new RpcSendParams { LocalDeferMode = deferMode };
|
|
}
|
|
|
|
/// <summary>
|
|
/// The receive parameters for server-side remote procedure calls
|
|
/// </summary>
|
|
public struct RpcReceiveParams
|
|
{
|
|
/// <summary>
|
|
/// Server-Side RPC
|
|
/// The client identifier of the sender
|
|
/// </summary>
|
|
public ulong SenderClientId;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Server-Side RPC
|
|
/// Can be used with any sever-side remote procedure call
|
|
/// Note: typically this is use primarily for the <see cref="ServerRpcReceiveParams"/>
|
|
/// </summary>
|
|
public struct RpcParams
|
|
{
|
|
/// <summary>
|
|
/// The server RPC send parameters (currently a place holder)
|
|
/// </summary>
|
|
public RpcSendParams Send;
|
|
|
|
/// <summary>
|
|
/// The client RPC receive parameters provides you with the sender's identifier
|
|
/// </summary>
|
|
public RpcReceiveParams Receive;
|
|
|
|
public static implicit operator RpcParams(RpcSendParams send) => new RpcParams { Send = send };
|
|
public static implicit operator RpcParams(BaseRpcTarget target) => new RpcParams { Send = new RpcSendParams { Target = target } };
|
|
public static implicit operator RpcParams(LocalDeferMode deferMode) => new RpcParams { Send = new RpcSendParams { LocalDeferMode = deferMode } };
|
|
public static implicit operator RpcParams(RpcReceiveParams receive) => new RpcParams { Receive = receive };
|
|
}
|
|
|
|
/// <summary>
|
|
/// Server-Side RPC
|
|
/// Place holder. <see cref="ServerRpcParams"/>
|
|
/// Note: Clients always send to one destination when sending RPCs to the server
|
|
/// so this structure is a place holder
|
|
/// </summary>
|
|
public struct ServerRpcSendParams
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// The receive parameters for server-side remote procedure calls
|
|
/// </summary>
|
|
public struct ServerRpcReceiveParams
|
|
{
|
|
/// <summary>
|
|
/// Server-Side RPC
|
|
/// The client identifier of the sender
|
|
/// </summary>
|
|
public ulong SenderClientId;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Server-Side RPC
|
|
/// Can be used with any sever-side remote procedure call
|
|
/// Note: typically this is use primarily for the <see cref="ServerRpcReceiveParams"/>
|
|
/// </summary>
|
|
public struct ServerRpcParams
|
|
{
|
|
/// <summary>
|
|
/// The server RPC send parameters (currently a place holder)
|
|
/// </summary>
|
|
public ServerRpcSendParams Send;
|
|
|
|
/// <summary>
|
|
/// The client RPC receive parameters provides you with the sender's identifier
|
|
/// </summary>
|
|
public ServerRpcReceiveParams Receive;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Client-Side RPC
|
|
/// The send parameters, when sending client RPCs, provides you wil the ability to
|
|
/// target specific clients as a managed or unmanaged list:
|
|
/// <see cref="TargetClientIds"/> and <see cref="TargetClientIdsNativeArray"/>
|
|
/// </summary>
|
|
public struct ClientRpcSendParams
|
|
{
|
|
/// <summary>
|
|
/// IEnumerable version of target id list - use either this OR TargetClientIdsNativeArray
|
|
/// Note: Even if you provide a value type such as NativeArray, enumerating it will cause boxing.
|
|
/// If you want to avoid boxing, use TargetClientIdsNativeArray
|
|
/// </summary>
|
|
public IReadOnlyList<ulong> TargetClientIds;
|
|
|
|
/// <summary>
|
|
/// NativeArray version of target id list - use either this OR TargetClientIds
|
|
/// This option avoids any GC allocations but is a bit trickier to use.
|
|
/// </summary>
|
|
public NativeArray<ulong>? TargetClientIdsNativeArray;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Client-Side RPC
|
|
/// Place holder. <see cref="ServerRpcParams"/>
|
|
/// Note: Server will always be the sender, so this structure is a place holder
|
|
/// </summary>
|
|
public struct ClientRpcReceiveParams
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// Client-Side RPC
|
|
/// Can be used with any client-side remote procedure call
|
|
/// Note: Typically this is used primarily for sending to a specific list
|
|
/// of clients as opposed to the default (all).
|
|
/// <see cref="ClientRpcSendParams"/>
|
|
/// </summary>
|
|
public struct ClientRpcParams
|
|
{
|
|
/// <summary>
|
|
/// The client RPC send parameters provides you with the ability to send to a specific list of clients
|
|
/// </summary>
|
|
public ClientRpcSendParams Send;
|
|
|
|
/// <summary>
|
|
/// The client RPC receive parameters (currently a place holder)
|
|
/// </summary>
|
|
public ClientRpcReceiveParams Receive;
|
|
}
|
|
|
|
#pragma warning disable IDE1006 // disable naming rule violation check
|
|
// RuntimeAccessModifiersILPP will make this `public`
|
|
internal struct __RpcParams
|
|
#pragma warning restore IDE1006 // restore naming rule violation check
|
|
{
|
|
public RpcParams Ext;
|
|
public ServerRpcParams Server;
|
|
public ClientRpcParams Client;
|
|
}
|
|
}
|