This repository has been archived on 2025-04-22. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
com.unity.netcode.gameobjects/Tests/Runtime/Components/NetworkVariableTestComponent.cs
Unity Technologies e15bd056c5 com.unity.netcode.gameobjects@1.0.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).

## [1.0.1] - 2022-08-23

### Changed

- Changed version to 1.0.1. (#2131)
- Updated dependency on `com.unity.transport` to 1.2.0. (#2129)
- When using `UnityTransport`, _reliable_ payloads are now allowed to exceed the configured 'Max Payload Size'. Unreliable payloads remain bounded by this setting. (#2081)
- Preformance improvements for cases with large number of NetworkObjects, by not iterating over all unchanged NetworkObjects

### Fixed

- Fixed an issue where reading/writing more than 8 bits at a time with BitReader/BitWriter would write/read from the wrong place, returning and incorrect result. (#2130)
- Fixed issue with the internal `NetworkTransformState.m_Bitset` flag not getting cleared upon the next tick advancement. (#2110)
- Fixed interpolation issue with `NetworkTransform.Teleport`. (#2110)
- Fixed issue where the authoritative side was interpolating its transform. (#2110)
- Fixed Owner-written NetworkVariable infinitely write themselves (#2109)
- Fixed NetworkList issue that showed when inserting at the very end of a NetworkList (#2099)
- Fixed issue where a client owner of a `NetworkVariable` with both owner read and write permissions would not update the server side when changed. (#2097)
- Fixed issue when attempting to spawn a parent `GameObject`, with `NetworkObject` component attached, that has one or more child `GameObject`s, that are inactive in the hierarchy, with `NetworkBehaviour` components it will no longer attempt to spawn the associated `NetworkBehaviour`(s) or invoke ownership changed notifications but will log a warning message. (#2096)
- Fixed an issue where destroying a NetworkBehaviour would not deregister it from the parent NetworkObject, leading to exceptions when the parent was later destroyed. (#2091)
- Fixed issue where `NetworkObject.NetworkHide` was despawning and destroying, as opposed to only despawning, in-scene placed `NetworkObject`s. (#2086)
- Fixed `NetworkAnimator` synchronizing transitions twice due to it detecting the change in animation state once a transition is started by a trigger. (#2084)
- Fixed issue where `NetworkAnimator` would not synchronize a looping animation for late joining clients if it was at the very end of its loop. (#2076)
- Fixed issue where `NetworkAnimator` was not removing its subscription from `OnClientConnectedCallback` when despawned during the shutdown sequence. (#2074)
- Fixed IsServer and IsClient being set to false before object despawn during the shutdown sequence. (#2074)
- Fixed NetworkList Value event on the server. PreviousValue is now set correctly when a new value is set through property setter. (#2067)
- Fixed NetworkLists not populating on client. NetworkList now uses the most recent list as opposed to the list at the end of previous frame, when sending full updates to dynamically spawned NetworkObject. The difference in behaviour is required as scene management spawns those objects at a different time in the frame, relative to updates. (#2062)
2022-08-23 00:00:00 +00:00

200 lines
11 KiB
C#

using UnityEngine;
using Unity.Netcode.TestHelpers.Runtime;
namespace Unity.Netcode.RuntimeTests
{
/// <summary>
/// This provides coverage for all of the predefined NetworkVariable types
/// The initial goal is for generalized full coverage of NetworkVariables:
/// Covers all of the various constructor calls (i.e. various parameters or no parameters)
/// Covers the local NetworkVariable's OnValueChanged functionality (i.e. when a specific type changes do we get a notification?)
/// This was built as a NetworkBehaviour for further client-server unit testing patterns when this capability is available.
/// </summary>
internal class NetworkVariableTestComponent : NetworkBehaviour
{
private NetworkVariable<bool> m_NetworkVariableBool = new NetworkVariable<bool>();
private NetworkVariable<byte> m_NetworkVariableByte = new NetworkVariable<byte>();
private NetworkVariable<Color> m_NetworkVariableColor = new NetworkVariable<Color>();
private NetworkVariable<Color32> m_NetworkVariableColor32 = new NetworkVariable<Color32>();
private NetworkVariable<double> m_NetworkVariableDouble = new NetworkVariable<double>();
private NetworkVariable<float> m_NetworkVariableFloat = new NetworkVariable<float>();
private NetworkVariable<int> m_NetworkVariableInt = new NetworkVariable<int>();
private NetworkVariable<long> m_NetworkVariableLong = new NetworkVariable<long>();
private NetworkVariable<sbyte> m_NetworkVariableSByte = new NetworkVariable<sbyte>();
private NetworkVariable<Quaternion> m_NetworkVariableQuaternion = new NetworkVariable<Quaternion>();
private NetworkVariable<short> m_NetworkVariableShort = new NetworkVariable<short>();
private NetworkVariable<Vector4> m_NetworkVariableVector4 = new NetworkVariable<Vector4>();
private NetworkVariable<Vector3> m_NetworkVariableVector3 = new NetworkVariable<Vector3>();
private NetworkVariable<Vector2> m_NetworkVariableVector2 = new NetworkVariable<Vector2>();
private NetworkVariable<Ray> m_NetworkVariableRay = new NetworkVariable<Ray>();
private NetworkVariable<ulong> m_NetworkVariableULong = new NetworkVariable<ulong>();
private NetworkVariable<uint> m_NetworkVariableUInt = new NetworkVariable<uint>();
private NetworkVariable<ushort> m_NetworkVariableUShort = new NetworkVariable<ushort>();
public NetworkVariableHelper<bool> Bool_Var;
public NetworkVariableHelper<byte> Byte_Var;
public NetworkVariableHelper<Color> Color_Var;
public NetworkVariableHelper<Color32> Color32_Var;
public NetworkVariableHelper<double> Double_Var;
public NetworkVariableHelper<float> Float_Var;
public NetworkVariableHelper<int> Int_Var;
public NetworkVariableHelper<long> Long_Var;
public NetworkVariableHelper<sbyte> Sbyte_Var;
public NetworkVariableHelper<Quaternion> Quaternion_Var;
public NetworkVariableHelper<short> Short_Var;
public NetworkVariableHelper<Vector4> Vector4_Var;
public NetworkVariableHelper<Vector3> Vector3_Var;
public NetworkVariableHelper<Vector2> Vector2_Var;
public NetworkVariableHelper<Ray> Ray_Var;
public NetworkVariableHelper<ulong> Ulong_Var;
public NetworkVariableHelper<uint> Uint_Var;
public NetworkVariableHelper<ushort> Ushort_Var;
public bool EnableTesting;
private bool m_FinishedTests;
private bool m_ChangesAppliedToNetworkVariables;
private float m_WaitForChangesTimeout;
// Start is called before the first frame update
private void InitializeTest()
{
// Generic Constructor Test Coverage
m_NetworkVariableBool = new NetworkVariable<bool>();
m_NetworkVariableByte = new NetworkVariable<byte>();
m_NetworkVariableColor = new NetworkVariable<Color>();
m_NetworkVariableColor32 = new NetworkVariable<Color32>();
m_NetworkVariableDouble = new NetworkVariable<double>();
m_NetworkVariableFloat = new NetworkVariable<float>();
m_NetworkVariableInt = new NetworkVariable<int>();
m_NetworkVariableLong = new NetworkVariable<long>();
m_NetworkVariableSByte = new NetworkVariable<sbyte>();
m_NetworkVariableQuaternion = new NetworkVariable<Quaternion>();
m_NetworkVariableShort = new NetworkVariable<short>();
m_NetworkVariableVector4 = new NetworkVariable<Vector4>();
m_NetworkVariableVector3 = new NetworkVariable<Vector3>();
m_NetworkVariableVector2 = new NetworkVariable<Vector2>();
m_NetworkVariableRay = new NetworkVariable<Ray>();
m_NetworkVariableULong = new NetworkVariable<ulong>();
m_NetworkVariableUInt = new NetworkVariable<uint>();
m_NetworkVariableUShort = new NetworkVariable<ushort>();
// NetworkVariable Value Type Constructor Test Coverage
m_NetworkVariableBool = new NetworkVariable<bool>(true);
m_NetworkVariableByte = new NetworkVariable<byte>((byte)0);
m_NetworkVariableColor = new NetworkVariable<Color>(new Color(1, 1, 1, 1));
m_NetworkVariableColor32 = new NetworkVariable<Color32>(new Color32(1, 1, 1, 1));
m_NetworkVariableDouble = new NetworkVariable<double>(1.0);
m_NetworkVariableFloat = new NetworkVariable<float>(1.0f);
m_NetworkVariableInt = new NetworkVariable<int>(1);
m_NetworkVariableLong = new NetworkVariable<long>(1);
m_NetworkVariableSByte = new NetworkVariable<sbyte>((sbyte)0);
m_NetworkVariableQuaternion = new NetworkVariable<Quaternion>(Quaternion.identity);
m_NetworkVariableShort = new NetworkVariable<short>(256);
m_NetworkVariableVector4 = new NetworkVariable<Vector4>(new Vector4(1, 1, 1, 1));
m_NetworkVariableVector3 = new NetworkVariable<Vector3>(new Vector3(1, 1, 1));
m_NetworkVariableVector2 = new NetworkVariable<Vector2>(new Vector2(1, 1));
m_NetworkVariableRay = new NetworkVariable<Ray>(new Ray());
m_NetworkVariableULong = new NetworkVariable<ulong>(1);
m_NetworkVariableUInt = new NetworkVariable<uint>(1);
m_NetworkVariableUShort = new NetworkVariable<ushort>(1);
// Use this nifty class: NetworkVariableHelper
// Tracks if NetworkVariable changed invokes the OnValueChanged callback for the given instance type
Bool_Var = new NetworkVariableHelper<bool>(m_NetworkVariableBool);
Byte_Var = new NetworkVariableHelper<byte>(m_NetworkVariableByte);
Color_Var = new NetworkVariableHelper<Color>(m_NetworkVariableColor);
Color32_Var = new NetworkVariableHelper<Color32>(m_NetworkVariableColor32);
Double_Var = new NetworkVariableHelper<double>(m_NetworkVariableDouble);
Float_Var = new NetworkVariableHelper<float>(m_NetworkVariableFloat);
Int_Var = new NetworkVariableHelper<int>(m_NetworkVariableInt);
Long_Var = new NetworkVariableHelper<long>(m_NetworkVariableLong);
Sbyte_Var = new NetworkVariableHelper<sbyte>(m_NetworkVariableSByte);
Quaternion_Var = new NetworkVariableHelper<Quaternion>(m_NetworkVariableQuaternion);
Short_Var = new NetworkVariableHelper<short>(m_NetworkVariableShort);
Vector4_Var = new NetworkVariableHelper<Vector4>(m_NetworkVariableVector4);
Vector3_Var = new NetworkVariableHelper<Vector3>(m_NetworkVariableVector3);
Vector2_Var = new NetworkVariableHelper<Vector2>(m_NetworkVariableVector2);
Ray_Var = new NetworkVariableHelper<Ray>(m_NetworkVariableRay);
Ulong_Var = new NetworkVariableHelper<ulong>(m_NetworkVariableULong);
Uint_Var = new NetworkVariableHelper<uint>(m_NetworkVariableUInt);
Ushort_Var = new NetworkVariableHelper<ushort>(m_NetworkVariableUShort);
}
/// <summary>
/// Test result for all values changed the expected number of times (once per unique NetworkVariable type)
/// </summary>
public bool DidAllValuesChange()
{
if (NetworkVariableBaseHelper.VarChangedCount == NetworkVariableBaseHelper.InstanceCount)
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// Returns back whether the test has completed the total number of iterations
/// </summary>
public bool IsTestComplete()
{
return m_FinishedTests;
}
public void Awake()
{
InitializeTest();
}
// Update is called once per frame
private void Update()
{
if (EnableTesting)
{
//Added timeout functionality for near future changes to NetworkVariables
if (!m_FinishedTests && m_ChangesAppliedToNetworkVariables)
{
//We finish testing if all NetworkVariables changed their value or we timed out waiting for
//all NetworkVariables to change their value
m_FinishedTests = DidAllValuesChange() || (m_WaitForChangesTimeout < Time.realtimeSinceStartup);
}
else
{
if (NetworkManager != null && NetworkManager.IsListening)
{
//Now change all of the values to make sure we are at least testing the local callback
m_NetworkVariableBool.Value = false;
m_NetworkVariableByte.Value = 255;
m_NetworkVariableColor.Value = new Color(100, 100, 100);
m_NetworkVariableColor32.Value = new Color32(100, 100, 100, 100);
m_NetworkVariableDouble.Value = 1000;
m_NetworkVariableFloat.Value = 1000.0f;
m_NetworkVariableInt.Value = 1000;
m_NetworkVariableLong.Value = 100000;
m_NetworkVariableSByte.Value = -127;
m_NetworkVariableQuaternion.Value = new Quaternion(100, 100, 100, 100);
m_NetworkVariableShort.Value = short.MaxValue;
m_NetworkVariableVector4.Value = new Vector4(1000, 1000, 1000, 1000);
m_NetworkVariableVector3.Value = new Vector3(1000, 1000, 1000);
m_NetworkVariableVector2.Value = new Vector2(1000, 1000);
m_NetworkVariableRay.Value = new Ray(Vector3.one, Vector3.right);
m_NetworkVariableULong.Value = ulong.MaxValue;
m_NetworkVariableUInt.Value = uint.MaxValue;
m_NetworkVariableUShort.Value = ushort.MaxValue;
//Set the timeout (i.e. how long we will wait for all NetworkVariables to have registered their changes)
m_WaitForChangesTimeout = Time.realtimeSinceStartup + 0.50f;
m_ChangesAppliedToNetworkVariables = true;
}
}
}
}
}
}