here you go... with this type of logic, always start with the 'end' state/condition and work backwards into the loop
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent (typeof(LineRenderer))]
public class RayCastReflection : MonoBehaviour
{
//this game object's Transform
private Transform goTransform;
//the attached line renderer
private LineRenderer lineRenderer;
//a ray
private Ray ray;
//a RaycastHit variable, to gather informartion about the ray's collision
private RaycastHit hit;
//reflection direction
private Vector3 direction;
//the number of reflections
public int nReflections = 2;
//max length
public float maxLength = 100f;
//the number of points at the line renderer
private int numPoints;
//private int pointCount;
void Awake ()
{
//get the attached Transform component
goTransform = this.GetComponent<Transform> ();
//get the attached LineRenderer component
lineRenderer = this.GetComponent<LineRenderer> ();
}
void Update ()
{
//clamp the number of reflections between 1 and int capacity
nReflections = Mathf.Clamp (nReflections, 1, nReflections);
ray = new Ray (goTransform.position, goTransform.forward);
//start with just the origin
lineRenderer.positionCount = 1;
lineRenderer.SetPosition (0, goTransform.position);
float remainingLength = maxLength;
//bounce up to n times
for (int i = 0; i < nReflections; i++) {
// ray cast
if (Physics.Raycast (ray.origin, ray.direction, out hit, remainingLength)) {
//we hit, update line renderer
lineRenderer.positionCount += 1;
lineRenderer.SetPosition (lineRenderer.positionCount - 1, hit.point);
// update remaining length and set up ray for next loop
remainingLength -= Vector3.Distance (ray.origin, hit.point);
ray = new Ray (hit.point, Vector3.Reflect(ray.direction, hit.normal));
// break loop if we don't hit a Mirror
if (hit.collider.tag != "Mirror")
break;
} else {
// We didn't hit anything, draw line to end of ramainingLength
lineRenderer.positionCount += 1;
lineRenderer.SetPosition (lineRenderer.positionCount - 1, ray.origin + ray.direction * remainingLength);
break;
}
}
}
}