- Home /
Question by
Piotrone · May 15, 2015 at 05:25 AM ·
linerendererraycasthit2dhit.point
How to add lights and particles at multiple hit points of a Raycast2d?
I'm building a laser that collides with multiple 2D tiles and I'd like to add a light and a particle effect on every collision point (see image).
I'm using pooling, and so far I managed to add particles at the last hit point, and infinite lights at every hit point (every light per every collision I suppose). Any ideas on how to achieve this? Thanks
using UnityEngine;
using System.Collections;
[RequireComponent (typeof(LineRenderer))]
public class WeaponLaserBeams : MonoBehaviour {
[Range(0f, 1f)] public float LaserThinkness = 0.1f;
public LayerMask LayerMask;
public int LaserMaxReach = 10;
public int LaserMaxReflections;
RaycastHit2D Hit;
LineRenderer Laser;
private bool isActive;
private Vector3 CurrentDirection;
private Vector3 CurrentPosition;
private int Vertices = 1;
void Start() {
Laser = GetComponent<LineRenderer>();
}
void Update() {
Laser.enabled = Input.GetMouseButton (0);
if (Input.GetMouseButton (0)) {
DrawLaser ();
}
}
public static Vector2 Reflect(Vector2 vector, Vector2 normal) {
return vector - 2 * Vector2.Dot(vector, normal) * normal;
}
public void DrawLaser() {
Vertices = 1;
isActive = true;
CurrentDirection = transform.right;
CurrentPosition = transform.position;
Laser.SetVertexCount (1);
Laser.SetPosition (0,transform.position);
GameObject spark;
spark = ObjectPooler.instance.GetUsableSparkParticle ();
GameObject light;
light = ObjectPooler.instance.GetUsableLaserHitLight ();
while(isActive) {
Vertices++;
Laser.SetVertexCount(Vertices);
Hit = Physics2D.Raycast(CurrentPosition, CurrentDirection, LaserMaxReach, LayerMask);
if(Hit.collider != null) {
CurrentPosition = Hit.point;
CurrentDirection = Reflect(CurrentDirection, Hit.normal);
Laser.SetPosition(Vertices-1, Hit.point);
if (spark != null) {
spark.transform.position = Hit.point;
spark.SetActive (true);
}
if (light != null) {
light.transform.position = Hit.point;
light.SetActive(true);
}
} else {
isActive = false;
Laser.SetPosition(Vertices-1, 50*CurrentDirection);
light.SetActive(false);
}
if (Vertices > LaserMaxReflections)
{
isActive = false;
}
}
}
}
light-and-spark.jpg
(17.9 kB)
Comment
Your answer
![](https://koobas.hobune.stream/wayback/20220613195617im_/https://answers.unity.com/themes/thub/images/avi.jpg)