mirror of
https://github.com/MirrorNetworking/Mirror.git
synced 2024-11-18 11:00:32 +00:00
NetworkProximityChecker
This commit is contained in:
parent
b790ec38e8
commit
55decc95f7
@ -8,26 +8,47 @@ namespace Mirror
|
||||
[HelpURL("https://vis2k.github.io/Mirror/Components/NetworkProximityChecker")]
|
||||
public class NetworkProximityChecker : NetworkBehaviour
|
||||
{
|
||||
/// <summary>
|
||||
/// Enumeration of methods to use to check proximity.
|
||||
/// </summary>
|
||||
public enum CheckMethod
|
||||
{
|
||||
Physics3D,
|
||||
Physics2D
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The maximim range that objects will be visible at.
|
||||
/// </summary>
|
||||
[Tooltip("The maximum range that objects will be visible at.")]
|
||||
public int visRange = 10;
|
||||
|
||||
// how often to refresh the list of observers, in seconds
|
||||
[Tooltip("How often (in seconds) that this object should update the set of players that can see it.")]
|
||||
/// <summary>
|
||||
/// How often (in seconds) that this object should update the list of observers that can see it.
|
||||
/// </summary>
|
||||
[Tooltip("How often (in seconds) that this object should update the list of observers that can see it.")]
|
||||
public float visUpdateInterval = 1;
|
||||
|
||||
[Tooltip("Which method to use for checking proximity of players.\n\nPhysics3D uses 3D physics to determine proximity.\n\nPhysics2D uses 2D physics to determine proximity.")]
|
||||
/// <summary>
|
||||
/// Which method to use for checking proximity of players.
|
||||
/// <para>Physics3D uses 3D physics to determine proximity.</para>
|
||||
/// <para>Physics2D uses 2D physics to determine proximity.</para>
|
||||
/// </summary>
|
||||
[Tooltip("Which method to use for checking proximity of players.\n\nPhysics3D uses 3D physics to determine proximity.\nPhysics2D uses 2D physics to determine proximity.")]
|
||||
public CheckMethod checkMethod = CheckMethod.Physics3D;
|
||||
|
||||
/// <summary>
|
||||
/// Flag to force this object to be hidden for players.
|
||||
/// <para>If this object is a player object, it will not be hidden for that player.</para>
|
||||
/// </summary>
|
||||
[Tooltip("Enable to force this object to be hidden from players.")]
|
||||
public bool forceHidden;
|
||||
|
||||
// ~0 means 'Everything'. layers are used anyway, might as well expose them to the user.
|
||||
// Layers are used anyway, might as well expose them to the user.
|
||||
/// <summary>
|
||||
/// Select only the Player's layer to avoid unnecessary SphereCasts against the Terrain, etc.
|
||||
/// <para>~0 means 'Everything'.</para>
|
||||
/// </summary>
|
||||
[Tooltip("Select only the Player's layer to avoid unnecessary SphereCasts against the Terrain, etc.")]
|
||||
public LayerMask castLayers = ~0;
|
||||
|
||||
@ -53,7 +74,11 @@ void Update()
|
||||
}
|
||||
}
|
||||
|
||||
// called when a new player enters
|
||||
/// <summary>
|
||||
/// Called when a new player enters
|
||||
/// </summary>
|
||||
/// <param name="newObserver"></param>
|
||||
/// <returns></returns>
|
||||
public override bool OnCheckObserver(NetworkConnection newObserver)
|
||||
{
|
||||
if (forceHidden)
|
||||
@ -62,6 +87,12 @@ public override bool OnCheckObserver(NetworkConnection newObserver)
|
||||
return Vector3.Distance(newObserver.playerController.transform.position, transform.position) < visRange;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Called when a new player enters, and when scene changes occur
|
||||
/// </summary>
|
||||
/// <param name="observers"></param>
|
||||
/// <param name="initial"></param>
|
||||
/// <returns></returns>
|
||||
public override bool OnRebuildObservers(HashSet<NetworkConnection> observers, bool initial)
|
||||
{
|
||||
// if force hidden then return without adding any observers.
|
||||
@ -69,51 +100,51 @@ public override bool OnRebuildObservers(HashSet<NetworkConnection> observers, bo
|
||||
// always return true when overwriting OnRebuildObservers so that
|
||||
// Mirror knows not to use the built in rebuild method.
|
||||
return true;
|
||||
|
||||
|
||||
// find players within range
|
||||
switch (checkMethod)
|
||||
{
|
||||
case CheckMethod.Physics3D:
|
||||
{
|
||||
// cast without allocating GC for maximum performance
|
||||
int hitCount = Physics.OverlapSphereNonAlloc(transform.position, visRange, hitsBuffer3D, castLayers);
|
||||
if (hitCount == hitsBuffer3D.Length) Debug.LogWarning("NetworkProximityChecker's OverlapSphere test for " + name + " has filled the whole buffer(" + hitsBuffer3D.Length + "). Some results might have been omitted. Consider increasing buffer size.");
|
||||
|
||||
for (int i = 0; i < hitCount; i++)
|
||||
{
|
||||
Collider hit = hitsBuffer3D[i];
|
||||
// collider might be on pelvis, often the NetworkIdentity is in a parent
|
||||
// (looks in the object itself and then parents)
|
||||
NetworkIdentity identity = hit.GetComponentInParent<NetworkIdentity>();
|
||||
// (if an object has a connectionToClient, it is a player)
|
||||
if (identity != null && identity.connectionToClient != null)
|
||||
// cast without allocating GC for maximum performance
|
||||
int hitCount = Physics.OverlapSphereNonAlloc(transform.position, visRange, hitsBuffer3D, castLayers);
|
||||
if (hitCount == hitsBuffer3D.Length) Debug.LogWarning("NetworkProximityChecker's OverlapSphere test for " + name + " has filled the whole buffer(" + hitsBuffer3D.Length + "). Some results might have been omitted. Consider increasing buffer size.");
|
||||
|
||||
for (int i = 0; i < hitCount; i++)
|
||||
{
|
||||
observers.Add(identity.connectionToClient);
|
||||
Collider hit = hitsBuffer3D[i];
|
||||
// collider might be on pelvis, often the NetworkIdentity is in a parent
|
||||
// (looks in the object itself and then parents)
|
||||
NetworkIdentity identity = hit.GetComponentInParent<NetworkIdentity>();
|
||||
// (if an object has a connectionToClient, it is a player)
|
||||
if (identity != null && identity.connectionToClient != null)
|
||||
{
|
||||
observers.Add(identity.connectionToClient);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case CheckMethod.Physics2D:
|
||||
{
|
||||
// cast without allocating GC for maximum performance
|
||||
int hitCount = Physics2D.OverlapCircleNonAlloc(transform.position, visRange, hitsBuffer2D, castLayers);
|
||||
if (hitCount == hitsBuffer2D.Length) Debug.LogWarning("NetworkProximityChecker's OverlapCircle test for " + name + " has filled the whole buffer(" + hitsBuffer2D.Length + "). Some results might have been omitted. Consider increasing buffer size.");
|
||||
|
||||
for (int i = 0; i < hitCount; i++)
|
||||
{
|
||||
Collider2D hit = hitsBuffer2D[i];
|
||||
// collider might be on pelvis, often the NetworkIdentity is in a parent
|
||||
// (looks in the object itself and then parents)
|
||||
NetworkIdentity identity = hit.GetComponentInParent<NetworkIdentity>();
|
||||
// (if an object has a connectionToClient, it is a player)
|
||||
if (identity != null && identity.connectionToClient != null)
|
||||
// cast without allocating GC for maximum performance
|
||||
int hitCount = Physics2D.OverlapCircleNonAlloc(transform.position, visRange, hitsBuffer2D, castLayers);
|
||||
if (hitCount == hitsBuffer2D.Length) Debug.LogWarning("NetworkProximityChecker's OverlapCircle test for " + name + " has filled the whole buffer(" + hitsBuffer2D.Length + "). Some results might have been omitted. Consider increasing buffer size.");
|
||||
|
||||
for (int i = 0; i < hitCount; i++)
|
||||
{
|
||||
observers.Add(identity.connectionToClient);
|
||||
Collider2D hit = hitsBuffer2D[i];
|
||||
// collider might be on pelvis, often the NetworkIdentity is in a parent
|
||||
// (looks in the object itself and then parents)
|
||||
NetworkIdentity identity = hit.GetComponentInParent<NetworkIdentity>();
|
||||
// (if an object has a connectionToClient, it is a player)
|
||||
if (identity != null && identity.connectionToClient != null)
|
||||
{
|
||||
observers.Add(identity.connectionToClient);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// always return true when overwriting OnRebuildObservers so that
|
||||
@ -121,7 +152,10 @@ public override bool OnRebuildObservers(HashSet<NetworkConnection> observers, bo
|
||||
return true;
|
||||
}
|
||||
|
||||
// called hiding and showing objects on the host
|
||||
/// <summary>
|
||||
/// Called when hiding and showing objects on the host
|
||||
/// </summary>
|
||||
/// <param name="visible"></param>
|
||||
public override void OnSetLocalVisibility(bool visible)
|
||||
{
|
||||
foreach (Renderer rend in GetComponentsInChildren<Renderer>())
|
||||
|
Loading…
Reference in New Issue
Block a user