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