-
-
Notifications
You must be signed in to change notification settings - Fork 65
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(NetworkVisibility): adding new visibility scripts for checking s…
…cenes (#958)
- Loading branch information
1 parent
9ec2575
commit 6725625
Showing
6 changed files
with
105 additions
and
0 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
77 changes: 77 additions & 0 deletions
77
Assets/Mirage/Components/Visibility/SceneChecking/SceneVisibilityChecker.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} | ||
} | ||
} |
11 changes: 11 additions & 0 deletions
11
Assets/Mirage/Components/Visibility/SceneChecking/SceneVisibilityChecker.cs.meta
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.