Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions com.unity.netcode.gameobjects/Runtime/Core/NetworkObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,11 @@ private void Awake()
/// <param name="clientId">The client to show the <see cref="NetworkObject"/> to</param>
public void NetworkShow(ulong clientId)
{
if (clientId == OwnerClientId)
{
NetworkLog.LogWarning($"Trying to enable NetworkID {clientId} to view itself; ignoring");
return;
}
if (!IsSpawned)
{
throw new SpawnStateException("Object is not spawned");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,10 @@ public class NetworkVariableTests : BaseMultiInstanceTest
private NetworkVariableTest m_Player1OnClient1;

// Player2 component on client1
private NetworkVariableTest m_Player1OnClient2;
private NetworkVariableTest m_Player2OnClient2;

// client2's version of client1's player object
private NetworkVariableTest m_Player1FromClient2;
private NetworkVariableTest m_Player1OnClient2;

private bool m_TestWithHost;

Expand Down Expand Up @@ -123,15 +123,15 @@ public override IEnumerator Setup()
x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[1].LocalClientId,
m_ClientNetworkManagers[1], result));

m_Player1OnClient2 = result.Result.GetComponent<NetworkVariableTest>();
m_Player2OnClient2 = result.Result.GetComponent<NetworkVariableTest>();

// This is client2's view of client 1's object
yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation(
x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId,
m_ClientNetworkManagers[1], result));

// var client2client1 = result.Result;
m_Player1FromClient2 = result.Result.GetComponent<NetworkVariableTest>();
m_Player1OnClient2 = result.Result.GetComponent<NetworkVariableTest>();

m_Player1OnServer.TheList.Clear();
m_Player1OnServer.TheSet.Clear();
Expand Down Expand Up @@ -222,7 +222,7 @@ public IEnumerator ClientTest([Values(true, false)] bool useHost)
() =>
{
m_Player1OnClient1.ClientVar.Value = k_TestVal2;
m_Player1OnClient2.ClientVar.Value = k_TestVal3;
m_Player2OnClient2.ClientVar.Value = k_TestVal3;
},
() =>
{
Expand All @@ -231,7 +231,7 @@ public IEnumerator ClientTest([Values(true, false)] bool useHost)
m_Player1OnServer.ClientVar.Value == k_TestVal2 &&
m_Player2OnServer.ClientVar.Value == k_TestVal3 &&
m_Player1OnClient1.ClientVar.Value == k_TestVal2 &&
m_Player1OnClient2.ClientVar.Value == k_TestVal3;
m_Player2OnClient2.ClientVar.Value == k_TestVal3;
}
);
}
Expand All @@ -253,9 +253,9 @@ public IEnumerator PrivateClientTest([Values(true, false)] bool useHost)
// ...and we should see the writes to the private var only on the server & the owner,
// but the public variable everywhere
return
m_Player1FromClient2.ClientVarPrivate.Value != k_TestVal1 &&
m_Player1OnClient2.ClientVarPrivate.Value != k_TestVal1 &&
m_Player1OnClient1.ClientVarPrivate.Value == k_TestVal1 &&
m_Player1FromClient2.ClientVar.Value != k_TestVal2 &&
m_Player1OnClient2.ClientVar.Value != k_TestVal2 &&
m_Player1OnClient1.ClientVar.Value == k_TestVal2 &&
m_Player1OnServer.ClientVarPrivate.Value == k_TestVal1 &&
m_Player1OnServer.ClientVar.Value == k_TestVal2;
Expand Down
141 changes: 141 additions & 0 deletions com.unity.netcode.gameobjects/Tests/Runtime/VisibilityTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.TestTools;
using NUnit.Framework;

namespace Unity.Netcode.RuntimeTests
{
public class VisibilityComponent : NetworkBehaviour
{
public readonly NetworkVariable<int> SomeVar = new NetworkVariable<int>();

public void Awake()
{
}
}

public class VisibilityTests : BaseMultiInstanceTest
{
protected override int NbClients => 2;

// Player1 component on the server
private VisibilityComponent m_Player1OnServer;

// Player2 component on the server
private VisibilityComponent m_Player2OnServer;

// Player1 component on client1
private VisibilityComponent m_Player1OnClient1;

// Player2 component on client1
private VisibilityComponent m_Player2OnClient2;

// client2's version of client1's player object
private VisibilityComponent m_Player1OnClient2;

private bool m_TestWithHost;

[UnitySetUp]
public override IEnumerator Setup()
{
yield return StartSomeClientsAndServerWithPlayers(useHost: m_TestWithHost, nbClients: NbClients,
updatePlayerPrefab: playerPrefab =>
{
var networkTransform = playerPrefab.AddComponent<VisibilityComponent>(); //??
});

// These are the *SERVER VERSIONS* of the *CLIENT PLAYER 1 & 2*
var result = new MultiInstanceHelpers.CoroutineResultWrapper<NetworkObject>();

yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation(
x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId,
m_ServerNetworkManager, result));
m_Player1OnServer = result.Result.GetComponent<VisibilityComponent>();

yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation(
x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[1].LocalClientId,
m_ServerNetworkManager, result));
m_Player2OnServer = result.Result.GetComponent<VisibilityComponent>();

// This is client1's view of itself
yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation(
x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId,
m_ClientNetworkManagers[0], result));

m_Player1OnClient1 = result.Result.GetComponent<VisibilityComponent>();

// This is client2's view of itself
result = new MultiInstanceHelpers.CoroutineResultWrapper<NetworkObject>();
yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation(
x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[1].LocalClientId,
m_ClientNetworkManagers[1], result));

m_Player2OnClient2 = result.Result.GetComponent<VisibilityComponent>();

// This is client2's view of client 1's object
yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.GetNetworkObjectByRepresentation(
x => x.IsPlayerObject && x.OwnerClientId == m_ClientNetworkManagers[0].LocalClientId,
m_ClientNetworkManagers[1], result));

// var client2client1 = result.Result;
m_Player1OnClient2 = result.Result.GetComponent<VisibilityComponent>();
}


[UnityTest]
public IEnumerator SomeTest1([Values(true, false)] bool useHost)
{
m_TestWithHost = useHost;
var client1Id = m_Player1OnServer.NetworkObject.OwnerClientId;
var client2Id = m_Player2OnServer.NetworkObject.OwnerClientId;

// todo: check rpc
// todo: see if clients can set visibility
yield return MultiInstanceHelpers.RunAndWaitForCondition(
() =>
{
// m_Player1OnServer.NetworkObject.NetworkShow(client1Id); // check, should break?
// m_Player1OnServer.NetworkObject.NetworkShow(client2Id); // check, should break
m_Player1OnServer.SomeVar.Value = 1;
},
() =>
{
return m_Player1OnClient1.SomeVar.Value == 1 &&
m_Player1OnClient2.SomeVar.Value == 1;
}
);
yield return MultiInstanceHelpers.RunAndWaitForCondition(
() =>
{
m_Player1OnServer.NetworkObject.NetworkHide(client2Id);
m_Player1OnServer.SomeVar.Value = 2;
},
() =>
{
return m_Player1OnClient1.SomeVar.Value == 2 &&
m_Player1OnClient2.SomeVar.Value == 1;
}
);
yield return MultiInstanceHelpers.RunAndWaitForCondition(
() =>
{
m_Player1OnServer.NetworkObject.NetworkShow(client2Id);
m_Player1OnServer.SomeVar.Value = 3; // SHOULD NOT NEED
},
() =>
{
Debug.Log(m_Player1OnClient1.SomeVar.Value + ", " + m_Player1OnClient2.SomeVar.Value);
return m_Player1OnClient1.SomeVar.Value == 3 &&
m_Player1OnClient2.SomeVar.Value == 3; // this breaks, client2 does not get the update
}
);
}

[UnityTearDown]
public override IEnumerator Teardown()
{
yield return base.Teardown();
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.