Skip to content

Commit 3fa57e2

Browse files
committed
Added sensor group
1 parent 7f1d9a1 commit 3fa57e2

6 files changed

Lines changed: 136 additions & 38 deletions

File tree

Assets/Kekser/Sensors/Sensor.cs

Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,15 @@
44

55
namespace Kekser.Sensors
66
{
7-
public abstract class Sensor<T> : MonoBehaviour where T : Component
7+
public abstract class Sensor : MonoBehaviour
88
{
9-
private const int MIN_RAYCASTS = 1;
10-
private const int MAX_RAYCASTS = 10;
11-
12-
private List<GameObject> _detectedObjects = new List<GameObject>();
9+
protected List<GameObject> _detectedObjects = new List<GameObject>();
1310

1411
[Header("Base Sensor Settings")]
1512
[SerializeField]
1613
protected bool _autoUpdateSensor = false;
1714
[SerializeField]
1815
protected List<GameObject> _ignore;
19-
[SerializeField]
20-
protected bool _checkVisibility = false;
21-
[SerializeField]
22-
protected LayerMask _scanLayer = 0;
23-
[SerializeField]
24-
protected LayerMask _obstructionLayer = 0;
25-
[SerializeField, Range(MIN_RAYCASTS, MAX_RAYCASTS)]
26-
protected int _scanRays = 1;
27-
[SerializeField, Range(0f, 1f)]
28-
protected float _visibility = 0.5f;
2916
[Header("Events")]
3017
[SerializeField]
3118
public SensorEvent OnEnter;
@@ -40,6 +27,47 @@ public bool AutoUpdateSensor
4027
set => _autoUpdateSensor = value;
4128
}
4229

30+
public void AddIgnore(GameObject ignoreObject)
31+
{
32+
if (!_ignore.Contains(ignoreObject))
33+
_ignore.Add(ignoreObject);
34+
}
35+
36+
public void RemoveIgnore(GameObject ignoreObject)
37+
{
38+
if (_ignore.Contains(ignoreObject))
39+
_ignore.Remove(ignoreObject);
40+
}
41+
42+
public GameObject[] DetectedObjects => _detectedObjects.ToArray();
43+
44+
public abstract void SensorUpdate();
45+
46+
protected virtual void FixedUpdate()
47+
{
48+
if (!_autoUpdateSensor)
49+
return;
50+
SensorUpdate();
51+
}
52+
}
53+
54+
public abstract class Sensor<T> : Sensor where T : Component
55+
{
56+
private const int MIN_RAYCASTS = 1;
57+
private const int MAX_RAYCASTS = 10;
58+
59+
[Header("Visibility Settings")]
60+
[SerializeField]
61+
protected bool _checkVisibility = false;
62+
[SerializeField]
63+
protected LayerMask _scanLayer = 0;
64+
[SerializeField]
65+
protected LayerMask _obstructionLayer = 0;
66+
[SerializeField, Range(MIN_RAYCASTS, MAX_RAYCASTS)]
67+
protected int _scanRays = 1;
68+
[SerializeField, Range(0f, 1f)]
69+
protected float _visibility = 0.5f;
70+
4371
public bool CheckVisibility
4472
{
4573
get => _checkVisibility;
@@ -69,25 +97,11 @@ public float Visibility
6997
get => _visibility;
7098
set => _visibility = Mathf.Clamp01(value);
7199
}
72-
73-
public void AddIgnore(GameObject ignoreObject)
74-
{
75-
if (!_ignore.Contains(ignoreObject))
76-
_ignore.Add(ignoreObject);
77-
}
78-
79-
public void RemoveIgnore(GameObject ignoreObject)
80-
{
81-
if (_ignore.Contains(ignoreObject))
82-
_ignore.Remove(ignoreObject);
83-
}
84-
85-
public GameObject[] DetectedObjects => _detectedObjects.ToArray();
86100

87101
protected abstract T[] GetComponentsInSensor();
88102
protected abstract float CheckForVisibility(T checkObject);
89103

90-
public void SensorUpdate()
104+
public override void SensorUpdate()
91105
{
92106
List<GameObject> oldObjects = new List<GameObject>(_detectedObjects);
93107
T[] checkObjects = gameObject.activeInHierarchy && enabled ? GetComponentsInSensor() : Array.Empty<T>();
@@ -117,12 +131,5 @@ public void SensorUpdate()
117131
OnExit.Invoke(oldObjects[i]);
118132
}
119133
}
120-
121-
protected virtual void FixedUpdate()
122-
{
123-
if (!_autoUpdateSensor)
124-
return;
125-
SensorUpdate();
126-
}
127134
}
128135
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using UnityEngine;
4+
5+
namespace Kekser.Sensors
6+
{
7+
public class SensorGroup : Sensor
8+
{
9+
[SerializeField]
10+
private Sensor[] _sensors;
11+
12+
public override void SensorUpdate()
13+
{
14+
List<GameObject> oldObjects = new List<GameObject>(_detectedObjects);
15+
List<GameObject> checkObjects = gameObject.activeInHierarchy && enabled ? _sensors.OverlapSensors() : new List<GameObject>();
16+
for (int i = 0; i < checkObjects.Count; i++)
17+
{
18+
if (checkObjects[i] == null || _ignore.Contains(checkObjects[i].gameObject))
19+
continue;
20+
21+
oldObjects.Remove(checkObjects[i].gameObject);
22+
if (!_detectedObjects.Contains(checkObjects[i].gameObject))
23+
{
24+
_detectedObjects.Add(checkObjects[i].gameObject);
25+
OnEnter.Invoke(checkObjects[i].gameObject);
26+
}
27+
else
28+
{
29+
OnStay.Invoke(checkObjects[i].gameObject);
30+
}
31+
}
32+
33+
for (int i = 0; i < oldObjects.Count; i++)
34+
{
35+
_detectedObjects.Remove(oldObjects[i]);
36+
OnExit.Invoke(oldObjects[i]);
37+
}
38+
}
39+
}
40+
}

Assets/Kekser/Sensors/SensorGroup.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Kekser/Sensors/Utils.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System.Collections.Generic;
2+
using UnityEngine;
3+
4+
namespace Kekser.Sensors
5+
{
6+
public static class Utils
7+
{
8+
public static List<GameObject> OverlapSensors(this IEnumerable<Sensor> sensors)
9+
{
10+
List<GameObject> objects = new List<GameObject>();
11+
foreach (Sensor sensor in sensors)
12+
{
13+
if (!sensor.AutoUpdateSensor)
14+
sensor.SensorUpdate();
15+
foreach (GameObject obj in sensor.DetectedObjects)
16+
{
17+
if (!objects.Contains(obj))
18+
objects.Add(obj);
19+
}
20+
}
21+
return objects;
22+
}
23+
24+
public static GameObject ClosestObject(this IEnumerable<GameObject> objects, Vector3 position)
25+
{
26+
GameObject closest = null;
27+
float minDistance = Mathf.Infinity;
28+
foreach (GameObject obj in objects)
29+
{
30+
float distance = Vector2.Distance(position, obj.transform.position);
31+
if (distance < minDistance)
32+
{
33+
minDistance = distance;
34+
closest = obj;
35+
}
36+
}
37+
return closest;
38+
}
39+
40+
public static GameObject ClosestObject(this IEnumerable<Sensor> sensors, Vector3 position)
41+
{
42+
return sensors.OverlapSensors().ClosestObject(position);
43+
}
44+
}
45+
}

Assets/Kekser/Sensors/Utils.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Kekser/Sensors/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "com.kekser.sensors",
33
"displayName": "Sensors",
44
"author": { "name": "Kekser", "url": "https://github.com/DerKekser" },
5-
"version": "1.1.4",
5+
"version": "1.2.0",
66
"unity": "2020.3",
77
"description": "A Sensor system for Unity",
88
"keywords": [ "sensor", "sensors", "visibility" ],

0 commit comments

Comments
 (0)