Elin Decompiled Documentation EA 23.102 Nightly
Loading...
Searching...
No Matches
LineBasedLaser.cs
Go to the documentation of this file.
1using System;
2using System.Collections;
3using UnityEngine;
4
5namespace TwoDLaserPack;
6
7public class LineBasedLaser : MonoBehaviour
8{
9 public delegate void LaserHitTriggerHandler(RaycastHit2D hitInfo);
10
11 public LineRenderer laserLineRendererArc;
12
13 public LineRenderer laserLineRenderer;
14
15 public int laserArcSegments = 20;
16
17 public bool laserActive;
18
19 public bool ignoreCollisions;
20
21 public GameObject targetGo;
22
23 public float laserTexOffsetSpeed = 1f;
24
25 public ParticleSystem hitSparkParticleSystem;
26
27 public float laserArcMaxYDown;
28
29 public float laserArcMaxYUp;
30
31 public float maxLaserRaycastDistance = 20f;
32
34
35 public bool lerpLaserRotation;
36
37 public float turningRate = 3f;
38
39 public float collisionTriggerInterval = 0.25f;
40
41 public LayerMask mask;
42
43 public string sortLayer = "Default";
44
45 public int sortOrder;
46
47 public bool useArc;
48
49 private GameObject gameObjectCached;
50
51 private float laserAngle;
52
53 private float laserTextureOffset;
54
55 private float laserTextureXScale;
56
58
60
62
63 private ParticleSystem.EmissionModule hitSparkEmission;
64
66
67 private void Start()
68 {
69 startLaserTextureXScale = laserLineRenderer.material.mainTextureScale.x;
71 laserLineRenderer.sortingLayerName = sortLayer;
72 laserLineRenderer.sortingOrder = sortOrder;
73 laserLineRendererArc.sortingLayerName = sortLayer;
74 laserLineRendererArc.sortingOrder = sortOrder;
75 }
76
77 private void Awake()
78 {
80 }
81
82 private void OnEnable()
83 {
84 gameObjectCached = base.gameObject;
85 if (laserLineRendererArc != null)
86 {
88 }
89 }
90
91 private void OnDisable()
92 {
93 }
94
95 private void Update()
96 {
97 if (!(gameObjectCached != null) || !laserActive)
98 {
99 return;
100 }
101 laserLineRenderer.material.mainTextureOffset = new Vector2(laserTextureOffset, 0f);
102 laserTextureOffset -= Time.deltaTime * laserTexOffsetSpeed;
103 RaycastHit2D raycastHit2D;
104 if (laserRotationEnabled && targetGo != null)
105 {
106 Vector3 vector = targetGo.transform.position - gameObjectCached.transform.position;
107 laserAngle = Mathf.Atan2(vector.y, vector.x);
108 if (laserAngle < 0f)
109 {
110 laserAngle = MathF.PI * 2f + laserAngle;
111 }
112 float angle = laserAngle * 57.29578f;
114 {
115 base.transform.rotation = Quaternion.Slerp(base.transform.rotation, Quaternion.AngleAxis(angle, base.transform.forward), Time.deltaTime * turningRate);
116 Vector3 vector2 = base.transform.rotation * Vector3.right;
117 raycastHit2D = Physics2D.Raycast(base.transform.position, vector2, maxLaserRaycastDistance, mask);
118 }
119 else
120 {
121 base.transform.rotation = Quaternion.AngleAxis(angle, base.transform.forward);
122 raycastHit2D = Physics2D.Raycast(base.transform.position, vector, maxLaserRaycastDistance, mask);
123 }
124 }
125 else
126 {
127 raycastHit2D = Physics2D.Raycast(base.transform.position, base.transform.right, maxLaserRaycastDistance, mask);
128 }
129 if (!ignoreCollisions)
130 {
131 if (raycastHit2D.collider != null)
132 {
133 SetLaserEndToTargetLocation(raycastHit2D);
135 {
136 StartCoroutine(HitTrigger(collisionTriggerInterval, raycastHit2D));
137 }
138 }
139 else
140 {
142 }
143 }
144 else
145 {
147 }
148 }
149
150 private IEnumerator HitTrigger(float triggerInterval, RaycastHit2D hit)
151 {
153 if (this.OnLaserHitTriggered != null)
154 {
155 this.OnLaserHitTriggered(hit);
156 }
157 yield return new WaitForSeconds(triggerInterval);
158 waitingForTriggerTime = false;
159 }
160
161 public void SetLaserState(bool enabledStatus)
162 {
163 laserActive = enabledStatus;
164 laserLineRenderer.enabled = enabledStatus;
165 if (laserLineRendererArc != null)
166 {
167 laserLineRendererArc.enabled = enabledStatus;
168 }
169 if (hitSparkParticleSystem != null)
170 {
171 hitSparkEmission.enabled = enabledStatus;
172 }
173 }
174
175 private void SetLaserEndToTargetLocation(RaycastHit2D hit)
176 {
177 float num = Vector2.Distance(hit.point, laserLineRenderer.transform.position);
178 laserLineRenderer.SetPosition(1, new Vector2(num, 0f));
180 laserLineRenderer.material.mainTextureScale = new Vector2(laserTextureXScale, 1f);
181 if (useArc)
182 {
183 if (!laserLineRendererArc.enabled)
184 {
185 laserLineRendererArc.enabled = true;
186 }
187 int vertexCount = Mathf.Abs((int)num);
188 laserLineRendererArc.SetVertexCount(vertexCount);
189 laserArcSegments = vertexCount;
190 SetLaserArcVertices(num, useHitPoint: true);
191 }
192 else if (laserLineRendererArc.enabled)
193 {
194 laserLineRendererArc.enabled = false;
195 }
196 if (hitSparkParticleSystem != null)
197 {
198 hitSparkParticleSystem.transform.position = hit.point;
199 hitSparkEmission.enabled = true;
200 }
201 }
202
204 {
205 laserLineRenderer.SetPosition(1, new Vector2(laserArcSegments, 0f));
207 laserLineRenderer.material.mainTextureScale = new Vector2(laserTextureXScale, 1f);
208 if (useArc)
209 {
210 if (!laserLineRendererArc.enabled)
211 {
212 laserLineRendererArc.enabled = true;
213 }
216 SetLaserArcVertices(0f, useHitPoint: false);
217 }
218 else
219 {
220 if (laserLineRendererArc.enabled)
221 {
222 laserLineRendererArc.enabled = false;
223 }
226 }
227 if (hitSparkParticleSystem != null)
228 {
229 hitSparkEmission.enabled = false;
230 hitSparkParticleSystem.transform.position = new Vector2(laserArcSegments, base.transform.position.y);
231 }
232 }
233
234 private void SetLaserArcVertices(float distancePoint, bool useHitPoint)
235 {
236 for (int i = 1; i < laserArcSegments; i++)
237 {
238 float y = Mathf.Clamp(Mathf.Sin((float)i + Time.time * UnityEngine.Random.Range(0.5f, 1.3f)), laserArcMaxYDown, laserArcMaxYUp);
239 Vector2 vector = new Vector2((float)i * 1.2f, y);
240 if (useHitPoint && i == laserArcSegments - 1)
241 {
242 laserLineRendererArc.SetPosition(i, new Vector2(distancePoint, 0f));
243 }
244 else
245 {
246 laserLineRendererArc.SetPosition(i, vector);
247 }
248 }
249 }
250}
ParticleSystem.EmissionModule hitSparkEmission
void SetLaserState(bool enabledStatus)
void SetLaserEndToTargetLocation(RaycastHit2D hit)
LaserHitTriggerHandler OnLaserHitTriggered
delegate void LaserHitTriggerHandler(RaycastHit2D hitInfo)
void SetLaserArcVertices(float distancePoint, bool useHitPoint)
IEnumerator HitTrigger(float triggerInterval, RaycastHit2D hit)
ParticleSystem hitSparkParticleSystem