Skip to content

Commit 4d035b0

Browse files
committed
proximity checker now fully works.
1 parent 302a674 commit 4d035b0

File tree

11 files changed

+88
-161
lines changed

11 files changed

+88
-161
lines changed

Assets/Mirage/Components/Visibility/Inspectors/NetworkProximityChecker.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class NetworkProximityChecker : BaseVisibilityInspector
1919

2020
protected override void Start()
2121
{
22-
NetworkVisibility = new NetworkProximityCheckerVisibility(ServerObjectManager, VisibilityRange, VisibilityUpdateInterval);
22+
NetworkVisibility = new NetworkProximityCheckerVisibility(ServerObjectManager, VisibilityRange, VisibilityUpdateInterval, Identity);
2323

2424
base.Start();
2525
}

Assets/Mirage/Components/Visibility/Inspectors/NetworkSceneChecker.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ public class NetworkSceneChecker : BaseVisibilityInspector
44
{
55
protected override void Start()
66
{
7-
NetworkVisibility = new SceneVisibilityChecker(ServerObjectManager);
7+
NetworkVisibility = new SceneVisibilityChecker(ServerObjectManager, gameObject.scene, Identity);
88

99
base.Start();
1010
}

Assets/Mirage/Components/Visibility/NetworkProximityCheckerVisibility.cs

Lines changed: 40 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -15,35 +15,24 @@ namespace Mirage.Components
1515
[HelpURL("https://miragenet.github.io/Mirage/Articles/Components/NetworkProximityChecker.html")]
1616
public class NetworkProximityCheckerVisibility : NetworkVisibility
1717
{
18-
private class NetIdComparer : IEqualityComparer<NetworkIdentity>
19-
{
20-
public bool Equals(NetworkIdentity x, NetworkIdentity y)
21-
{
22-
return x.NetId == y.NetId;
23-
}
24-
public int GetHashCode(NetworkIdentity obj)
25-
{
26-
return (int)obj.NetId;
27-
}
28-
}
29-
3018
static readonly ILogger logger = LogFactory.GetLogger(typeof(NetworkProximityCheckerVisibility));
3119

3220
private readonly float _sightDistnace = 10;
3321
private readonly float _updateInterval = 0;
3422
private float _nextUpdate = 0;
35-
private readonly Dictionary<INetworkPlayer, HashSet<NetworkIdentity>> lastFrame = new Dictionary<INetworkPlayer, HashSet<NetworkIdentity>>();
23+
private NetworkIdentity _identity;
3624

3725
/// <summary>
3826
///
3927
/// </summary>
4028
/// <param name="serverObjectManager"></param>
4129
/// <param name="sightDistance"></param>
4230
/// <param name="updateInterval"></param>
43-
public NetworkProximityCheckerVisibility(ServerObjectManager serverObjectManager, float sightDistance, float updateInterval) : base(serverObjectManager)
31+
public NetworkProximityCheckerVisibility(ServerObjectManager serverObjectManager, float sightDistance, float updateInterval, NetworkIdentity objectTransform) : base(serverObjectManager)
4432
{
4533
_sightDistnace = sightDistance;
4634
_updateInterval = updateInterval;
35+
_identity = objectTransform;
4736
}
4837

4938
[MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -54,63 +43,6 @@ static bool FastInDistanceXZ(Vector3 a, Vector3 b, float sqRange)
5443
float sqDist = dx * dx + dz * dz;
5544
return sqDist < sqRange;
5645
}
57-
private void Rebuild()
58-
{
59-
foreach (NetworkIdentity identity in InterestManager.ServerObjectManager.Server.World.SpawnedIdentities)
60-
{
61-
foreach (INetworkPlayer player in VisibilitySystemData.Keys)
62-
{
63-
if (!VisibilitySystemData.TryGetValue(player, out HashSet<NetworkIdentity> nextSet))
64-
{
65-
nextSet = new HashSet<NetworkIdentity>(new NetIdComparer());
66-
VisibilitySystemData[player] = nextSet;
67-
}
68-
69-
nextSet.Add(identity);
70-
}
71-
}
72-
73-
foreach (INetworkPlayer player in InterestManager.ServerObjectManager.Server.Players)
74-
{
75-
if (!lastFrame.TryGetValue(player, out HashSet<NetworkIdentity> lastSet))
76-
{
77-
lastSet = new HashSet<NetworkIdentity>(new NetIdComparer());
78-
lastFrame[player] = lastSet;
79-
}
80-
81-
if (!VisibilitySystemData.TryGetValue(player, out HashSet<NetworkIdentity> nextSet))
82-
{
83-
nextSet = new HashSet<NetworkIdentity>(new NetIdComparer());
84-
VisibilitySystemData[player] = nextSet;
85-
}
86-
87-
88-
foreach (NetworkIdentity identity in lastSet)
89-
{
90-
if (!nextSet.Contains(identity))
91-
{
92-
InterestManager.ServerObjectManager.HideToPlayer(identity, player);
93-
}
94-
}
95-
96-
foreach (NetworkIdentity identity in nextSet)
97-
{
98-
if (!lastSet.Contains(identity))
99-
{
100-
InterestManager.ServerObjectManager.ShowToPlayer(identity, player);
101-
}
102-
}
103-
104-
// reset collections
105-
lastSet.Clear();
106-
foreach (NetworkIdentity identity in nextSet)
107-
{
108-
lastSet.Add(identity);
109-
}
110-
111-
nextSet.Clear();
112-
}
113-
}
11446

11547
#region Overrides of NetworkVisibility
11648

@@ -128,16 +60,19 @@ public override void OnSpawned(NetworkIdentity identity)
12860
}
12961

13062
Vector3 a = identity.transform.position;
131-
float sqRange = _sightDistnace * _sightDistnace;
13263

13364
foreach (INetworkPlayer player in InterestManager.ServerObjectManager.Server.Players)
13465
{
13566
Vector3 b = player.Identity.transform.position;
13667

137-
if (FastInDistanceXZ(a, b, sqRange))
138-
{
139-
InterestManager.ServerObjectManager.ShowToPlayer(identity, player);
140-
}
68+
if (!FastInDistanceXZ(a, b, _sightDistnace * _sightDistnace)) continue;
69+
70+
if (!VisibilitySystemData.ContainsKey(identity))
71+
VisibilitySystemData.Add(identity, new HashSet<INetworkPlayer>());
72+
else if (VisibilitySystemData.ContainsKey(identity) && !VisibilitySystemData[identity].Contains(player))
73+
VisibilitySystemData[identity].Add(player);
74+
75+
InterestManager.ServerObjectManager.ShowToPlayer(identity, player);
14176
}
14277
}
14378

@@ -151,16 +86,19 @@ public override void OnAuthenticated(INetworkPlayer player)
15186
if (player.Identity == null) { return; }
15287

15388
Vector3 b = player.Identity.transform.position;
154-
float sqRange = _sightDistnace * _sightDistnace;
15589

15690
foreach (NetworkIdentity identity in InterestManager.ServerObjectManager.Server.World.SpawnedIdentities)
15791
{
15892
Vector3 a = identity.transform.position;
15993

160-
if (FastInDistanceXZ(a, b, sqRange))
161-
{
162-
InterestManager.ServerObjectManager.ShowToPlayer(identity, player);
163-
}
94+
if (!FastInDistanceXZ(a, b, _sightDistnace * _sightDistnace)) continue;
95+
96+
if (!VisibilitySystemData.ContainsKey(identity))
97+
VisibilitySystemData.Add(identity, new HashSet<INetworkPlayer>());
98+
else if (VisibilitySystemData.ContainsKey(identity) && !VisibilitySystemData[identity].Contains(player))
99+
VisibilitySystemData[identity].Add(player);
100+
101+
InterestManager.ServerObjectManager.ShowToPlayer(identity, player);
164102
}
165103
}
166104

@@ -171,7 +109,27 @@ public override void CheckForObservers()
171109
{
172110
if (!(_nextUpdate < Time.time)) return;
173111

174-
Rebuild();
112+
foreach (INetworkPlayer player in InterestManager.ServerObjectManager.Server.Players)
113+
{
114+
if(!VisibilitySystemData.ContainsKey(_identity)) continue;
115+
116+
VisibilitySystemData.TryGetValue(_identity, out HashSet<INetworkPlayer> players);
117+
118+
if (FastInDistanceXZ(player.Identity.transform.position, _identity.transform.position, _sightDistnace * _sightDistnace))
119+
{
120+
if (players != null && players.Contains(player)) continue;
121+
122+
VisibilitySystemData[_identity].Add(player);
123+
InterestManager.ServerObjectManager.ShowToPlayer(_identity, player);
124+
}
125+
else
126+
{
127+
if(players !=null && !players.Contains(player)) continue;
128+
129+
VisibilitySystemData[_identity].Remove(player);
130+
InterestManager.ServerObjectManager.HideToPlayer(_identity, player);
131+
}
132+
}
175133

176134
_nextUpdate += _updateInterval;
177135
}

Assets/Mirage/Components/Visibility/SceneChecking/SceneVisibilityChecker.cs

Lines changed: 10 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Collections.Generic;
12
using Mirage.InterestManagement;
23
using Mirage.Logging;
34
using UnityEngine;
@@ -9,38 +10,12 @@ public class SceneVisibilityChecker : NetworkVisibility
910
{
1011
static readonly ILogger logger = LogFactory.GetLogger<SceneVisibilityChecker>();
1112

12-
//public override bool OnCheckObserver(INetworkPlayer player)
13-
//{
14-
// NetworkIdentity character = player.Identity;
15-
// if (character == null)
16-
// {
17-
// if (logger.LogEnabled()) logger.Log($"SceneChecker: {player} had no character");
18-
// return false;
19-
// }
13+
#region Fields
2014

21-
// Scene playerScene = character.gameObject.scene;
22-
// if (!playerScene.IsValid())
23-
// {
24-
// if (logger.WarnEnabled()) logger.LogWarning($"SceneChecker: Could not find scene for {player}");
25-
// return false;
26-
// }
15+
private Scene _objectCurrentScene;
16+
private NetworkIdentity Identity;
2717

28-
// Scene thisScene = gameObject.scene;
29-
// bool visible = playerScene == thisScene;
30-
// if (logger.LogEnabled()) logger.Log($"SceneChecker: {player} can see '{this}': {visible}");
31-
// return visible;
32-
//}
33-
34-
//public override void OnRebuildObservers(HashSet<INetworkPlayer> observers, bool initialize)
35-
//{
36-
// foreach (INetworkPlayer player in Server.Players)
37-
// {
38-
// if (OnCheckObserver(player))
39-
// {
40-
// observers.Add(player);
41-
// }
42-
// }
43-
//}
18+
#endregion
4419

4520
/// <summary>
4621
/// Call this function on an object to move it to a new scene and rebuild its observers
@@ -65,17 +40,10 @@ public void MoveToScene(Scene scene)
6540
// ServerObjectManager.SpawnVisibleObjects(Identity.Owner);
6641
}
6742

68-
private void removeObservers(NetworkIdentity identity)
69-
{
70-
//HashSet<INetworkPlayer> observers = identity.observers;
71-
//foreach (INetworkPlayer observer in observers)
72-
//{
73-
// observer.RemoveFromVisList(identity);
74-
//}
75-
}
76-
77-
public SceneVisibilityChecker(ServerObjectManager serverObjectManager) : base(serverObjectManager)
43+
public SceneVisibilityChecker(ServerObjectManager serverObjectManager, Scene objectScene, NetworkIdentity identity) : base(serverObjectManager)
7844
{
45+
_objectCurrentScene = objectScene;
46+
Identity = identity;
7947
}
8048

8149
#region Overrides of NetworkVisibility
@@ -87,7 +55,7 @@ public SceneVisibilityChecker(ServerObjectManager serverObjectManager) : base(se
8755
/// <param name="identity">The object just spawned</param>
8856
public override void OnSpawned(NetworkIdentity identity)
8957
{
90-
throw new System.NotImplementedException();
58+
// NOOP
9159
}
9260

9361
/// <summary>
@@ -96,15 +64,14 @@ public override void OnSpawned(NetworkIdentity identity)
9664
/// <param name="player"></param>
9765
public override void OnAuthenticated(INetworkPlayer player)
9866
{
99-
throw new System.NotImplementedException();
67+
if(player.Identity.gameObject.scene.handle != _objectCurrentScene.handle) return;
10068
}
10169

10270
/// <summary>
10371
///
10472
/// </summary>
10573
public override void CheckForObservers()
10674
{
107-
throw new System.NotImplementedException();
10875
}
10976

11077
#endregion

Assets/Mirage/Editor/NetworkInformationPreview.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using Mirage.InterestManagement;
23
using UnityEditor;
34
using UnityEngine;
45

@@ -172,7 +173,7 @@ float DrawNetworkBehaviors(NetworkIdentity identity, float initialX, float Y)
172173

173174
float DrawObservers(NetworkIdentity identity, float initialX, float Y)
174175
{
175-
if (identity.ServerObjectManager.InterestManager.Observers(identity).Count > 0)
176+
if (identity.ServerObjectManager.InterestManager.ObserverSystems.Count > 0)
176177
{
177178
var observerRect = new Rect(initialX, Y + 10, 200, 20);
178179

@@ -181,11 +182,14 @@ float DrawObservers(NetworkIdentity identity, float initialX, float Y)
181182
observerRect.x += 20;
182183
observerRect.y += observerRect.height;
183184

184-
foreach (INetworkPlayer player in identity.ServerObjectManager.InterestManager.Observers(identity))
185+
foreach (ObserverData system in identity.ServerObjectManager.InterestManager.ObserverSystems)
185186
{
186-
GUI.Label(observerRect, player.Connection.EndPoint + ":" + player, styles.ComponentName);
187-
observerRect.y += observerRect.height;
188-
Y = observerRect.y;
187+
foreach (INetworkPlayer player in system.Observers[identity])
188+
{
189+
GUI.Label(observerRect, player.Connection.EndPoint + ":" + player, styles.ComponentName);
190+
observerRect.y += observerRect.height;
191+
Y = observerRect.y;
192+
}
189193
}
190194
}
191195

Assets/Mirage/Runtime/InterestManagement/InterestManager.cs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ protected internal void Send<T>(NetworkIdentity identity, T msg, int channelId =
144144
{
145145
OnSendProfilerMarker.Begin();
146146

147-
_observers = Observers(identity);
147+
Observers(identity);
148148

149149
// remove skipped player. No need to send to them.
150150
_observers.Remove(skip);
@@ -206,35 +206,30 @@ internal void UnRegisterVisibilitySystem(ref ObserverData system)
206206
/// </summary>
207207
/// <param name="identity">The identity of the object we want to check if player's can see it or not.</param>
208208
/// <returns></returns>
209-
internal List<INetworkPlayer> Observers(NetworkIdentity identity)
209+
private void Observers(NetworkIdentity identity)
210210
{
211211
ObserverProfilerMarker.Begin();
212212

213+
_observers.Clear();
214+
213215
if (_visibilitySystems.Count == 0)
214216
{
215217
ObserverProfilerMarker.End();
216218

217-
return new List<INetworkPlayer>(ServerObjectManager.Server.Players);
219+
_observers.AddRange(ServerObjectManager.Server.Players);
218220
}
219221

220222
foreach (ObserverData visibilitySystem in _visibilitySystems)
221223
{
222-
foreach (KeyValuePair<INetworkPlayer, HashSet<NetworkIdentity>> observer in visibilitySystem.Observers)
223-
{
224-
if (!observer.Value.Contains(identity))
225-
{
226-
ObserverProfilerMarker.End();
227-
228-
return _observers;
229-
}
224+
if (!visibilitySystem.Observers.ContainsKey(identity)) continue;
230225

231-
_observers.AddRange(visibilitySystem.Observers.Keys);
226+
foreach (KeyValuePair<NetworkIdentity, HashSet<INetworkPlayer>> observer in visibilitySystem.Observers)
227+
{
228+
_observers.AddRange(observer.Value);
232229
}
233230
}
234231

235232
ObserverProfilerMarker.End();
236-
237-
return _observers;
238233
}
239234

240235
#endregion

Assets/Mirage/Runtime/InterestManagement/NetworkVisibility.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public abstract class NetworkVisibility : INetworkVisibility
1515

1616
public InterestManager InterestManager => _serverObjectManager.InterestManager;
1717

18-
public Dictionary<INetworkPlayer, HashSet<NetworkIdentity>> VisibilitySystemData => _visibilitySystemData.Observers;
18+
public Dictionary<NetworkIdentity, HashSet<INetworkPlayer>> VisibilitySystemData => _visibilitySystemData.Observers;
1919

2020
#endregion
2121

@@ -26,7 +26,7 @@ protected NetworkVisibility(ServerObjectManager serverObjectManager)
2626

2727
public void Startup()
2828
{
29-
_visibilitySystemData = new ObserverData(this, new Dictionary<INetworkPlayer, HashSet<NetworkIdentity>>());
29+
_visibilitySystemData = new ObserverData(this, new Dictionary<NetworkIdentity, HashSet<INetworkPlayer>>());
3030

3131
_serverObjectManager.InterestManager?.RegisterVisibilitySystem(ref _visibilitySystemData);
3232
}

0 commit comments

Comments
 (0)