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.7.0] - 2023-10-11 ### Added - exposed NetworkObject.GetNetworkBehaviourAtOrderIndex as a public API (#2724) - Added context menu tool that provides users with the ability to quickly update the GlobalObjectIdHash value for all in-scene placed prefab instances that were created prior to adding a NetworkObject component to it. (#2707) - Added methods NetworkManager.SetPeerMTU and NetworkManager.GetPeerMTU to be able to set MTU sizes per-peer (#2676) - Added `GenerateSerializationForGenericParameterAttribute`, which can be applied to user-created Network Variable types to ensure the codegen generates serialization for the generic types they wrap. (#2694) - Added `GenerateSerializationForTypeAttribute`, which can be applied to any class or method to ensure the codegen generates serialization for the specific provided type. (#2694) - Exposed `NetworkVariableSerialization<T>.Read`, `NetworkVariableSerialization<T>.Write`, `NetworkVariableSerialization<T>.AreEqual`, and `NetworkVariableSerialization<T>.Duplicate` to further support the creation of user-created network variables by allowing users to access the generated serialization methods and serialize generic types efficiently without boxing. (#2694) - Added `NetworkVariableBase.MarkNetworkBehaviourDirty` so that user-created network variable types can mark their containing `NetworkBehaviour` to be processed by the update loop. (#2694) ### Fixed - Fixed issue where the server side `NetworkSceneManager` instance was not adding the currently active scene to its list of scenes loaded. (#2723) - Generic NetworkBehaviour types no longer result in compile errors or runtime errors (#2720) - Rpcs within Generic NetworkBehaviour types can now serialize parameters of the class's generic types (but may not have generic types of their own) (#2720) - Errors are no longer thrown when entering play mode with domain reload disabled (#2720) - NetworkSpawn is now correctly called each time when entering play mode with scene reload disabled (#2720) - NetworkVariables of non-integer types will no longer break the inspector (#2714) - NetworkVariables with NonSerializedAttribute will not appear in the inspector (#2714) - Fixed issue where `UnityTransport` would attempt to establish WebSocket connections even if using UDP/DTLS Relay allocations when the build target was WebGL. This only applied to working in the editor since UDP/DTLS can't work in the browser. (#2695) - Fixed issue where a `NetworkBehaviour` component's `OnNetworkDespawn` was not being invoked on the host-server side for an in-scene placed `NetworkObject` when a scene was unloaded (during a scene transition) and the `NetworkBehaviour` component was positioned/ordered before the `NetworkObject` component. (#2685) - Fixed issue where `SpawnWithObservers` was not being honored when `NetworkConfig.EnableSceneManagement` was disabled. (#2682) - Fixed issue where `NetworkAnimator` was not internally tracking changes to layer weights which prevented proper layer weight synchronization back to the original layer weight value. (#2674) - Fixed "writing past the end of the buffer" error when calling ResetDirty() on managed network variables that are larger than 256 bytes when serialized. (#2670) - Fixed issue where generation of the `DefaultNetworkPrefabs` asset was not enabled by default. (#2662) - Fixed issue where the `GlobalObjectIdHash` value could be updated but the asset not marked as dirty. (#2662) - Fixed issue where the `GlobalObjectIdHash` value of a (network) prefab asset could be assigned an incorrect value when editing the prefab in a temporary scene. (#2662) - Fixed issue where the `GlobalObjectIdHash` value generated after creating a (network) prefab from an object constructed within the scene would not be the correct final value in a stand alone build. (#2662) ### Changed - Updated dependency on `com.unity.transport` to version 1.4.0. (#2716)
199 lines
7.0 KiB
C#
199 lines
7.0 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace Unity.Netcode
|
|
{
|
|
/// <summary>
|
|
/// Interface for network value containers
|
|
/// </summary>
|
|
public abstract class NetworkVariableBase : IDisposable
|
|
{
|
|
/// <summary>
|
|
/// The delivery type (QoS) to send data with
|
|
/// </summary>
|
|
internal const NetworkDelivery Delivery = NetworkDelivery.ReliableFragmentedSequenced;
|
|
|
|
/// <summary>
|
|
/// Maintains a link to the associated NetworkBehaviour
|
|
/// </summary>
|
|
private protected NetworkBehaviour m_NetworkBehaviour;
|
|
|
|
public NetworkBehaviour GetBehaviour()
|
|
{
|
|
return m_NetworkBehaviour;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Initializes the NetworkVariable
|
|
/// </summary>
|
|
/// <param name="networkBehaviour">The NetworkBehaviour the NetworkVariable belongs to</param>
|
|
public void Initialize(NetworkBehaviour networkBehaviour)
|
|
{
|
|
m_NetworkBehaviour = networkBehaviour;
|
|
}
|
|
|
|
/// <summary>
|
|
/// The default read permissions
|
|
/// </summary>
|
|
public const NetworkVariableReadPermission DefaultReadPerm = NetworkVariableReadPermission.Everyone;
|
|
|
|
/// <summary>
|
|
/// The default write permissions
|
|
/// </summary>
|
|
public const NetworkVariableWritePermission DefaultWritePerm = NetworkVariableWritePermission.Server;
|
|
|
|
/// <summary>
|
|
/// The default constructor for <see cref="NetworkVariableBase"/> that can be used to create a
|
|
/// custom NetworkVariable.
|
|
/// </summary>
|
|
/// <param name="readPerm">the <see cref="NetworkVariableReadPermission"/> access settings</param>
|
|
/// <param name="writePerm">the <see cref="NetworkVariableWritePermission"/> access settings</param>
|
|
protected NetworkVariableBase(
|
|
NetworkVariableReadPermission readPerm = DefaultReadPerm,
|
|
NetworkVariableWritePermission writePerm = DefaultWritePerm)
|
|
{
|
|
ReadPerm = readPerm;
|
|
WritePerm = writePerm;
|
|
}
|
|
|
|
/// <summary>
|
|
/// The <see cref="m_IsDirty"/> property is used to determine if the
|
|
/// value of the `NetworkVariable` has changed.
|
|
/// </summary>
|
|
private bool m_IsDirty;
|
|
|
|
/// <summary>
|
|
/// Gets or sets the name of the network variable's instance
|
|
/// (MemberInfo) where it was declared.
|
|
/// </summary>
|
|
public string Name { get; internal set; }
|
|
|
|
/// <summary>
|
|
/// The read permission for this var
|
|
/// </summary>
|
|
public readonly NetworkVariableReadPermission ReadPerm;
|
|
|
|
/// <summary>
|
|
/// The write permission for this var
|
|
/// </summary>
|
|
public readonly NetworkVariableWritePermission WritePerm;
|
|
|
|
/// <summary>
|
|
/// Sets whether or not the variable needs to be delta synced
|
|
/// </summary>
|
|
/// <param name="isDirty">Whether or not the var is dirty</param>
|
|
public virtual void SetDirty(bool isDirty)
|
|
{
|
|
m_IsDirty = isDirty;
|
|
|
|
if (m_IsDirty)
|
|
{
|
|
MarkNetworkBehaviourDirty();
|
|
}
|
|
}
|
|
|
|
protected void MarkNetworkBehaviourDirty()
|
|
{
|
|
if (m_NetworkBehaviour == null)
|
|
{
|
|
Debug.LogWarning($"NetworkVariable is written to, but doesn't know its NetworkBehaviour yet. " +
|
|
"Are you modifying a NetworkVariable before the NetworkObject is spawned?");
|
|
return;
|
|
}
|
|
|
|
m_NetworkBehaviour.NetworkManager.BehaviourUpdater.AddForUpdate(m_NetworkBehaviour.NetworkObject);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Resets the dirty state and marks the variable as synced / clean
|
|
/// </summary>
|
|
public virtual void ResetDirty()
|
|
{
|
|
m_IsDirty = false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets Whether or not the container is dirty
|
|
/// </summary>
|
|
/// <returns>Whether or not the container is dirty</returns>
|
|
public virtual bool IsDirty()
|
|
{
|
|
return m_IsDirty;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets if a specific client has permission to read the var or not
|
|
/// </summary>
|
|
/// <param name="clientId">The client id</param>
|
|
/// <returns>Whether or not the client has permission to read</returns>
|
|
public bool CanClientRead(ulong clientId)
|
|
{
|
|
switch (ReadPerm)
|
|
{
|
|
default:
|
|
case NetworkVariableReadPermission.Everyone:
|
|
return true;
|
|
case NetworkVariableReadPermission.Owner:
|
|
return clientId == m_NetworkBehaviour.NetworkObject.OwnerClientId || NetworkManager.ServerClientId == clientId;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets if a specific client has permission to write the var or not
|
|
/// </summary>
|
|
/// <param name="clientId">The client id</param>
|
|
/// <returns>Whether or not the client has permission to write</returns>
|
|
public bool CanClientWrite(ulong clientId)
|
|
{
|
|
switch (WritePerm)
|
|
{
|
|
default:
|
|
case NetworkVariableWritePermission.Server:
|
|
return clientId == NetworkManager.ServerClientId;
|
|
case NetworkVariableWritePermission.Owner:
|
|
return clientId == m_NetworkBehaviour.NetworkObject.OwnerClientId;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns the ClientId of the owning client
|
|
/// </summary>
|
|
internal ulong OwnerClientId()
|
|
{
|
|
return m_NetworkBehaviour.NetworkObject.OwnerClientId;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Writes the dirty changes, that is, the changes since the variable was last dirty, to the writer
|
|
/// </summary>
|
|
/// <param name="writer">The stream to write the dirty changes to</param>
|
|
public abstract void WriteDelta(FastBufferWriter writer);
|
|
|
|
/// <summary>
|
|
/// Writes the complete state of the variable to the writer
|
|
/// </summary>
|
|
/// <param name="writer">The stream to write the state to</param>
|
|
public abstract void WriteField(FastBufferWriter writer);
|
|
|
|
/// <summary>
|
|
/// Reads the complete state from the reader and applies it
|
|
/// </summary>
|
|
/// <param name="reader">The stream to read the state from</param>
|
|
public abstract void ReadField(FastBufferReader reader);
|
|
|
|
/// <summary>
|
|
/// Reads delta from the reader and applies them to the internal value
|
|
/// </summary>
|
|
/// <param name="reader">The stream to read the delta from</param>
|
|
/// <param name="keepDirtyDelta">Whether or not the delta should be kept as dirty or consumed</param>
|
|
public abstract void ReadDelta(FastBufferReader reader, bool keepDirtyDelta);
|
|
|
|
/// <summary>
|
|
/// Virtual <see cref="IDisposable"/> implementation
|
|
/// </summary>
|
|
public virtual void Dispose()
|
|
{
|
|
}
|
|
}
|
|
}
|