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