mirror of
https://github.com/DerTyp7/defrain-shooter-unity.git
synced 2025-10-29 20:52:10 +01:00
70 lines
2.9 KiB
C#
70 lines
2.9 KiB
C#
// straight forward Vector3.Distance based interest management.
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
namespace Mirror
|
|
{
|
|
public class DistanceInterestManagement : InterestManagement
|
|
{
|
|
[Tooltip("The maximum range that objects will be visible at. Add DistanceInterestManagementCustomRange onto NetworkIdentities for custom ranges.")]
|
|
public int visRange = 10;
|
|
|
|
[Tooltip("Rebuild all every 'rebuildInterval' seconds.")]
|
|
public float rebuildInterval = 1;
|
|
double lastRebuildTime;
|
|
|
|
// helper function to get vis range for a given object, or default.
|
|
int GetVisRange(NetworkIdentity identity)
|
|
{
|
|
DistanceInterestManagementCustomRange custom = identity.GetComponent<DistanceInterestManagementCustomRange>();
|
|
return custom != null ? custom.visRange : visRange;
|
|
}
|
|
|
|
public override bool OnCheckObserver(NetworkIdentity identity, NetworkConnection newObserver)
|
|
{
|
|
int range = GetVisRange(identity);
|
|
return Vector3.Distance(identity.transform.position, newObserver.identity.transform.position) < range;
|
|
}
|
|
|
|
public override void OnRebuildObservers(NetworkIdentity identity, HashSet<NetworkConnection> newObservers, bool initialize)
|
|
{
|
|
// cache range and .transform because both call GetComponent.
|
|
int range = GetVisRange(identity);
|
|
Vector3 position = identity.transform.position;
|
|
|
|
// brute force distance check
|
|
// -> only player connections can be observers, so it's enough if we
|
|
// go through all connections instead of all spawned identities.
|
|
// -> compared to UNET's sphere cast checking, this one is orders of
|
|
// magnitude faster. if we have 10k monsters and run a sphere
|
|
// cast 10k times, we will see a noticeable lag even with physics
|
|
// layers. but checking to every connection is fast.
|
|
foreach (NetworkConnectionToClient conn in NetworkServer.connections.Values)
|
|
{
|
|
// authenticated and joined world with a player?
|
|
if (conn != null && conn.isAuthenticated && conn.identity != null)
|
|
{
|
|
// check distance
|
|
if (Vector3.Distance(conn.identity.transform.position, position) < range)
|
|
{
|
|
newObservers.Add(conn);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
// only on server
|
|
if (!NetworkServer.active) return;
|
|
|
|
// rebuild all spawned NetworkIdentity's observers every interval
|
|
if (NetworkTime.localTime >= lastRebuildTime + rebuildInterval)
|
|
{
|
|
RebuildAll();
|
|
lastRebuildTime = NetworkTime.localTime;
|
|
}
|
|
}
|
|
}
|
|
}
|