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.4] - 2021-01-04 ### Added - Added `com.unity.modules.physics` and `com.unity.modules.physics2d` package dependencies (#1565) ### Removed - Removed `com.unity.modules.ai` package dependency (#1565) - Removed `FixedQueue`, `StreamExtensions`, `TypeExtensions` (#1398) ### Fixed - Fixed in-scene NetworkObjects that are moved into the DDOL scene not getting restored to their original active state (enabled/disabled) after a full scene transition (#1354) - Fixed invalid IL code being generated when using `this` instead of `this ref` for the FastBufferReader/FastBufferWriter parameter of an extension method. (#1393) - Fixed an issue where if you are running as a server (not host) the LoadEventCompleted and UnloadEventCompleted events would fire early by the NetworkSceneManager (#1379) - Fixed a runtime error when sending an array of an INetworkSerializable type that's implemented as a struct (#1402) - NetworkConfig will no longer throw an OverflowException in GetConfig() when ForceSamePrefabs is enabled and the number of prefabs causes the config blob size to exceed 1300 bytes. (#1385) - Fixed NetworkVariable not calling NetworkSerialize on INetworkSerializable types (#1383) - Fixed NullReferenceException on ImportReferences call in NetworkBehaviourILPP (#1434) - Fixed NetworkObjects not being despawned before they are destroyed during shutdown for client, host, and server instances. (#1390) - Fixed KeyNotFound exception when removing ownership of a newly spawned NetworkObject that is already owned by the server. (#1500) - Fixed NetworkManager.LocalClient not being set when starting as a host. (#1511) - Fixed a few memory leak cases when shutting down NetworkManager during Incoming Message Queue processing. (#1323) ### Changed - The SDK no longer limits message size to 64k. (The transport may still impose its own limits, but the SDK no longer does.) (#1384) - Updated com.unity.collections to 1.1.0 (#1451)
157 lines
6.5 KiB
C#
157 lines
6.5 KiB
C#
using System.Collections;
|
|
using NUnit.Framework;
|
|
using UnityEngine;
|
|
using UnityEngine.TestTools;
|
|
|
|
namespace Unity.Netcode.RuntimeTests
|
|
{
|
|
public class NetworkObjectOwnershipComponent : NetworkBehaviour
|
|
{
|
|
public bool OnLostOwnershipFired = false;
|
|
public ulong CachedOwnerIdOnLostOwnership = 0;
|
|
|
|
public override void OnLostOwnership()
|
|
{
|
|
OnLostOwnershipFired = true;
|
|
CachedOwnerIdOnLostOwnership = OwnerClientId;
|
|
}
|
|
|
|
public bool OnGainedOwnershipFired = false;
|
|
public ulong CachedOwnerIdOnGainedOwnership = 0;
|
|
|
|
public override void OnGainedOwnership()
|
|
{
|
|
OnGainedOwnershipFired = true;
|
|
CachedOwnerIdOnGainedOwnership = OwnerClientId;
|
|
}
|
|
}
|
|
|
|
[TestFixture(true)]
|
|
[TestFixture(false)]
|
|
public class NetworkObjectOwnershipTests
|
|
{
|
|
private const int k_ClientInstanceCount = 1;
|
|
|
|
private NetworkManager m_ServerNetworkManager;
|
|
private NetworkManager[] m_ClientNetworkManagers;
|
|
|
|
private GameObject m_DummyPrefab;
|
|
private GameObject m_DummyGameObject;
|
|
|
|
private readonly bool m_IsHost;
|
|
|
|
public NetworkObjectOwnershipTests(bool isHost)
|
|
{
|
|
m_IsHost = isHost;
|
|
}
|
|
|
|
[UnitySetUp]
|
|
public IEnumerator Setup()
|
|
{
|
|
// we need at least 1 client for tests
|
|
Assert.That(k_ClientInstanceCount, Is.GreaterThan(0));
|
|
|
|
// create NetworkManager instances
|
|
Assert.That(MultiInstanceHelpers.Create(k_ClientInstanceCount, out m_ServerNetworkManager, out m_ClientNetworkManagers));
|
|
Assert.That(m_ServerNetworkManager, Is.Not.Null);
|
|
Assert.That(m_ClientNetworkManagers, Is.Not.Null);
|
|
Assert.That(m_ClientNetworkManagers.Length, Is.EqualTo(k_ClientInstanceCount));
|
|
|
|
// create and register our ad-hoc DummyPrefab (we'll spawn it later during tests)
|
|
m_DummyPrefab = new GameObject("DummyPrefabPrototype");
|
|
m_DummyPrefab.AddComponent<NetworkObject>();
|
|
m_DummyPrefab.AddComponent<NetworkObjectOwnershipComponent>();
|
|
MultiInstanceHelpers.MakeNetworkObjectTestPrefab(m_DummyPrefab.GetComponent<NetworkObject>());
|
|
m_ServerNetworkManager.NetworkConfig.NetworkPrefabs.Add(new NetworkPrefab { Prefab = m_DummyPrefab });
|
|
foreach (var clientNetworkManager in m_ClientNetworkManagers)
|
|
{
|
|
clientNetworkManager.NetworkConfig.NetworkPrefabs.Add(new NetworkPrefab { Prefab = m_DummyPrefab });
|
|
}
|
|
|
|
// start server and client NetworkManager instances
|
|
Assert.That(MultiInstanceHelpers.Start(m_IsHost, m_ServerNetworkManager, m_ClientNetworkManagers));
|
|
|
|
// wait for connection on client side
|
|
yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnected(m_ClientNetworkManagers));
|
|
|
|
// wait for connection on server side
|
|
yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientConnectedToServer(m_ServerNetworkManager));
|
|
}
|
|
|
|
[TearDown]
|
|
public void Teardown()
|
|
{
|
|
MultiInstanceHelpers.Destroy();
|
|
|
|
if (m_DummyGameObject != null)
|
|
{
|
|
Object.DestroyImmediate(m_DummyGameObject);
|
|
}
|
|
|
|
if (m_DummyPrefab != null)
|
|
{
|
|
Object.DestroyImmediate(m_DummyPrefab);
|
|
}
|
|
}
|
|
|
|
[UnityTest]
|
|
public IEnumerator TestOwnershipCallbacks()
|
|
{
|
|
m_DummyGameObject = Object.Instantiate(m_DummyPrefab);
|
|
var dummyNetworkObject = m_DummyGameObject.GetComponent<NetworkObject>();
|
|
Assert.That(dummyNetworkObject, Is.Not.Null);
|
|
|
|
dummyNetworkObject.NetworkManagerOwner = m_ServerNetworkManager;
|
|
dummyNetworkObject.Spawn();
|
|
var dummyNetworkObjectId = dummyNetworkObject.NetworkObjectId;
|
|
Assert.That(dummyNetworkObjectId, Is.GreaterThan(0));
|
|
|
|
int nextFrameNumber = Time.frameCount + 2;
|
|
yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber);
|
|
|
|
Assert.That(m_ServerNetworkManager.SpawnManager.SpawnedObjects.ContainsKey(dummyNetworkObjectId));
|
|
foreach (var clientNetworkManager in m_ClientNetworkManagers)
|
|
{
|
|
Assert.That(clientNetworkManager.SpawnManager.SpawnedObjects.ContainsKey(dummyNetworkObjectId));
|
|
}
|
|
|
|
// Verifies that removing the ownership when the default (server) is already set does not cause
|
|
// a Key Not Found Exception
|
|
m_ServerNetworkManager.SpawnManager.RemoveOwnership(dummyNetworkObject);
|
|
|
|
var serverObject = m_ServerNetworkManager.SpawnManager.SpawnedObjects[dummyNetworkObjectId];
|
|
var clientObject = m_ClientNetworkManagers[0].SpawnManager.SpawnedObjects[dummyNetworkObjectId];
|
|
Assert.That(serverObject, Is.Not.Null);
|
|
Assert.That(clientObject, Is.Not.Null);
|
|
|
|
var serverComponent = serverObject.GetComponent<NetworkObjectOwnershipComponent>();
|
|
var clientComponent = clientObject.GetComponent<NetworkObjectOwnershipComponent>();
|
|
Assert.That(serverComponent, Is.Not.Null);
|
|
Assert.That(clientComponent, Is.Not.Null);
|
|
|
|
|
|
Assert.That(serverObject.OwnerClientId, Is.EqualTo(m_ServerNetworkManager.ServerClientId));
|
|
Assert.That(clientObject.OwnerClientId, Is.EqualTo(m_ClientNetworkManagers[0].ServerClientId));
|
|
|
|
Assert.That(m_ServerNetworkManager.ConnectedClients.ContainsKey(m_ClientNetworkManagers[0].LocalClientId));
|
|
serverObject.ChangeOwnership(m_ClientNetworkManagers[0].LocalClientId);
|
|
|
|
nextFrameNumber = Time.frameCount + 2;
|
|
yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber);
|
|
|
|
|
|
Assert.That(clientComponent.OnGainedOwnershipFired);
|
|
Assert.That(clientComponent.CachedOwnerIdOnGainedOwnership, Is.EqualTo(m_ClientNetworkManagers[0].LocalClientId));
|
|
serverObject.ChangeOwnership(m_ServerNetworkManager.ServerClientId);
|
|
|
|
nextFrameNumber = Time.frameCount + 2;
|
|
yield return new WaitUntil(() => Time.frameCount >= nextFrameNumber);
|
|
|
|
|
|
Assert.That(serverObject.OwnerClientId, Is.EqualTo(m_ServerNetworkManager.LocalClientId));
|
|
Assert.That(clientComponent.OnLostOwnershipFired);
|
|
Assert.That(clientComponent.CachedOwnerIdOnLostOwnership, Is.EqualTo(m_ClientNetworkManagers[0].LocalClientId));
|
|
}
|
|
}
|
|
}
|