Skip to content

Commit

Permalink
feat: add more control over player spawning (#626)
Browse files Browse the repository at this point in the history
* feat: add more control over player spawning

* add tests

* Update Assets/Mirage/Runtime/PlayerSpawner.cs

Co-authored-by: Paul Pacheco <paulpach@gmail.com>
  • Loading branch information
uweeby and paulpach committed Feb 22, 2021
1 parent 4b1560e commit e0dd626
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 3 deletions.
16 changes: 13 additions & 3 deletions Assets/Mirage/Runtime/PlayerSpawner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace Mirage
{

/// <summary>
/// Spawns a player as soon as the connection is authenticated
/// Spawns a player as soon as the connection is authenticated
/// </summary>
public class PlayerSpawner : MonoBehaviour
{
Expand All @@ -26,6 +26,11 @@ public class PlayerSpawner : MonoBehaviour
[FormerlySerializedAs("playerPrefab")]
public NetworkIdentity PlayerPrefab;

/// <summary>
/// Whether to span the player upon connection automatically
/// </summary>
public bool AutoSpawn = true;

// Start is called before the first frame update
public virtual void Start()
{
Expand Down Expand Up @@ -89,8 +94,13 @@ private void OnServerAuthenticated(INetworkConnection connection)
/// <param name="conn">Connection to the server.</param>
private void OnClientSceneChanged(string sceneName, SceneOperation sceneOperation)
{
if(sceneOperation == SceneOperation.Normal)
Client.Send(new AddPlayerMessage());
if (AutoSpawn && sceneOperation == SceneOperation.Normal)
RequestServerSpawnPlayer();
}

public virtual void RequestServerSpawnPlayer()
{
Client.Send(new AddPlayerMessage());
}

void OnServerAddPlayerInternal(INetworkConnection conn, AddPlayerMessage msg)
Expand Down
61 changes: 61 additions & 0 deletions Assets/Tests/Runtime/Host/PlayerSpawnerTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
using NUnit.Framework;
using UnityEngine;

namespace Mirage.Tests.Host
{
public class PlayerSpawnerTest : HostSetup<MockComponent>
{
AssetBundle bundle;
GameObject player;
PlayerSpawner spawner;

public override void ExtraSetup()
{
bundle = AssetBundle.LoadFromFile("Assets/Tests/Runtime/TestScene/testscene");

spawner = networkManagerGo.AddComponent<PlayerSpawner>();

spawner.Client = client;
spawner.Server = server;
spawner.SceneManager = sceneManager;
spawner.ClientObjectManager = clientObjectManager;
spawner.ServerObjectManager = serverObjectManager;

player = new GameObject();
NetworkIdentity identity = player.AddComponent<NetworkIdentity>();
spawner.PlayerPrefab = identity;

spawner.AutoSpawn = false;

spawner.Start();
}

public override void ExtraTearDown()
{
bundle.Unload(true);
Object.Destroy(player);
}

[Test]
public void DontAutoSpawnTest()
{
bool invokeAddPlayerMessage = false;
server.LocalConnection.RegisterHandler<AddPlayerMessage>(msg => invokeAddPlayerMessage = true);

sceneManager.ChangeServerScene("Assets/Mirror/Tests/Runtime/testScene.unity");

Assert.That(invokeAddPlayerMessage, Is.False);
}

[Test]
public void ManualSpawnTest()
{
bool invokeAddPlayerMessage = false;
server.LocalConnection.RegisterHandler<AddPlayerMessage>(msg => invokeAddPlayerMessage = true);

spawner.RequestServerSpawnPlayer();

Assert.That(invokeAddPlayerMessage, Is.False);
}
}
}
11 changes: 11 additions & 0 deletions Assets/Tests/Runtime/Host/PlayerSpawnerTest.cs.meta

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

0 comments on commit e0dd626

Please sign in to comment.