-
Notifications
You must be signed in to change notification settings - Fork 3
/
SimpleOverlapBox.cs
138 lines (114 loc) · 4.43 KB
/
SimpleOverlapBox.cs
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using UnityEngine;
using System.Collections.Generic;
namespace HutongGames.PlayMaker.Actions
{
[ActionCategory(ActionCategory.Physics)]
[Tooltip("Returns hit if an object is hit, hit object also returns")]
public class SimpleOverlapBox : FsmStateAction
{
[ActionSection("Overlap Box Settings")]
public FsmGameObject scanOrigin;
[Tooltip("The size of the overlap box.")]
public FsmVector3 halfExtents;
[ActionSection("Filter")]
[UIHint(UIHint.Layer)]
[Tooltip("Pick only from these layers.")]
public FsmInt[] layerMask;
[Tooltip("Invert the mask, so you pick from all layers except those defined above.")]
public FsmBool invertMask;
[Tooltip("Set to true to ignore colliders set to trigger.")]
public FsmBool ignoreTriggerColliders;
public FsmEvent ErrorEvent;
public FsmEvent hitEvent;
public FsmEvent noHitEvent;
public FsmInt repeatInterval;
public FsmGameObject hitObject;
int repeat;
private Quaternion orientation;
public bool everyFrame;
public override void Reset()
{
ErrorEvent = null;
layerMask = new FsmInt[0];
invertMask = false;
ignoreTriggerColliders = false;
}
public override void OnEnter()
{
DoSimpleOverlap();
if (repeatInterval.Value == 0)
{
Finish();
}
}
public override void OnUpdate()
{
repeat--;
if (repeat == 0)
{
DoSimpleOverlap();
}
}
void DoSimpleOverlap()
{
repeat = repeatInterval.Value;
//Debug.Log(" scan origin " + scanOrigin.Value);
//Debug.Log(" scan origin =" + scanOrigin.Value.gameObject.transform.rotation);
orientation = scanOrigin.Value.gameObject.transform.rotation;
if (ignoreTriggerColliders.Value == true)
{
Collider[] colliders = Physics.OverlapBox(scanOrigin.Value.gameObject.transform.position, halfExtents.Value, orientation = Quaternion.identity, ActionHelpers.LayerArrayToLayerMask(layerMask, invertMask.Value), QueryTriggerInteraction.Ignore);
if (colliders.Length == 0)
{
Fsm.Event(noHitEvent);
} else
{
var list = new List<Collider>(colliders);
for (int index = 0; index < list.Count; index++)
{
var i = list[index].gameObject;
if (i == scanOrigin.Value)
{
list.RemoveAt(index);
}
}
if (list.Count != 0)
{
hitObject.Value = list[0].gameObject;
Fsm.Event(hitEvent);
} else
{
Fsm.Event(noHitEvent);
}
}
} else
{
Collider[] colliders = Physics.OverlapBox(scanOrigin.Value.gameObject.transform.position, halfExtents.Value, orientation = Quaternion.identity, ActionHelpers.LayerArrayToLayerMask(layerMask, invertMask.Value), QueryTriggerInteraction.Collide);
if (colliders.Length == 0)
{
Fsm.Event(noHitEvent);
} else
{
var list = new List<Collider>(colliders);
for (int index = 0; index < list.Count; index++)
{
var i = list[index].gameObject;
if (i == scanOrigin.Value)
{
list.RemoveAt(index);
}
}
if (list.Count != 0)
{
hitObject.Value = list[0].gameObject;
Fsm.Event(hitEvent);
}
else
{
Fsm.Event(noHitEvent);
}
}
}
}
}
}