Question by 
               DanielDouglas · May 23 at 09:01 AM · 
                hit  
              
 
              LineRender, Raycast, Laser point A to Point B
my object is create a line from point A to point B, in point B (hit.point) i need to create a new line from point B to point C, but maintein de line before A-B. the new line need to give the color from material hit. like image:
my code:
using UnityEditor; using UnityEngine;
public class BeamerManager : MonoBehaviour { [Header("Laser Controls")]
 [SerializeField] private GameObject LaserPrefab;
 [SerializeField] private Transform firePoint;
 [SerializeField] private float maxLenght;
 [SerializeField] private int reflections;
 //Laser Attributes
 private Renderer laserMaterialModel;
 private LineRenderer lineRenderer;
 
 private Ray ray;
 private RaycastHit hit;
 private float remainingLenght;
 private Color defaultColor;
 private void Awake()
 {
     
 }
 void Start()
 {
     laserMaterialModel = LaserPrefab.GetComponent<Renderer>();
     lineRenderer = LaserPrefab.GetComponent<LineRenderer>();
     defaultColor = laserMaterialModel.material.color;
 }
 void OnDrawGizmos()
 {
     Handles.color = Color.red;
     Handles.ArrowHandleCap(0, firePoint.position, firePoint.rotation, 0.5f, EventType.Repaint);
     DrawGismoLine(firePoint.position + firePoint.forward * 0.75f, firePoint.forward, reflections);
 }
 void Update()
 {
     UpdateLaser();
 }
 private void UpdateLaser()
 {
     
     ray = new Ray(firePoint.position, firePoint.forward);
     lineRenderer.positionCount = 1;
     lineRenderer.SetPosition(0, firePoint.position);
     remainingLenght = maxLenght;
     if (!Physics.Raycast(ray, out hit, remainingLenght))
     {
         lineRenderer.positionCount += 1;
         lineRenderer.SetPosition(lineRenderer.positionCount - 1, ray.origin + ray.direction * remainingLenght);
         laserMaterialModel.material.SetColor("_Color", defaultColor);
     }
     else
     {
        DrawPredictedReflectionPattern(firePoint.position, firePoint.forward, reflections, null);
     }
 }
 private void DrawPredictedReflectionPattern(Vector3 position, Vector3 direction, int reflectionsRemaining, GameObject newLine)
 {
     if (reflectionsRemaining == 0)
     {
         return;
     }
     
     //Vector3 startPosition = position;
     ray = new Ray(position, direction);
     
     //verify hit something
     if (Physics.Raycast(ray, out hit, remainingLenght))
     {
         //verify "Sphere" hit or not
         if (hit.collider.tag == "Sphere")
         {
             if ( newLine != null)
             {
                 print("Destruiu");
                 Destroy(newLine);
                
                 //lineRenderer.positionCount = 0;
             }
             lineRenderer.positionCount += 1;
             lineRenderer.SetPosition(lineRenderer.positionCount - 1, hit.point);
             newLine = Instantiate(LaserPrefab);
             lineRenderer = newLine.GetComponent<LineRenderer>();
             laserMaterialModel = newLine.GetComponent<Renderer>();
             direction = ray.direction;
             position = ray.origin + ray.direction * remainingLenght;
             lineRenderer.positionCount = 1;
             lineRenderer.SetPosition(lineRenderer.positionCount - 1, hit.point);
            
             print("Entrou na Sphere - " + hit.collider.tag);
             SetLaserColor();
             //print("");
         }
         else
         {
             if (newLine != null)
             {
                 Destroy(newLine);
                 lineRenderer = null;
                 //lineRenderer.positionCount = 0;
                 print("Destruiu");
             }
             newLine = Instantiate(LaserPrefab);
             lineRenderer = newLine.GetComponent<LineRenderer>();
             direction = Vector3.Reflect(direction, hit.normal);
             position = hit.transform.position;
             //SetLaserColor();
         }
         
     }
     else
     {
         position += direction * maxLenght;
     }
     
     lineRenderer.positionCount += 1;
     lineRenderer.SetPosition(lineRenderer.positionCount - 1, position);
     DrawPredictedReflectionPattern(position, direction, reflectionsRemaining - 1,newLine);
 }
 private void DrawGismoLine(Vector3 position, Vector3 direction, int reflectionsRemaining)
 {
     if (reflectionsRemaining == 0)
     {
         return;
     }
     Vector3 startingPosition = position;
     ray = new Ray(position, direction);
     //verify hit something
     if (Physics.Raycast(ray, out hit, maxLenght))
     {
         //verify "Sphere" hit or not
         if (hit.collider.tag == "Sphere")
         {
             direction = ray.direction;
             position = hit.collider.gameObject.transform.position;
             
         }
         else
         {
             direction = Vector3.Reflect(direction, hit.normal);
             position = hit.point;
         }
     }
     else
     {
         position += direction * maxLenght;
     }
    
     Gizmos.color = Color.magenta;
     Gizmos.DrawLine(startingPosition, position);
     DrawGismoLine(position, direction, reflectionsRemaining - 1);
 }
 private void SetLaserColor()
 {
     //verify if get a Component Renderer form hit object
     if (hit.transform.GetComponent<Renderer>())
     {
         Renderer selectionRenderer = hit.transform.GetComponent<Renderer>();
         Material hitMaterial = new Material(selectionRenderer.material);
         Color hitColor = new Color(hitMaterial.color.r, hitMaterial.color.g, hitMaterial.color.b, hitMaterial.color.a);
         hitColor.a = 100;
         laserMaterialModel.material.SetColor("_Color", hitColor);
     }
 }
 //private void OnDestroy()
 //{
 //    Destroy(laserMaterialModel.material);
 //}
}
 
                 
                exemplo.png 
                (4.3 kB) 
               
 
              
               Comment
              
 
               
              Your answer
 
 
              koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                