155 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
| using UnityEngine;
 | |
| using System.Collections;
 | |
| using UnityEngine.UI;
 | |
| 
 | |
| namespace PolygonArsenal
 | |
| {
 | |
| 
 | |
| public class PolygonBeamScript : MonoBehaviour {
 | |
| 
 | |
|     [Header("Prefabs")]
 | |
|     public GameObject[] beamLineRendererPrefab;
 | |
|     public GameObject[] beamStartPrefab;
 | |
|     public GameObject[] beamEndPrefab;
 | |
| 
 | |
|     private int currentBeam = 0;
 | |
| 
 | |
|     private GameObject beamStart;
 | |
|     private GameObject beamEnd;
 | |
|     private GameObject beam;
 | |
|     private LineRenderer line;
 | |
| 
 | |
|     [Header("Adjustable Variables")]
 | |
|     public float beamEndOffset = 1f; //How far from the raycast hit point the end effect is positioned
 | |
|     public float textureScrollSpeed = 8f; //How fast the texture scrolls along the beam
 | |
| 	public float textureLengthScale = 3; //Length of the beam texture
 | |
| 
 | |
|     [Header("Put Sliders here (Optional)")]
 | |
|     public Slider endOffSetSlider; //Use UpdateEndOffset function on slider
 | |
|     public Slider scrollSpeedSlider; //Use UpdateScrollSpeed function on slider
 | |
| 
 | |
|     [Header("Put UI Text object here to show beam name")]
 | |
|     public Text textBeamName;
 | |
| 
 | |
|     // Use this for initialization
 | |
|     void Start()
 | |
|     {
 | |
|         if (textBeamName)
 | |
|             textBeamName.text = beamLineRendererPrefab[currentBeam].name;
 | |
|         if (endOffSetSlider)
 | |
|             endOffSetSlider.value = beamEndOffset;
 | |
|         if (scrollSpeedSlider)
 | |
|             scrollSpeedSlider.value = textureScrollSpeed;
 | |
|     }
 | |
| 
 | |
|     // Update is called once per frame
 | |
|     void Update()
 | |
|     {
 | |
|         if (Input.GetKeyDown(KeyCode.Escape))
 | |
|             Application.Quit();
 | |
| 
 | |
|         if (Input.GetMouseButtonDown(0))
 | |
|         {
 | |
|             beamStart = Instantiate(beamStartPrefab[currentBeam], new Vector3(0, 0, 0), Quaternion.identity) as GameObject;
 | |
|             beamEnd = Instantiate(beamEndPrefab[currentBeam], new Vector3(0, 0, 0), Quaternion.identity) as GameObject;
 | |
|             beam = Instantiate(beamLineRendererPrefab[currentBeam], new Vector3(0, 0, 0), Quaternion.identity) as GameObject;
 | |
|             line = beam.GetComponent<LineRenderer>();
 | |
|         }
 | |
|         if (Input.GetMouseButtonUp(0))
 | |
|         {
 | |
|             Destroy(beamStart);
 | |
|             Destroy(beamEnd);
 | |
|             Destroy(beam);
 | |
|         }
 | |
| 
 | |
|         if (Input.GetMouseButton(0))
 | |
|         {
 | |
|             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
 | |
|             RaycastHit hit;
 | |
|             if (Physics.Raycast(ray.origin, ray.direction, out hit))
 | |
|             {
 | |
|                 Vector3 tdir = hit.point - transform.position;
 | |
|                 ShootBeamInDir(transform.position, tdir);
 | |
|             }
 | |
|         }
 | |
| 		
 | |
| 		if (Input.GetKeyDown(KeyCode.RightArrow)) //4 next if commands are just hotkeys for cycling beams
 | |
|         {
 | |
|             nextBeam();
 | |
|         }
 | |
| 
 | |
| 		if (Input.GetKeyDown(KeyCode.D))
 | |
| 		{
 | |
| 			nextBeam();
 | |
| 		}
 | |
| 
 | |
| 		if (Input.GetKeyDown(KeyCode.A))
 | |
| 		{
 | |
| 			previousBeam();
 | |
| 		}
 | |
|         else if (Input.GetKeyDown(KeyCode.LeftArrow))
 | |
|         {
 | |
|             previousBeam();
 | |
|         }
 | |
| 		
 | |
|     }
 | |
| 
 | |
|     public void nextBeam() // Next beam
 | |
|     {
 | |
|         if (currentBeam < beamLineRendererPrefab.Length - 1)
 | |
|             currentBeam++;
 | |
|         else
 | |
|             currentBeam = 0;
 | |
| 
 | |
|         if (textBeamName)
 | |
|             textBeamName.text = beamLineRendererPrefab[currentBeam].name;
 | |
|     }
 | |
| 	
 | |
| 	    public void previousBeam() // Previous beam
 | |
|     {
 | |
|         if (currentBeam > - 0)
 | |
|             currentBeam--;
 | |
|         else
 | |
|             currentBeam = beamLineRendererPrefab.Length - 1;
 | |
| 
 | |
|         if (textBeamName)
 | |
|             textBeamName.text = beamLineRendererPrefab[currentBeam].name;
 | |
|     }
 | |
| 	
 | |
| 
 | |
|     public void UpdateEndOffset()
 | |
|     {
 | |
|         beamEndOffset = endOffSetSlider.value;
 | |
|     }
 | |
| 
 | |
|     public void UpdateScrollSpeed()
 | |
|     {
 | |
|         textureScrollSpeed = scrollSpeedSlider.value;
 | |
|     }
 | |
| 
 | |
|     void ShootBeamInDir(Vector3 start, Vector3 dir)
 | |
|     {
 | |
|         line.positionCount = 2;
 | |
|         line.SetPosition(0, start);
 | |
|         beamStart.transform.position = start;
 | |
| 
 | |
|         Vector3 end = Vector3.zero;
 | |
|         RaycastHit hit;
 | |
|         if (Physics.Raycast(start, dir, out hit))
 | |
|             end = hit.point - (dir.normalized * beamEndOffset);
 | |
|         else
 | |
|             end = transform.position + (dir * 100);
 | |
| 
 | |
|         beamEnd.transform.position = end;
 | |
|         line.SetPosition(1, end);
 | |
| 
 | |
|         beamStart.transform.LookAt(beamEnd.transform.position);
 | |
|         beamEnd.transform.LookAt(beamStart.transform.position);
 | |
| 
 | |
|         float distance = Vector3.Distance(start, end);
 | |
|         line.sharedMaterial.mainTextureScale = new Vector2(distance / textureLengthScale, 1);
 | |
|         line.sharedMaterial.mainTextureOffset -= new Vector2(Time.deltaTime * textureScrollSpeed, 0);
 | |
|     }
 | |
| }
 | |
| }
 |