using System.Collections.Generic;
using UnityEngine;
namespace Mirror
{
// the name NetworkProximityCheck implies that it's only about objects in
// proximity to the player. But we might have room based, guild based,
// instanced based checks too, so NetworkVisibility is more fitting.
//
// note: we inherit from NetworkBehaviour so we can reuse .netIdentity, etc.
// note: unlike UNET, we only allow 1 proximity checker per NetworkIdentity.
[DisallowMultipleComponent]
public abstract class NetworkVisibility : NetworkBehaviour
{
///
/// Callback used by the visibility system to determine if an observer (player) can see this object.
/// If this function returns true, the network connection will be added as an observer.
///
/// Network connection of a player.
/// True if the player can see this object.
public abstract bool OnCheckObserver(NetworkConnection conn);
///
/// Callback used by the visibility system to (re)construct the set of observers that can see this object.
/// Implementations of this callback should add network connections of players that can see this object to the observers set.
///
/// The new set of observers for this object.
/// True if the set of observers is being built for the first time.
public abstract void OnRebuildObservers(HashSet observers, bool initialize);
///
/// 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.
///
/// New visibility state.
public virtual void OnSetHostVisibility(bool visible)
{
foreach (Renderer rend in GetComponentsInChildren())
rend.enabled = visible;
}
}
}