How to make laser stay with player while moving
Hello, I'm using a raycast to shoot a laser at an object on a specific layer which is working, but the starting point stays at the position of the player as the player moves away. How can i keep the laser focused on both objects as they are moving around the scene? Heres the code i have put together so far. Thank you
using UnityEngine;
using System.Collections;
public class MiningLaser : MonoBehaviour {
LineRenderer line;
public bool IsKeyEnabled_M { get; set; }
int layerMask = 1 << 8;
void Start()
{
IsKeyEnabled_M = true;
line = gameObject.GetComponent<LineRenderer> ();
line.enabled = false;
}
void Update()
{
if (IsKeyEnabled_M)
{
if (Input.GetKeyDown (KeyCode.M))
{
StopCoroutine ("FireMiningLaser");
StartCoroutine (FireMiningLaser (2.0f));
}
}
}
IEnumerator FireMiningLaser(float waitTime)
{
line.enabled = true;
IsKeyEnabled_M = false;
while (Input.GetKeyDown (KeyCode.M))
{
Ray ray = new Ray (transform.position, transform.forward);
RaycastHit hit;
line.SetPosition (0, ray.origin);
if (Physics.Raycast (ray, out hit, 100, layerMask))
line.SetPosition (1, hit.transform.position);
else
line.SetPosition (1, ray.GetPoint (100));
yield return new WaitForSeconds (waitTime);
}
line.enabled = false;
IsKeyEnabled_M = true;
}
}
Comment
Best Answer
Answer by sk8terboy4 · Mar 09, 2016 at 12:07 AM
using UnityEngine;
using System.Collections;
public class MiningLaser : MonoBehaviour {
public LineRenderer line;
public bool IsKeyEnabled_M { get; set; }
int layerMask = 1 << 8;
public float waitTime = 1.0f;
void Start()
{
IsKeyEnabled_M = true;
line = gameObject.GetComponent<LineRenderer>();
line.enabled = false;
}
void Update()
{
line.SetPosition(0, transform.position);
if (Input.GetKeyDown(KeyCode.M))
{
IsKeyEnabled_M = true;
StartCoroutine(FireMiningLaser(waitTime));
}
else if (Input.GetKeyUp(KeyCode.M))
{
IsKeyEnabled_M = false;
StopCoroutine("FireMiningLaser");
}
}
IEnumerator FireMiningLaser(float waitTime)
{
line.enabled = true;
while (IsKeyEnabled_M)
{
Ray ray = new Ray(transform.position, transform.forward);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 100, layerMask))
line.SetPosition(1, hit.transform.position);
else
line.SetPosition(1, ray.GetPoint(100));
yield return new WaitForSeconds(waitTime);
}
line.enabled = false;
}
}
Try this script. I don't know if you want the laser to be semi auto or not. Instead of using WaitForSeconds do yield return null, if you want a continuous laser. When working with coroutines, the transform is not updated on every frame like in the update function, but instead it is updated in intervals (when in a coroutine).