13 public event LineBasedLaser.LaserHitTriggerHandler OnLaserHitTriggered;
18 this.startLaserTextureXScale = this.laserLineRenderer.material.mainTextureScale.x;
19 this.startLaserSegmentLength = this.laserArcSegments;
20 this.laserLineRenderer.sortingLayerName = this.sortLayer;
21 this.laserLineRenderer.sortingOrder = this.sortOrder;
22 this.laserLineRendererArc.sortingLayerName = this.sortLayer;
23 this.laserLineRendererArc.sortingOrder = this.sortOrder;
29 this.hitSparkEmission = this.hitSparkParticleSystem.emission;
33 private void OnEnable()
35 this.gameObjectCached = base.gameObject;
36 if (this.laserLineRendererArc !=
null)
38 this.laserLineRendererArc.SetVertexCount(this.laserArcSegments);
43 private void OnDisable()
50 if (this.gameObjectCached !=
null && this.laserActive)
52 this.laserLineRenderer.material.mainTextureOffset =
new Vector2(this.laserTextureOffset, 0f);
53 this.laserTextureOffset -= Time.deltaTime * this.laserTexOffsetSpeed;
54 RaycastHit2D raycastHit2D;
55 if (this.laserRotationEnabled && this.targetGo !=
null)
57 Vector3 vector = this.targetGo.transform.position - this.gameObjectCached.transform.position;
58 this.laserAngle = Mathf.Atan2(vector.y, vector.x);
59 if (this.laserAngle < 0f)
61 this.laserAngle = 6.2831855f + this.laserAngle;
63 float angle = this.laserAngle * 57.29578f;
64 if (this.lerpLaserRotation)
66 base.transform.rotation = Quaternion.Slerp(base.transform.rotation, Quaternion.AngleAxis(angle, base.transform.forward), Time.deltaTime *
this.turningRate);
67 Vector3 v = base.transform.rotation * Vector3.right;
68 raycastHit2D = Physics2D.Raycast(base.transform.position, v,
this.maxLaserRaycastDistance,
this.mask);
72 base.transform.rotation = Quaternion.AngleAxis(angle, base.transform.forward);
73 raycastHit2D = Physics2D.Raycast(base.transform.position, vector,
this.maxLaserRaycastDistance,
this.mask);
78 raycastHit2D = Physics2D.Raycast(base.transform.position, base.transform.right,
this.maxLaserRaycastDistance,
this.mask);
80 if (!this.ignoreCollisions)
82 if (!(raycastHit2D.collider !=
null))
84 this.SetLaserToDefaultLength();
87 this.SetLaserEndToTargetLocation(raycastHit2D);
88 if (!this.waitingForTriggerTime)
90 base.StartCoroutine(this.HitTrigger(this.collisionTriggerInterval, raycastHit2D));
96 this.SetLaserToDefaultLength();
102 private IEnumerator HitTrigger(
float triggerInterval, RaycastHit2D hit)
104 this.waitingForTriggerTime =
true;
105 if (this.OnLaserHitTriggered !=
null)
107 this.OnLaserHitTriggered(hit);
109 yield
return new WaitForSeconds(triggerInterval);
110 this.waitingForTriggerTime =
false;
115 public void SetLaserState(
bool enabledStatus)
117 this.laserActive = enabledStatus;
118 this.laserLineRenderer.enabled = enabledStatus;
119 if (this.laserLineRendererArc !=
null)
121 this.laserLineRendererArc.enabled = enabledStatus;
123 if (this.hitSparkParticleSystem !=
null)
125 this.hitSparkEmission.enabled = enabledStatus;
130 private void SetLaserEndToTargetLocation(RaycastHit2D hit)
132 float num = Vector2.Distance(hit.point,
this.laserLineRenderer.transform.position);
133 this.laserLineRenderer.SetPosition(1,
new Vector2(num, 0f));
134 this.laserTextureXScale = this.startLaserTextureXScale * num;
135 this.laserLineRenderer.material.mainTextureScale =
new Vector2(this.laserTextureXScale, 1f);
138 if (!this.laserLineRendererArc.enabled)
140 this.laserLineRendererArc.enabled =
true;
142 int vertexCount = Mathf.Abs((
int)num);
143 this.laserLineRendererArc.SetVertexCount(vertexCount);
144 this.laserArcSegments = vertexCount;
145 this.SetLaserArcVertices(num,
true);
147 else if (this.laserLineRendererArc.enabled)
149 this.laserLineRendererArc.enabled =
false;
151 if (this.hitSparkParticleSystem !=
null)
153 this.hitSparkParticleSystem.transform.position = hit.point;
154 this.hitSparkEmission.enabled =
true;
159 private void SetLaserToDefaultLength()
161 this.laserLineRenderer.SetPosition(1,
new Vector2((
float)this.laserArcSegments, 0f));
162 this.laserTextureXScale = this.startLaserTextureXScale * (float)this.laserArcSegments;
163 this.laserLineRenderer.material.mainTextureScale =
new Vector2(this.laserTextureXScale, 1f);
166 if (!this.laserLineRendererArc.enabled)
168 this.laserLineRendererArc.enabled =
true;
170 this.laserLineRendererArc.SetVertexCount(this.startLaserSegmentLength);
171 this.laserArcSegments = this.startLaserSegmentLength;
172 this.SetLaserArcVertices(0f,
false);
176 if (this.laserLineRendererArc.enabled)
178 this.laserLineRendererArc.enabled =
false;
180 this.laserLineRendererArc.SetVertexCount(this.startLaserSegmentLength);
181 this.laserArcSegments = this.startLaserSegmentLength;
183 if (this.hitSparkParticleSystem !=
null)
185 this.hitSparkEmission.enabled =
false;
186 this.hitSparkParticleSystem.transform.position =
new Vector2((
float)this.laserArcSegments, base.transform.position.y);
191 private void SetLaserArcVertices(
float distancePoint,
bool useHitPoint)
193 for (
int i = 1; i < this.laserArcSegments; i++)
195 float y = Mathf.Clamp(Mathf.Sin((
float)i + Time.time * UnityEngine.Random.Range(0.5f, 1.3f)),
this.laserArcMaxYDown,
this.laserArcMaxYUp);
196 Vector2 v =
new Vector2((
float)i * 1.2f, y);
197 if (useHitPoint && i == this.laserArcSegments - 1)
199 this.laserLineRendererArc.SetPosition(i,
new Vector2(distancePoint, 0f));
203 this.laserLineRendererArc.SetPosition(i, v);
209 public LineRenderer laserLineRendererArc;
212 public LineRenderer laserLineRenderer;
215 public int laserArcSegments = 20;
218 public bool laserActive;
221 public bool ignoreCollisions;
224 public GameObject targetGo;
227 public float laserTexOffsetSpeed = 1f;
230 public ParticleSystem hitSparkParticleSystem;
233 public float laserArcMaxYDown;
236 public float laserArcMaxYUp;
239 public float maxLaserRaycastDistance = 20f;
242 public bool laserRotationEnabled;
245 public bool lerpLaserRotation;
248 public float turningRate = 3f;
251 public float collisionTriggerInterval = 0.25f;
254 public LayerMask mask;
257 public string sortLayer =
"Default";
260 public int sortOrder;
266 private GameObject gameObjectCached;
269 private float laserAngle;
272 private float laserTextureOffset;
275 private float laserTextureXScale;
278 private float startLaserTextureXScale;
281 private int startLaserSegmentLength;
284 private bool waitingForTriggerTime;
287 private ParticleSystem.EmissionModule hitSparkEmission;
291 public delegate
void LaserHitTriggerHandler(RaycastHit2D hitInfo);