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 b5abc3ff7c com.unity.netcode.gameobjects@1.4.0
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.4.0] - 2023-04-10

### Added

- Added a way to access the GlobalObjectIdHash via PrefabIdHash for use in the Connection Approval Callback. (#2437)
- Added `OnServerStarted` and `OnServerStopped` events that will trigger only on the server (or host player) to notify that the server just started or is no longer active (#2420)
- Added `OnClientStarted` and `OnClientStopped` events that will trigger only on the client (or host player) to notify that the client just started or is no longer active (#2420)
- Added `NetworkTransform.UseHalfFloatPrecision` property that, when enabled, will use half float values for position, rotation, and scale. This yields a 50% bandwidth savings a the cost of precision. (#2388)
- Added `NetworkTransform.UseQuaternionSynchronization` property that, when enabled, will synchronize the entire quaternion. (#2388)
- Added `NetworkTransform.UseQuaternionCompression` property that, when enabled, will use a smallest three implementation reducing a full quaternion synchronization update to the size of an unsigned integer. (#2388)
- Added `NetworkTransform.SlerpPosition` property that, when enabled along with interpolation being enabled, will interpolate using `Vector3.Slerp`. (#2388)
- Added `BufferedLinearInterpolatorVector3` that replaces the float version, is now used by `NetworkTransform`, and provides the ability to enable or disable `Slerp`. (#2388)
- Added `HalfVector3` used for scale when half float precision is enabled. (#2388)
- Added `HalfVector4` used for rotation when half float precision and quaternion synchronization is enabled. (#2388)
- Added `HalfVector3DeltaPosition` used for position when half float precision is enabled. This handles loss in position precision by updating only the delta position as opposed to the full position. (#2388)
- Added `NetworkTransform.GetSpaceRelativePosition` and `NetworkTransform.GetSpaceRelativeRotation` helper methods to return the proper values depending upon whether local or world space. (#2388)
- Added `NetworkTransform.OnAuthorityPushTransformState` virtual method that is invoked just prior to sending the `NetworkTransformState` to non-authoritative instances. This provides users with the ability to obtain more precise delta values for prediction related calculations. (#2388)
- Added `NetworkTransform.OnNetworkTransformStateUpdated` virtual method that is invoked just after the authoritative `NetworkTransformState` is applied. This provides users with the ability to obtain more precise delta values for prediction related calculations. (#2388)
- Added `NetworkTransform.OnInitialize`virtual method that is invoked after the `NetworkTransform` has been initialized or re-initialized when ownership changes. This provides for a way to make adjustments when `NetworkTransform` is initialized (i.e. resetting client prediction etc) (#2388)
- Added `NetworkObject.SynchronizeTransform` property (default is true) that provides users with another way to help with bandwidth optimizations where, when set to false, the `NetworkObject`'s associated transform will not be included when spawning and/or synchronizing late joining players. (#2388)
- Added `NetworkSceneManager.ActiveSceneSynchronizationEnabled` property, disabled by default, that enables client synchronization of server-side active scene changes. (#2383)
- Added `NetworkObject.ActiveSceneSynchronization`, disabled by default, that will automatically migrate a `NetworkObject` to a newly assigned active scene. (#2383)
- Added `NetworkObject.SceneMigrationSynchronization`, enabled by default, that will synchronize client(s) when a `NetworkObject` is migrated into a new scene on the server side via `SceneManager.MoveGameObjectToScene`. (#2383)

### Changed

- Made sure the `CheckObjectVisibility` delegate is checked and applied, upon `NetworkShow` attempt. Found while supporting (#2454), although this is not a fix for this (already fixed) issue. (#2463)
- Changed `NetworkTransform` authority handles delta checks on each new network tick and no longer consumes processing cycles checking for deltas for all frames in-between ticks. (#2388)
- Changed the `NetworkTransformState` structure is now public and now has public methods that provide access to key properties of the `NetworkTransformState` structure. (#2388)
- Changed `NetworkTransform` interpolation adjusts its interpolation "ticks ago" to be 2 ticks latent if it is owner authoritative and the instance is not the server or 1 tick latent if the instance is the server and/or is server authoritative. (#2388)
- Updated `NetworkSceneManager` to migrate dynamically spawned `NetworkObject`s with `DestroyWithScene` set to false into the active scene if their current scene is unloaded. (#2383)
- Updated the server to synchronize its local `NetworkSceneManager.ClientSynchronizationMode` during the initial client synchronization. (#2383)

### Fixed

- Fixed issue where during client synchronization the synchronizing client could receive a ObjectSceneChanged message before the client-side NetworkObject instance had been instantiated and spawned. (#2502)
- Fixed issue where `NetworkAnimator` was building client RPC parameters to exclude the host from sending itself messages but was not including it in the ClientRpc parameters. (#2492)
- Fixed issue where `NetworkAnimator` was not properly detecting and synchronizing cross fade initiated transitions. (#2481)
- Fixed issue where `NetworkAnimator` was not properly synchronizing animation state updates. (#2481)
- Fixed float NetworkVariables not being rendered properly in the inspector of NetworkObjects. (#2441)
- Fixed an issue where Named Message Handlers could remove themselves causing an exception when the metrics tried to access the name of the message.(#2426)
- Fixed registry of public `NetworkVariable`s in derived `NetworkBehaviour`s (#2423)
- Fixed issue where runtime association of `Animator` properties to `AnimationCurve`s would cause `NetworkAnimator` to attempt to update those changes. (#2416)
- Fixed issue where `NetworkAnimator` would not check if its associated `Animator` was valid during serialization and would spam exceptions in the editor console. (#2416)
- Fixed issue with a child's rotation rolling over when interpolation is enabled on a `NetworkTransform`. Now using half precision or full quaternion synchronization will always update all axis. (#2388)
- Fixed issue where `NetworkTransform` was not setting the teleport flag when the `NetworkTransform.InLocalSpace` value changed. This issue only impacted `NetworkTransform` when interpolation was enabled. (#2388)
- Fixed issue when the `NetworkSceneManager.ClientSynchronizationMode` is `LoadSceneMode.Additive` and the server changes the currently active scene prior to a client connecting then upon a client connecting and being synchronized the NetworkSceneManager would clear its internal ScenePlacedObjects list that could already be populated. (#2383)
- Fixed issue where a client would load duplicate scenes of already preloaded scenes during the initial client synchronization and `NetworkSceneManager.ClientSynchronizationMode` was set to `LoadSceneMode.Additive`. (#2383)
2023-04-10 00:00:00 +00:00

448 lines
23 KiB
C#

using System;
using NUnit.Framework;
using Unity.Collections;
using Unity.Netcode.TestHelpers.Runtime;
using UnityEngine;
namespace Unity.Netcode.RuntimeTests
{
public class ManagedNetworkSerializableType : INetworkSerializable, IEquatable<ManagedNetworkSerializableType>
{
public string Str = "";
public int[] Ints = Array.Empty<int>();
public int InMemoryValue;
public void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReaderWriter
{
serializer.SerializeValue(ref Str, true);
var length = Ints.Length;
serializer.SerializeValue(ref length);
if (serializer.IsReader)
{
Ints = new int[length];
}
for (var i = 0; i < length; ++i)
{
var val = Ints[i];
serializer.SerializeValue(ref val);
Ints[i] = val;
}
}
public bool Equals(ManagedNetworkSerializableType other)
{
if (ReferenceEquals(null, other))
{
return false;
}
if (ReferenceEquals(this, other))
{
return true;
}
if (Str != other.Str)
{
return false;
}
if (Ints.Length != other.Ints.Length)
{
return false;
}
for (var i = 0; i < Ints.Length; ++i)
{
if (Ints[i] != other.Ints[i])
{
return false;
}
}
return true;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj))
{
return false;
}
if (ReferenceEquals(this, obj))
{
return true;
}
if (obj.GetType() != GetType())
{
return false;
}
return Equals((ManagedNetworkSerializableType)obj);
}
public override int GetHashCode()
{
return 0;
}
}
public struct UnmanagedNetworkSerializableType : INetworkSerializable, IEquatable<UnmanagedNetworkSerializableType>
{
public FixedString32Bytes Str;
public int Int;
public int InMemoryValue;
public void NetworkSerialize<T>(BufferSerializer<T> serializer) where T : IReaderWriter
{
serializer.SerializeValue(ref Str);
serializer.SerializeValue(ref Int);
}
public bool Equals(UnmanagedNetworkSerializableType other)
{
return Str.Equals(other.Str) && Int == other.Int;
}
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
if (obj.GetType() != GetType())
{
return false;
}
return Equals((ManagedNetworkSerializableType)obj);
}
public override int GetHashCode()
{
return Str.GetHashCode() ^ Int.GetHashCode() ^ InMemoryValue.GetHashCode();
}
}
public struct UnmanagedTemplateNetworkSerializableType<T> : INetworkSerializable where T : unmanaged, INetworkSerializable
{
public T Value;
public void NetworkSerialize<TReaderWriterType>(BufferSerializer<TReaderWriterType> serializer) where TReaderWriterType : IReaderWriter
{
serializer.SerializeValue(ref Value);
}
}
public struct ManagedTemplateNetworkSerializableType<T> : INetworkSerializable where T : class, INetworkSerializable, new()
{
public T Value;
public void NetworkSerialize<TReaderWriterType>(BufferSerializer<TReaderWriterType> serializer) where TReaderWriterType : IReaderWriter
{
bool isNull = Value == null;
serializer.SerializeValue(ref isNull);
if (!isNull)
{
if (Value == null)
{
Value = new T();
}
serializer.SerializeValue(ref Value);
}
}
}
/// <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>();
private NetworkVariable<FixedString32Bytes> m_NetworkVariableFixedString32 = new NetworkVariable<FixedString32Bytes>();
private NetworkVariable<FixedString64Bytes> m_NetworkVariableFixedString64 = new NetworkVariable<FixedString64Bytes>();
private NetworkVariable<FixedString128Bytes> m_NetworkVariableFixedString128 = new NetworkVariable<FixedString128Bytes>();
private NetworkVariable<FixedString512Bytes> m_NetworkVariableFixedString512 = new NetworkVariable<FixedString512Bytes>();
private NetworkVariable<FixedString4096Bytes> m_NetworkVariableFixedString4096 = new NetworkVariable<FixedString4096Bytes>();
private NetworkVariable<ManagedNetworkSerializableType> m_NetworkVariableManaged = new NetworkVariable<ManagedNetworkSerializableType>();
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 NetworkVariableHelper<FixedString32Bytes> FixedString32_Var;
public NetworkVariableHelper<FixedString64Bytes> FixedString64_Var;
public NetworkVariableHelper<FixedString128Bytes> FixedString128_Var;
public NetworkVariableHelper<FixedString512Bytes> FixedString512_Var;
public NetworkVariableHelper<FixedString4096Bytes> FixedString4096_Var;
public NetworkVariableHelper<ManagedNetworkSerializableType> Managed_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>();
m_NetworkVariableFixedString32 = new NetworkVariable<FixedString32Bytes>();
m_NetworkVariableFixedString64 = new NetworkVariable<FixedString64Bytes>();
m_NetworkVariableFixedString128 = new NetworkVariable<FixedString128Bytes>();
m_NetworkVariableFixedString512 = new NetworkVariable<FixedString512Bytes>();
m_NetworkVariableFixedString4096 = new NetworkVariable<FixedString4096Bytes>();
m_NetworkVariableManaged = new NetworkVariable<ManagedNetworkSerializableType>();
// NetworkVariable Value Type Constructor Test Coverage
m_NetworkVariableBool = new NetworkVariable<bool>(true);
m_NetworkVariableByte = new NetworkVariable<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>(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);
m_NetworkVariableFixedString32 = new NetworkVariable<FixedString32Bytes>("1234567890");
m_NetworkVariableFixedString64 = new NetworkVariable<FixedString64Bytes>("1234567890");
m_NetworkVariableFixedString128 = new NetworkVariable<FixedString128Bytes>("1234567890");
m_NetworkVariableFixedString512 = new NetworkVariable<FixedString512Bytes>("1234567890");
m_NetworkVariableFixedString4096 = new NetworkVariable<FixedString4096Bytes>("1234567890");
m_NetworkVariableManaged = new NetworkVariable<ManagedNetworkSerializableType>(new ManagedNetworkSerializableType
{
Str = "1234567890",
Ints = new[] { 1, 2, 3, 4, 5 }
});
// 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);
FixedString32_Var = new NetworkVariableHelper<FixedString32Bytes>(m_NetworkVariableFixedString32);
FixedString64_Var = new NetworkVariableHelper<FixedString64Bytes>(m_NetworkVariableFixedString64);
FixedString128_Var = new NetworkVariableHelper<FixedString128Bytes>(m_NetworkVariableFixedString128);
FixedString512_Var = new NetworkVariableHelper<FixedString512Bytes>(m_NetworkVariableFixedString512);
FixedString4096_Var = new NetworkVariableHelper<FixedString4096Bytes>(m_NetworkVariableFixedString4096);
Managed_Var = new NetworkVariableHelper<ManagedNetworkSerializableType>(m_NetworkVariableManaged);
}
/// <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();
}
public void AssertAllValuesAreCorrect()
{
Assert.AreEqual(false, m_NetworkVariableBool.Value);
Assert.AreEqual(255, m_NetworkVariableByte.Value);
Assert.AreEqual(100, m_NetworkVariableColor.Value.r);
Assert.AreEqual(100, m_NetworkVariableColor.Value.g);
Assert.AreEqual(100, m_NetworkVariableColor.Value.b);
Assert.AreEqual(100, m_NetworkVariableColor32.Value.r);
Assert.AreEqual(100, m_NetworkVariableColor32.Value.g);
Assert.AreEqual(100, m_NetworkVariableColor32.Value.b);
Assert.AreEqual(100, m_NetworkVariableColor32.Value.a);
Assert.AreEqual(1000, m_NetworkVariableDouble.Value);
Assert.AreEqual(1000.0f, m_NetworkVariableFloat.Value);
Assert.AreEqual(1000, m_NetworkVariableInt.Value);
Assert.AreEqual(100000, m_NetworkVariableLong.Value);
Assert.AreEqual(-127, m_NetworkVariableSByte.Value);
Assert.AreEqual(100, m_NetworkVariableQuaternion.Value.w);
Assert.AreEqual(100, m_NetworkVariableQuaternion.Value.x);
Assert.AreEqual(100, m_NetworkVariableQuaternion.Value.y);
Assert.AreEqual(100, m_NetworkVariableQuaternion.Value.z);
Assert.AreEqual(short.MaxValue, m_NetworkVariableShort.Value);
Assert.AreEqual(1000, m_NetworkVariableVector4.Value.w);
Assert.AreEqual(1000, m_NetworkVariableVector4.Value.x);
Assert.AreEqual(1000, m_NetworkVariableVector4.Value.y);
Assert.AreEqual(1000, m_NetworkVariableVector4.Value.z);
Assert.AreEqual(1000, m_NetworkVariableVector3.Value.x);
Assert.AreEqual(1000, m_NetworkVariableVector3.Value.y);
Assert.AreEqual(1000, m_NetworkVariableVector3.Value.z);
Assert.AreEqual(1000, m_NetworkVariableVector2.Value.x);
Assert.AreEqual(1000, m_NetworkVariableVector2.Value.y);
Assert.AreEqual(Vector3.one.x, m_NetworkVariableRay.Value.origin.x);
Assert.AreEqual(Vector3.one.y, m_NetworkVariableRay.Value.origin.y);
Assert.AreEqual(Vector3.one.z, m_NetworkVariableRay.Value.origin.z);
Assert.AreEqual(Vector3.right.x, m_NetworkVariableRay.Value.direction.x);
Assert.AreEqual(Vector3.right.y, m_NetworkVariableRay.Value.direction.y);
Assert.AreEqual(Vector3.right.z, m_NetworkVariableRay.Value.direction.z);
Assert.AreEqual(ulong.MaxValue, m_NetworkVariableULong.Value);
Assert.AreEqual(uint.MaxValue, m_NetworkVariableUInt.Value);
Assert.AreEqual(ushort.MaxValue, m_NetworkVariableUShort.Value);
Assert.IsTrue(m_NetworkVariableFixedString32.Value.Equals("FixedString32Bytes"));
Assert.IsTrue(m_NetworkVariableFixedString64.Value.Equals("FixedString64Bytes"));
Assert.IsTrue(m_NetworkVariableFixedString128.Value.Equals("FixedString128Bytes"));
Assert.IsTrue(m_NetworkVariableFixedString512.Value.Equals("FixedString512Bytes"));
Assert.IsTrue(m_NetworkVariableFixedString4096.Value.Equals("FixedString4096Bytes"));
Assert.IsTrue(m_NetworkVariableManaged.Value.Equals(new ManagedNetworkSerializableType
{
Str = "ManagedNetworkSerializableType",
Ints = new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000 }
}));
}
// 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;
m_NetworkVariableFixedString32.Value = new FixedString32Bytes("FixedString32Bytes");
m_NetworkVariableFixedString64.Value = new FixedString64Bytes("FixedString64Bytes");
m_NetworkVariableFixedString128.Value = new FixedString128Bytes("FixedString128Bytes");
m_NetworkVariableFixedString512.Value = new FixedString512Bytes("FixedString512Bytes");
m_NetworkVariableFixedString4096.Value = new FixedString4096Bytes("FixedString4096Bytes");
m_NetworkVariableManaged.Value = new ManagedNetworkSerializableType
{
Str = "ManagedNetworkSerializableType",
Ints = new[] { 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000 }
};
//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;
}
}
}
}
}
}