Raycast Troubleshooting
Hi, there. I'm still learning and have been struggling with Raycast. This is the fourth iteration of some code I'm using in an attempt to make a simple laser pointer. I want the laser to extend just a bit (rather than forever) and I want it to stop if it collides with anything. Pretty basic, I thought. I have the laser pointer working fine with Line Renderer. But when I add the Raycast code, it doesn't point forward -- it points at a weird downward angle. When I change this:
else
{
laserBeam.SetPosition(1, shootRay.origin + shootRay.direction * range);
to this:
else
{
laserBeam.SetPosition(1, transform.forward * 5000);
it points at the correct angle but extends forever -- so I must be doing something wrong with the range. Is there a better way? Thanks for any suggestions!
Oh! I'm working in Unity 2018.3.3f1, in an iOS build.
public class beam : MonoBehaviour
{
public float range = 5f;
LineRenderer laserBeam;
RaycastHit laserHit;
Ray shootRay;
// Use this for initialization
void Start ()
{
laserBeam = GetComponent<LineRenderer>();
}
// Update is called once per frame
void Update ()
{
shootRay.origin = transform.position;
shootRay.direction = transform.forward;
if (Physics.Raycast(shootRay, out laserHit, range))
{
if(laserHit.collider)
{
laserBeam.SetPosition(1, laserHit.point);
}
}
else
{
laserBeam.SetPosition(1, shootRay.origin + shootRay.direction * range);
}
}
}
Answer by katynoellescott · Feb 09, 2019 at 08:07 AM
I solved it! I had "use world space" unchecked on my line renderers -- and double-checked, by using code to set it to false -- without an impact. But I still needed to use transform.InverseTransformPoint. I'm not 100% sure WHY -- so if you know, I'd love to understand this better. But at least I got the code working with this:
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class beam : MonoBehaviour
{
public float range = 5f;
LineRenderer laserBeam;
RaycastHit hit;
Ray shootRay;
// Use this for initialization
void Start ()
{
laserBeam = GetComponent<LineRenderer>();
}
// Update is called once per frame
void Update ()
{
laserBeam.SetPosition (0, Vector3.zero);
if (Physics.Raycast(transform.position, transform.forward, out hit, range))
{
//If needed, use next two lines to test code
//print("Found an object - distance: " + hit.point);
//Debug.DrawRay(transform.position, transform.forward, Color.yellow);
if(hit.collider)
{
laserBeam.SetPosition(1, transform.InverseTransformPoint(hit.point));
}
}
else
{
laserBeam.SetPosition(1, transform.InverseTransformPoint(transform.position + transform.forward * range));
}
}
}