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.0-pre.7] - 2022-04-01 ### Added - Added editor only check prior to entering into play mode if the currently open and active scene is in the build list and if not displays a dialog box asking the user if they would like to automatically add it prior to entering into play mode. (#1828) - Added `UnityTransport` implementation and `com.unity.transport` package dependency (#1823) - Added `NetworkVariableWritePermission` to `NetworkVariableBase` and implemented `Owner` client writable netvars. (#1762) - `UnityTransport` settings can now be set programmatically. (#1845) - `FastBufferWriter` and Reader IsInitialized property. (#1859) ### Changed - Updated `UnityTransport` dependency on `com.unity.transport` to 1.0.0 (#1849) ### Removed - Removed `SnapshotSystem` (#1852) - Removed `com.unity.modules.animation`, `com.unity.modules.physics` and `com.unity.modules.physics2d` dependencies from the package (#1812) - Removed `com.unity.collections` dependency from the package (#1849) ### Fixed - Fixed in-scene placed NetworkObjects not being found/ignored after a client disconnects and then reconnects. (#1850) - Fixed issue where `UnityTransport` send queues were not flushed when calling `DisconnectLocalClient` or `DisconnectRemoteClient`. (#1847) - Fixed NetworkBehaviour dependency verification check for an existing NetworkObject not searching from root parent transform relative GameObject. (#1841) - Fixed issue where entries were not being removed from the NetworkSpawnManager.OwnershipToObjectsTable. (#1838) - Fixed ClientRpcs would always send to all connected clients by default as opposed to only sending to the NetworkObject's Observers list by default. (#1836) - Fixed clarity for NetworkSceneManager client side notification when it receives a scene hash value that does not exist in its local hash table. (#1828) - Fixed client throws a key not found exception when it times out using UNet or UTP. (#1821) - Fixed network variable updates are no longer limited to 32,768 bytes when NetworkConfig.EnsureNetworkVariableLengthSafety is enabled. The limits are now determined by what the transport can send in a message. (#1811) - Fixed in-scene NetworkObjects get destroyed if a client fails to connect and shuts down the NetworkManager. (#1809) - Fixed user never being notified in the editor that a NetworkBehaviour requires a NetworkObject to function properly. (#1808) - Fixed PlayerObjects and dynamically spawned NetworkObjects not being added to the NetworkClient's OwnedObjects (#1801) - Fixed issue where NetworkManager would continue starting even if the NetworkTransport selected failed. (#1780) - Fixed issue when spawning new player if an already existing player exists it does not remove IsPlayer from the previous player (#1779) - Fixed lack of notification that NetworkManager and NetworkObject cannot be added to the same GameObject with in-editor notifications (#1777) - Fixed parenting warning printing for false positives (#1855)
86 lines
3.6 KiB
C#
86 lines
3.6 KiB
C#
using NUnit.Framework;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Unity.Netcode.Transports.UTP;
|
|
using UnityEngine;
|
|
|
|
namespace Unity.Netcode.RuntimeTests
|
|
{
|
|
public static class UnityTransportTestHelpers
|
|
{
|
|
// Half a second might seem like a very long time to wait for a network event, but in CI
|
|
// many of the machines are underpowered (e.g. old Android devices or Macs) and there are
|
|
// sometimes very high lag spikes. PS4 and Switch are particularly sensitive in this regard
|
|
// so we allow even more time for these platforms.
|
|
public const float MaxNetworkEventWaitTime = 0.5f;
|
|
|
|
// Wait for an event to appear in the given event list (must be the very next event).
|
|
public static IEnumerator WaitForNetworkEvent(NetworkEvent type, List<TransportEvent> events, float timeout = MaxNetworkEventWaitTime)
|
|
{
|
|
int initialCount = events.Count;
|
|
float startTime = Time.realtimeSinceStartup;
|
|
|
|
while (Time.realtimeSinceStartup - startTime < timeout)
|
|
{
|
|
if (events.Count > initialCount)
|
|
{
|
|
Assert.AreEqual(type, events[initialCount].Type);
|
|
yield break;
|
|
}
|
|
|
|
yield return new WaitForSeconds(0.01f);
|
|
}
|
|
|
|
Assert.Fail("Timed out while waiting for network event.");
|
|
}
|
|
|
|
// Common code to initialize a UnityTransport that logs its events.
|
|
public static void InitializeTransport(out UnityTransport transport, out List<TransportEvent> events, int maxPayloadSize = UnityTransport.InitialMaxPayloadSize)
|
|
{
|
|
var logger = new TransportEventLogger();
|
|
events = logger.Events;
|
|
|
|
transport = new GameObject().AddComponent<UnityTransport>();
|
|
transport.OnTransportEvent += logger.HandleEvent;
|
|
transport.SetMaxPayloadSize(maxPayloadSize);
|
|
transport.Initialize();
|
|
}
|
|
|
|
// Information about an event generated by a transport (basically just the parameters that
|
|
// are normally passed along to a TransportEventDelegate).
|
|
public struct TransportEvent
|
|
{
|
|
public NetworkEvent Type;
|
|
public ulong ClientID;
|
|
public ArraySegment<byte> Data;
|
|
public float ReceiveTime;
|
|
}
|
|
// Utility class that logs events generated by a UnityTransport. Set it up by adding the
|
|
// HandleEvent method as an OnTransportEvent delegate of the transport. The list of events
|
|
// (in order in which they were generated) can be accessed through the Events property.
|
|
public class TransportEventLogger
|
|
{
|
|
private readonly List<TransportEvent> m_Events = new List<TransportEvent>();
|
|
public List<TransportEvent> Events => m_Events;
|
|
public void HandleEvent(NetworkEvent type, ulong clientID, ArraySegment<byte> data, float receiveTime)
|
|
{
|
|
// Copy the data since the backing array will be reused for future messages.
|
|
if (data != default(ArraySegment<byte>))
|
|
{
|
|
var dataCopy = new byte[data.Count];
|
|
Array.Copy(data.Array, data.Offset, dataCopy, 0, data.Count);
|
|
data = new ArraySegment<byte>(dataCopy);
|
|
}
|
|
m_Events.Add(new TransportEvent
|
|
{
|
|
Type = type,
|
|
ClientID = clientID,
|
|
Data = data,
|
|
ReceiveTime = receiveTime
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|