Question by
ECortina · Dec 30, 2020 at 11:33 AM ·
collisionlinerenderertriggersraycastall
RaycastAll doesnt register collisions correctly.
We were trying to create a 3D laser puzzle with mirrors but the collisions don't register with the raycast as we expected. When there's a wall the line renderer goes through all the objects, but if we lift the wall leaving a blank space behind the objects, the line renderer does reflect, but the raycast registers the whole line.
This is our code:
using System.Collections; using System.Collections.Generic; using UnityEngine;
[RequireComponent(typeof(LineRenderer))]
public class Reflection : MonoBehaviour { public int reflections; public float maxLength;
private LineRenderer lineRenderer;
private Ray ray;
private RaycastHit[] hit;
private Vector3 direction;
bool broke = false;
void Awake()
{
lineRenderer = GetComponent<LineRenderer>();
}
void Update()
{
ray = new Ray(transform.position, transform.forward);
lineRenderer.positionCount = 1;
lineRenderer.SetPosition(0, transform.position);
float remainingLength = maxLength;
for (int i = 0; i < reflections; i++)
{
broke = false;
hit = Physics.RaycastAll(ray.origin, ray.direction, remainingLength);
if (Physics.RaycastAll(ray.origin, ray.direction, remainingLength) != null)
{
for (int h = 0; h < hit.Length; h++)
{
if (!broke)
{
if (hit[h].collider.isTrigger == false)
{
lineRenderer.positionCount += 1;
lineRenderer.SetPosition(lineRenderer.positionCount - 1, hit[h].point);
remainingLength -= Vector3.Distance(ray.origin, hit[h].point);
if (hit[h].collider.tag == "Mirror")
{
ray = new Ray(hit[h].point, Vector3.Reflect(ray.direction, hit[h].normal));
broke = true;
//break;
}
break;
}
else
{
Debug.Log("hit " + hit[h].collider.name);
}
}
}
}
else
{
lineRenderer.positionCount += 1;
lineRenderer.SetPosition(lineRenderer.positionCount - 1, ray.origin + ray.direction * remainingLength);
}
}
}
}
Comment