Skip to content

Commit

Permalink
feat(NetworkVisibility): adding new visibility scripts for checking s…
Browse files Browse the repository at this point in the history
…cenes (#958)
  • Loading branch information
James-Frowen committed Nov 2, 2021
1 parent 9ec2575 commit 6725625
Show file tree
Hide file tree
Showing 6 changed files with 105 additions and 0 deletions.
8 changes: 8 additions & 0 deletions Assets/Mirage/Components/Visibility.meta

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

8 changes: 8 additions & 0 deletions Assets/Mirage/Components/Visibility/SceneChecking.meta

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

Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ namespace Mirage
[AddComponentMenu("Network/NetworkSceneChecker")]
[RequireComponent(typeof(NetworkIdentity))]
[HelpURL("https://miragenet.github.io/Mirage/Articles/Components/NetworkSceneChecker.html")]
[System.Obsolete("This checker is inefficient, use SimpleSceneChecker instead")]
public class NetworkSceneChecker : NetworkVisibility
{
static readonly ILogger logger = LogFactory.GetLogger(typeof(NetworkSceneChecker));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
using System.Collections.Generic;
using Mirage.Logging;
using UnityEngine;
using UnityEngine.SceneManagement;

namespace Mirage
{
public class SceneVisibilityChecker : NetworkVisibility
{
static readonly ILogger logger = LogFactory.GetLogger<SceneVisibilityChecker>();

public override bool OnCheckObserver(INetworkPlayer player)
{
NetworkIdentity character = player.Identity;
if (character == null)
{
if (logger.LogEnabled()) logger.Log($"SceneChecker: {player} had no character");
return false;
}

Scene playerScene = character.gameObject.scene;
if (!playerScene.IsValid())
{
if (logger.WarnEnabled()) logger.LogWarning($"SceneChecker: Could not find scene for {player}");
return false;
}

Scene thisScene = gameObject.scene;
bool visible = playerScene == thisScene;
if (logger.LogEnabled()) logger.Log($"SceneChecker: {player} can see '{this}': {visible}");
return visible;
}

public override void OnRebuildObservers(HashSet<INetworkPlayer> observers, bool initialize)
{
foreach (INetworkPlayer player in Server.Players)
{
if (OnCheckObserver(player))
{
observers.Add(player);
}
}
}

/// <summary>
/// Call this function on an object to move it to a new scene and rebuild its observers
/// </summary>
/// <param name="scene"></param>
public void MoveToScene(Scene scene)
{
INetworkPlayer owner = Identity.Owner;

// remove player from other clients
removeObservers(Identity);

// remove other objects from player
if (owner != null)
owner.RemoveAllVisibleObjects();

// move player to new scene
SceneManager.MoveGameObjectToScene(Identity.gameObject, scene);

// spawn new objects for player
if (owner != null)
ServerObjectManager.SpawnVisibleObjects(Identity.Owner);
}

private void removeObservers(NetworkIdentity identity)
{
HashSet<INetworkPlayer> observers = identity.observers;
foreach (INetworkPlayer observer in observers)
{
observer.RemoveFromVisList(identity);
}
}
}
}

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

0 comments on commit 6725625

Please sign in to comment.