-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPredatorManager.cs
More file actions
118 lines (97 loc) · 3.26 KB
/
PredatorManager.cs
File metadata and controls
118 lines (97 loc) · 3.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
public class PredatorManager : SerializedMonoBehaviour
{
public static PredatorManager Instance { get; private set; }
// Closest active chaser distance. float.MaxValue when no one is chasing.
public static float ClosestChaserDistance { get; private set; } = float.MaxValue;
public static int ActiveCount => Instance._activePredators.Count;
public static int ChasingCount => Instance._chasingPredators.Count;
[SerializeField] public List<PredatorPrefabEntry> predatorPrefabs = new List<PredatorPrefabEntry>();
[SerializeField, Range(1, 10)] private int cullingFrameInterval = 4;
private HashSet<PredatorBase> _activePredators = new HashSet<PredatorBase>();
private HashSet<PredatorBase> _chasingPredators = new HashSet<PredatorBase>();
private Transform _playerTransform;
private Plane[] _cachedFrustumPlanes;
private void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(this);
}
else
{
Instance = this;
}
}
private void OnEnable()
{
PredatorBase.OnStateChanged += OnPredatorStateChanged;
PredatorBase.OnPredatorDisabled += OnPredatorBecameDisabled;
PredatorBase.OnPredatorEnabled += OnPredatorBecameEnabled;
GameManager.OnInitialize += OnGameInitialize;
GameManager.OnRestartingGame += OnGameRestart;
}
private void OnDisable()
{
PredatorBase.OnStateChanged -= OnPredatorStateChanged;
PredatorBase.OnPredatorDisabled -= OnPredatorBecameDisabled;
PredatorBase.OnPredatorEnabled -= OnPredatorBecameEnabled;
GameManager.OnInitialize -= OnGameInitialize;
GameManager.OnRestartingGame -= OnGameRestart;
}
private void Update()
{
// Every 2 frames is precise enough honestly lol
if (Time.frameCount % 2 == 0)
UpdateClosestChaserDistance();
}
private void OnGameInitialize(Transform playerTransform)
{
_playerTransform = playerTransform;
}
private void OnGameRestart()
{
_activePredators.Clear();
_chasingPredators.Clear();
ClosestChaserDistance = float.MaxValue;
}
private void OnPredatorStateChanged(PredatorBase predator, PredatorState state)
{
if (!predator.canAddChaseMusic)
return;
if (state == PredatorState.Chasing)
_chasingPredators.Add(predator);
else
_chasingPredators.Remove(predator);
}
private void OnPredatorBecameDisabled(PredatorBase predator)
{
_activePredators.Remove(predator);
_chasingPredators.Remove(predator);
}
private void OnPredatorBecameEnabled(PredatorBase predator)
{
_activePredators.Add(predator);
if (predator.canAddChaseMusic && predator.CurrentState == PredatorState.Chasing)
_chasingPredators.Add(predator);
}
private void UpdateClosestChaserDistance()
{
if (_chasingPredators.Count == 0 || _playerTransform == null)
{
ClosestChaserDistance = float.MaxValue;
return;
}
Vector2 playerPos = _playerTransform.position;
float minSqrDist = float.MaxValue;
foreach (PredatorBase predator in _chasingPredators)
{
if (!predator.gameObject.activeInHierarchy) continue;
float sqrDist = ((Vector2)predator.transform.position - playerPos).sqrMagnitude;
if (sqrDist < minSqrDist)
minSqrDist = sqrDist;
}
// Single sqrt at the end — only when we have a valid result
ClosestChaserDistance = minSqrDist < float.MaxValue ? Mathf.Sqrt(minSqrDist) : float.MaxValue;
Debug.Log("Closest chaser distance: " + ClosestChaserDistance);
}
}