108 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace PolygonArsenal
 | |
| {
 | |
| 
 | |
| public class PolygonBeamStatic : MonoBehaviour
 | |
| {
 | |
| 
 | |
|     [Header("Prefabs")]
 | |
|     public GameObject beamLineRendererPrefab; //Put a prefab with a line renderer onto here.
 | |
|     public GameObject beamStartPrefab; //This is a prefab that is put at the start of the beam.
 | |
|     public GameObject beamEndPrefab; //Prefab put at end of beam.
 | |
| 
 | |
|     private GameObject beamStart;
 | |
|     private GameObject beamEnd;
 | |
|     private GameObject beam;
 | |
|     private LineRenderer line;
 | |
| 
 | |
|     [Header("Beam Options")]
 | |
|     public bool alwaysOn = true; //Enable this to spawn the beam when script is loaded.
 | |
|     public bool beamCollides = true; //Beam stops at colliders
 | |
|     public float beamLength = 100; //Ingame beam length
 | |
|     public float beamEndOffset = 0f; //How far from the raycast hit point the end effect is positioned
 | |
|     public float textureScrollSpeed = 0f; //How fast the texture scrolls along the beam, can be negative or positive.
 | |
|     public float textureLengthScale = 1f;   //Set this to the horizontal length of your texture relative to the vertical. 
 | |
|                                             //Example: if texture is 200 pixels in height and 600 in length, set this to 3
 | |
| 
 | |
|     void Start()
 | |
|     {
 | |
|         
 | |
|     }
 | |
| 
 | |
|     private void OnEnable()
 | |
|     {
 | |
|         if (alwaysOn) //When the object this script is attached to is enabled, spawn the beam.
 | |
|             SpawnBeam();
 | |
|     }
 | |
| 
 | |
|     private void OnDisable() //If the object this script is attached to is disabled, remove the beam.
 | |
|     {
 | |
|         RemoveBeam();
 | |
|     }
 | |
| 
 | |
|     void FixedUpdate()
 | |
|     {
 | |
|         if (beam) //Updates the beam
 | |
|         {
 | |
|             line.SetPosition(0, transform.position);
 | |
| 
 | |
|             Vector3 end;
 | |
|             RaycastHit hit;
 | |
|             if (beamCollides && Physics.Raycast(transform.position, transform.forward, out hit)) //Checks for collision
 | |
|                 end = hit.point - (transform.forward * beamEndOffset);
 | |
|             else
 | |
|                 end = transform.position + (transform.forward * beamLength);
 | |
| 
 | |
|             line.SetPosition(1, end);
 | |
| 
 | |
|             if (beamStart)
 | |
|             {
 | |
|                 beamStart.transform.position = transform.position;
 | |
|                 beamStart.transform.LookAt(end);
 | |
|             }
 | |
|             if (beamEnd)
 | |
|             {
 | |
|                 beamEnd.transform.position = end;
 | |
|                 beamEnd.transform.LookAt(beamStart.transform.position);
 | |
|             }
 | |
| 
 | |
|             float distance = Vector3.Distance(transform.position, end);
 | |
|             line.material.mainTextureScale = new Vector2(distance / textureLengthScale, 1); //This sets the scale of the texture so it doesn't look stretched
 | |
|             line.material.mainTextureOffset -= new Vector2(Time.deltaTime * textureScrollSpeed, 0); //This scrolls the texture along the beam if not set to 0
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     public void SpawnBeam() //This function spawns the prefab with linerenderer
 | |
|     {
 | |
|         if (beamLineRendererPrefab)
 | |
|         {
 | |
|             if (beamStartPrefab)
 | |
|                 beamStart = Instantiate(beamStartPrefab);
 | |
|             if (beamEndPrefab)
 | |
|                 beamEnd = Instantiate(beamEndPrefab);
 | |
|             beam = Instantiate(beamLineRendererPrefab);
 | |
|             beam.transform.position = transform.position;
 | |
|             beam.transform.parent = transform;
 | |
|             beam.transform.rotation = transform.rotation;
 | |
|             line = beam.GetComponent<LineRenderer>();
 | |
|             line.useWorldSpace = true;
 | |
|             line.positionCount = 2;
 | |
|         }
 | |
|         else
 | |
|             print("Add a hecking prefab with a line renderer to the SciFiBeamStatic script on " + gameObject.name + "! Heck!");
 | |
|     }
 | |
| 
 | |
|     public void RemoveBeam() //This function removes the prefab with linerenderer
 | |
|     {
 | |
|         if (beam)
 | |
|             Destroy(beam);
 | |
|         if (beamStart)
 | |
|             Destroy(beamStart);
 | |
|         if (beamEnd)
 | |
|             Destroy(beamEnd);
 | |
|     }
 | |
| }
 | |
| } |