Instantly share code, notes, and snippets.

What would you like to do?
A simple expendable Laser script for Unity
using UnityEngine;
using System.Collections;
public class LaserScript : MonoBehaviour
[Header("Laser pieces")]
public GameObject laserStart;
public GameObject laserMiddle;
public GameObject laserEnd;
private GameObject start;
private GameObject middle;
private GameObject end;
void Update()
// Create the laser start from the prefab
if (start == null)
start = Instantiate(laserStart) as GameObject;
start.transform.parent = this.transform;
start.transform.localPosition =;
// Laser middle
if (middle == null)
middle = Instantiate(laserMiddle) as GameObject;
middle.transform.parent = this.transform;
middle.transform.localPosition =;
// Define an "infinite" size, not too big but enough to go off screen
float maxLaserSize = 20f;
float currentLaserSize = maxLaserSize;
// Raycast at the right as our sprite has been design for that
Vector2 laserDirection = this.transform.right;
RaycastHit2D hit = Physics2D.Raycast(this.transform.position, laserDirection, maxLaserSize);
if (hit.collider != null)
// We touched something!
// -- Get the laser length
currentLaserSize = Vector2.Distance(hit.point, this.transform.position);
// -- Create the end sprite
if (end == null)
end = Instantiate(laserEnd) as GameObject;
end.transform.parent = this.transform;
end.transform.localPosition =;
// Nothing hit
// -- No more end
if (end != null) Destroy(end);
// Place things
// -- Gather some data
float startSpriteWidth = start.renderer.bounds.size.x;
float endSpriteWidth = 0f;
if (end != null) endSpriteWidth = end.renderer.bounds.size.x;
// -- the middle is after start and, as it has a center pivot, have a size of half the laser (minus start and end)
middle.transform.localScale = new Vector3(currentLaserSize - startSpriteWidth, middle.transform.localScale.y, middle.transform.localScale.z);
middle.transform.localPosition = new Vector2((currentLaserSize/2f), 0f);
// End?
if (end != null)
end.transform.localPosition = new Vector2(currentLaserSize, 0f);

This comment has been minimized.

pentlander commented Apr 26, 2015

Hey thanks a lot for the tutorial. Using your code as a base, I was able to shoot the laser at any angle and I added a fading effect at the end. Here is the code if anyone is interested.


This comment has been minimized.

LegendaryZReborn commented May 1, 2016

I've been running into a problem while using this as a template for my beam. In mine, the position of the middle is increased faster than the scaling. Any ideas why?


This comment has been minimized.

shohan4556 commented Nov 22, 2016

@pentlander : your link is not working


This comment has been minimized.

JoeFinnigan commented Dec 10, 2017

Just wanted to say this has been incredibly helpful with a project I've been working on, and with understanding Raycasting in general. Thank you so much!


This comment has been minimized.

ZoomDomain commented May 8, 2018

Oh it's a 2D one! that game is cool. I'm coding a 3D one and I can do a transparent 2D quad that turns with the camera, except that it will get flat if I look through the end of the lazer.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment