Skip to content

Commit

Permalink
feat: InterestManagementBase
Browse files Browse the repository at this point in the history
A interest management base class that allows more advanced interest management by bypassing the built-in HashSet checks via Rebuild overriding
  • Loading branch information
imerr committed Feb 16, 2023
1 parent c2d8343 commit 5750978
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 57 deletions.
57 changes: 2 additions & 55 deletions Assets/Mirror/Core/InterestManagement.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,40 +8,12 @@ namespace Mirror
{
[DisallowMultipleComponent]
[HelpURL("https://mirror-networking.gitbook.io/docs/guides/interest-management")]
public abstract class InterestManagement : MonoBehaviour
public abstract class InterestManagement : InterestManagementBase
{
// allocate newObservers helper HashSet
readonly HashSet<NetworkConnectionToClient> newObservers =
new HashSet<NetworkConnectionToClient>();

// Awake configures InterestManagement in NetworkServer/Client
// Do NOT check for active server or client here.
// Awake must always set the static aoi references.
// make sure to call base.Awake when overwriting!
protected virtual void Awake()
{
if (NetworkServer.aoi == null)
{
NetworkServer.aoi = this;
}
else Debug.LogError($"Only one InterestManagement component allowed. {NetworkServer.aoi.GetType()} has been set up already.");

if (NetworkClient.aoi == null)
{
NetworkClient.aoi = this;
}
else Debug.LogError($"Only one InterestManagement component allowed. {NetworkClient.aoi.GetType()} has been set up already.");
}

[ServerCallback]
public virtual void Reset() {}

// Callback used by the visibility system to determine if an observer
// (player) can see the NetworkIdentity. If this function returns true,
// the network connection will be added as an observer.
// conn: Network connection of a player.
// returns True if the player can see this object.
public abstract bool OnCheckObserver(NetworkIdentity identity, NetworkConnectionToClient newObserver);

// rebuild observers for the given NetworkIdentity.
// Server will automatically spawn/despawn added/removed ones.
Expand Down Expand Up @@ -77,32 +49,7 @@ protected void RebuildAll()
}
}

// Callback used by the visibility system for objects on a host.
// Objects on a host (with a local client) cannot be disabled or
// destroyed when they are not visible to the local client. So this
// function is called to allow custom code to hide these objects. A
// typical implementation will disable renderer components on the
// object. This is only called on local clients on a host.
// => need the function in here and virtual so people can overwrite!
// => not everyone wants to hide renderers!
[ServerCallback]
public virtual void SetHostVisibility(NetworkIdentity identity, bool visible)
{
foreach (Renderer rend in identity.GetComponentsInChildren<Renderer>())
rend.enabled = visible;
}

/// <summary>Called on the server when a new networked object is spawned.</summary>
// (useful for 'only rebuild if changed' interest management algorithms)
[ServerCallback]
public virtual void OnSpawned(NetworkIdentity identity) {}

/// <summary>Called on the server when a networked object is destroyed.</summary>
// (useful for 'only rebuild if changed' interest management algorithms)
[ServerCallback]
public virtual void OnDestroyed(NetworkIdentity identity) {}

public void Rebuild(NetworkIdentity identity, bool initialize)
public override void Rebuild(NetworkIdentity identity, bool initialize)
{
// clear newObservers hashset before using it
newObservers.Clear();
Expand Down
91 changes: 91 additions & 0 deletions Assets/Mirror/Core/InterestManagementBase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
// interest management component for custom solutions like
// distance based, spatial hashing, raycast based, etc.
using System.Collections.Generic;
using UnityEngine;

namespace Mirror
{
[DisallowMultipleComponent]
[HelpURL("https://mirror-networking.gitbook.io/docs/guides/interest-management")]
public abstract class InterestManagementBase : MonoBehaviour
{
// Awake configures LowLevelInterestManagement in NetworkServer/Client
// Do NOT check for active server or client here.
// Awake must always set the static aoi references.
// make sure to call base.Awake when overwriting!
protected virtual void Awake()
{
if (NetworkServer.aoi == null)
{
NetworkServer.aoi = this;
}
else Debug.LogError($"Only one InterestManagement component allowed. {NetworkServer.aoi.GetType()} has been set up already.");

if (NetworkClient.aoi == null)
{
NetworkClient.aoi = this;
}
else Debug.LogError($"Only one InterestManagement component allowed. {NetworkClient.aoi.GetType()} has been set up already.");
}

[ServerCallback]
public virtual void Reset() {}

// Callback used by the visibility system to determine if an observer
// (player) can see the NetworkIdentity. If this function returns true,
// the network connection will be added as an observer.
// conn: Network connection of a player.
// returns True if the player can see this object.
public abstract bool OnCheckObserver(NetworkIdentity identity, NetworkConnectionToClient newObserver);


// Callback used by the visibility system for objects on a host.
// Objects on a host (with a local client) cannot be disabled or
// destroyed when they are not visible to the local client. So this
// function is called to allow custom code to hide these objects. A
// typical implementation will disable renderer components on the
// object. This is only called on local clients on a host.
// => need the function in here and virtual so people can overwrite!
// => not everyone wants to hide renderers!
[ServerCallback]
public virtual void SetHostVisibility(NetworkIdentity identity, bool visible)
{
foreach (Renderer rend in identity.GetComponentsInChildren<Renderer>())
rend.enabled = visible;
}

/// <summary>Called on the server when a new networked object is spawned.</summary>
// (useful for 'only rebuild if changed' interest management algorithms)
[ServerCallback]
public virtual void OnSpawned(NetworkIdentity identity) {}

/// <summary>Called on the server when a networked object is destroyed.</summary>
// (useful for 'only rebuild if changed' interest management algorithms)
[ServerCallback]
public virtual void OnDestroyed(NetworkIdentity identity) {}

public abstract void Rebuild(NetworkIdentity identity, bool initialize);

/// <summary>
/// Adds the specified connection to the observers of identity
/// </summary>
/// <param name="identity"></param>
/// <param name="connection"></param>
protected void AddObserver(NetworkConnectionToClient connection, NetworkIdentity identity)
{
connection.AddToObserving(identity);
identity.observers.Add(connection.connectionId, connection);
}

/// <summary>
/// Removes the specified connection from the observers of identity
/// </summary>
/// <param name="identity"></param>
/// <param name="connection"></param>
protected void RemoveObserver(NetworkConnectionToClient connection, NetworkIdentity identity)
{
connection.RemoveFromObserving(identity, false);
identity.observers.Remove(connection.connectionId);
}
}
}
3 changes: 3 additions & 0 deletions Assets/Mirror/Core/InterestManagementBase.cs.meta

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

2 changes: 1 addition & 1 deletion Assets/Mirror/Core/NetworkClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ public static partial class NetworkClient

// interest management component (optional)
// only needed for SetHostVisibility
public static InterestManagement aoi;
public static InterestManagementBase aoi;

// scene loading
public static bool isLoadingScene;
Expand Down
2 changes: 1 addition & 1 deletion Assets/Mirror/Core/NetworkServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public static partial class NetworkServer

// interest management component (optional)
// by default, everyone observes everyone
public static InterestManagement aoi;
public static InterestManagementBase aoi;

// OnConnected / OnDisconnected used to be NetworkMessages that were
// invoked. this introduced a bug where external clients could send
Expand Down

0 comments on commit 5750978

Please sign in to comment.