feature: DistanceInterestManagement custom range component

This commit is contained in:
vis2k 2021-07-14 11:31:45 +08:00
parent 99316d6ab9
commit 09cbc7e782
3 changed files with 38 additions and 4 deletions

View File

@ -6,21 +6,30 @@ namespace Mirror
{ {
public class DistanceInterestManagement : InterestManagement public class DistanceInterestManagement : InterestManagement
{ {
[Tooltip("The maximum range that objects will be visible at.")] [Tooltip("The maximum range that objects will be visible at. Add DistanceInterestManagementCustomRange onto NetworkIdentities for custom ranges.")]
public int visRange = 10; public int visRange = 10;
[Tooltip("Rebuild all every 'rebuildInterval' seconds.")] [Tooltip("Rebuild all every 'rebuildInterval' seconds.")]
public float rebuildInterval = 1; public float rebuildInterval = 1;
double lastRebuildTime; 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) public override bool OnCheckObserver(NetworkIdentity identity, NetworkConnection newObserver)
{ {
return Vector3.Distance(identity.transform.position, newObserver.identity.transform.position) < visRange; 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) public override void OnRebuildObservers(NetworkIdentity identity, HashSet<NetworkConnection> newObservers, bool initialize)
{ {
// 'transform.' calls GetComponent, only do it once // cache range and .transform because both call GetComponent.
int range = GetVisRange(identity);
Vector3 position = identity.transform.position; Vector3 position = identity.transform.position;
// brute force distance check // brute force distance check
@ -36,7 +45,7 @@ public override void OnRebuildObservers(NetworkIdentity identity, HashSet<Networ
if (conn != null && conn.isAuthenticated && conn.identity != null) if (conn != null && conn.isAuthenticated && conn.identity != null)
{ {
// check distance // check distance
if (Vector3.Distance(conn.identity.transform.position, position) < visRange) if (Vector3.Distance(conn.identity.transform.position, position) < range)
{ {
newObservers.Add(conn); newObservers.Add(conn);
} }

View File

@ -0,0 +1,14 @@
// add this to NetworkIdentities for custom range if needed.
// only works with DistanceInterestManagement.
using UnityEngine;
namespace Mirror
{
[RequireComponent(typeof(NetworkIdentity))]
[DisallowMultipleComponent]
public class DistanceInterestManagementCustomRange : MonoBehaviour
{
[Tooltip("The maximum range that objects will be visible at.")]
public int visRange = 20;
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b2e242ee38a14076a39934172a19079b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {fileID: 2800000, guid: 7453abfe9e8b2c04a8a47eb536fe21eb, type: 3}
userData:
assetBundleName:
assetBundleVariant: