/
qf2DEventTrigger.cs
138 lines (112 loc) · 2.98 KB
/
qf2DEventTrigger.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
#if SEALED
using UnityEngine;
using System.Collections;
/// <summary>
/// 事件触发器
/// 配合qf2DEventHandler使用
/// 触发器激活后handler将触发情况以delegate形式传递出去
/// </summary>
[RequireComponent(typeof(Collider2D))]
public class qf2DEventTrigger : MonoBehaviour, LevelEvent.IActiveSth
{
public bool OneTimeTriggerEnter = false;
public bool OneTimeTriggerExit = false;
public string TriggerTag;
public qf2DEventHandler[] TriggerTargets;
public GameObject[] WhiteListedGo;
public bool AlreadyForActive = true;
private Collider2D _collider2D;
private bool _haveValidCollider = false;
void Start()
{
_collider2D = GetComponent<Collider2D>();
_haveValidCollider = _collider2D != null;
if(!_haveValidCollider)
Debug.LogError("collider not ready");
}
public void ToggleFreeze(bool on)
{
_collider2D.enabled = on;
}
public void OnTriggerEnter2D(Collider2D collision)
{
if (!_haveValidCollider)
return;
if (!AlreadyForActive)
{
Debug.Log("not ready for active");
return;
}
if (WhiteListedGo.Length > 0 && System.Array.IndexOf(WhiteListedGo, collision.gameObject) < 0)
return;
if(string.IsNullOrEmpty(TriggerTag))
{
Debug.LogError("invalid trigger tag");
return;
}
if(collision.tag != TriggerTag)
return;
ActivateTriggers(collision, TriggerType.Enter);
}
public void OnTriggerExit2D(Collider2D collision)
{
if(!_haveValidCollider)
return;
if (WhiteListedGo.Length > 0 && System.Array.IndexOf(WhiteListedGo, collision.gameObject) < 0)
return;
if(string.IsNullOrEmpty(TriggerTag))
{
Debug.LogError("invalid trigger tag");
return;
}
if(collision.tag != TriggerTag)
return;
ActivateTriggers(collision, TriggerType.Exit);
if (OneTimeTriggerExit)
{
_collider2D.enabled = false;
Destroy(gameObject);
}
}
void ActivateTriggers(Collider2D col, TriggerType type)
{
for (int i = 0; i < TriggerTargets.Length; i++)
TriggerTargets[i].TriggerActivate(col, type);
if (OneTimeTriggerEnter)
{
_collider2D.enabled = false;
Destroy(gameObject);
}
}
void OnDrawGizmos()
{
if (_collider2D == null)
_collider2D = GetComponent<Collider2D>();
Gizmos.color = Color.green;
Gizmos.DrawWireCube(_collider2D.transform.position, _collider2D.bounds.size);
// Gizmos.DrawWireCube(transform.position, _collider2D.bounds.size);
if (TriggerTargets != null)
{
Gizmos.color = Color.magenta;
for (int i = 0; i < TriggerTargets.Length; i++)
Gizmos.DrawLine(transform.position, TriggerTargets[i].transform.position);
}
}
public enum TriggerType
{
Enter = 0,
Stay,
Exit,
}
public void Toggle(bool on)
{
// throw new System.NotImplementedException();
AlreadyForActive = on;
}
}
public interface IqfEventTriggerHandler
{
bool TriggerActivate(Collider2D collider, qf2DEventTrigger.TriggerType type);
bool TriggerActivate(Collider collider, qf2DEventTrigger.TriggerType type);
}
#endif