protected virtual void LaserCast(Vector3 sourcePoint, Vector3 laserDirection) { Ray laserRayCast = new Ray(sourcePoint, laserDirection); RaycastHit hit; if (Physics.Raycast(laserRayCast, out hit, 100.0f, Physics.AllLayers, QueryTriggerInteraction.Ignore)) { _lr.SetPosition(_lr.positionCount - 1, hit.point); LaserReciever reciever = hit.collider.GetComponent <LaserReciever>(); if (reciever) { reciever.RecieveLaser(); } if (hit.collider.tag == "Reflective" && _bounces < MaxBounces) { _bounces++; _lr.positionCount++; LaserCast(hit.point, Vector3.Reflect(laserDirection, hit.normal)); } } else { _lr.SetPosition(_lr.positionCount - 1, laserRayCast.GetPoint(100.0f)); } }
void Update() { Vector2 start = transform.position; Vector2 direction = transform.rotation * Vector2.up; points.Clear(); points.Add(start); RaycastHit2D hit; for (int i = 0; i <= maxJumps; i++) { hit = Physics2D.Raycast(start, direction, maxDist, mask); if (hit.collider) { start = hit.point - direction * 0.05f; direction = direction - 2f * Vector2.Dot(direction, hit.normal) * hit.normal; points.Add(start); LaserReciever lr = hit.transform.GetComponent <LaserReciever>(); if (lr) { lr.Trigger(); break; } } else { points.Add(start + direction * maxDist); break; } } lr.positionCount = points.Count; lr.SetPositions(points.ToArray()); }