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