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); | |||
|  |     } | |||
|  | } | |||
|  | } |