1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- // interest management component for custom solutions like
- // distance based, spatial hashing, raycast based, etc.
- using System.Collections.Generic;
- using UnityEngine;
- namespace Mirror
- {
- [DisallowMultipleComponent]
- public abstract class InterestManagement : MonoBehaviour
- {
- // Awake configures InterestManagement in NetworkServer/Client
- 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.");
- }
- // 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, NetworkConnection newObserver);
- // rebuild observers for the given NetworkIdentity.
- // Server will automatically spawn/despawn added/removed ones.
- // newObservers: cached hashset to put the result into
- // initialize: true if being rebuilt for the first time
- //
- // IMPORTANT:
- // => global rebuild would be more simple, BUT
- // => local rebuild is way faster for spawn/despawn because we can
- // simply rebuild a select NetworkIdentity only
- // => having both .observers and .observing is necessary for local
- // rebuilds
- //
- // in other words, this is the perfect solution even though it's not
- // completely simple (due to .observers & .observing).
- //
- // Mirror maintains .observing automatically in the background. best of
- // both worlds without any worrying now!
- public abstract void OnRebuildObservers(NetworkIdentity identity, HashSet<NetworkConnection> newObservers, bool initialize);
- // helper function to trigger a full rebuild.
- // most implementations should call this in a certain interval.
- // some might call this all the time, or only on team changes or
- // scene changes and so on.
- //
- // IMPORTANT: check if NetworkServer.active when using Update()!
- protected void RebuildAll()
- {
- foreach (NetworkIdentity identity in NetworkIdentity.spawned.Values)
- {
- NetworkServer.RebuildObservers(identity, false);
- }
- }
- // 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!
- 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)
- 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)
- public virtual void OnDestroyed(NetworkIdentity identity) {}
- }
- }
|