You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			109 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C#
		
	
using System.Collections;
 | 
						|
using System.Collections.Generic;
 | 
						|
using UnityEngine;
 | 
						|
 | 
						|
namespace Autohand
 | 
						|
{
 | 
						|
    public class LineAnimation : MonoBehaviour
 | 
						|
    {
 | 
						|
        public LineRenderer lineRenderer;
 | 
						|
        public GameObject lineReticle;
 | 
						|
        public float activateTime = 0.5f;
 | 
						|
        public bool useColorCurve = true;
 | 
						|
        public AnimationCurve colorCurve = AnimationCurve.Linear(0, 0, 1, 1);
 | 
						|
        public AnimationCurve widthCurve = AnimationCurve.Linear(0, 0, 1, 1); 
 | 
						|
 | 
						|
        float startWidth;
 | 
						|
        float currentWidth;
 | 
						|
        bool activated;
 | 
						|
        float state;
 | 
						|
        bool wasLineEnabled;
 | 
						|
 | 
						|
        Vector3 startReticleScale;
 | 
						|
        Vector3 lastPosition;
 | 
						|
 | 
						|
 | 
						|
        GradientAlphaKey[] startAlphaKeys;
 | 
						|
        Coroutine animationCoroutine;
 | 
						|
 | 
						|
        private void Start() {
 | 
						|
            startWidth = lineRenderer.widthMultiplier;
 | 
						|
            lineRenderer.widthMultiplier = 0;
 | 
						|
 | 
						|
            wasLineEnabled = lineRenderer.enabled;
 | 
						|
            if(lineReticle != null)
 | 
						|
                startReticleScale = lineReticle.transform.localScale;
 | 
						|
        }
 | 
						|
 | 
						|
        private void OnDisable() {
 | 
						|
            if(animationCoroutine != null)
 | 
						|
                StopCoroutine(animationCoroutine);
 | 
						|
            animationCoroutine = null;
 | 
						|
            state = 0;
 | 
						|
        }
 | 
						|
 | 
						|
        private void LateUpdate() {
 | 
						|
            if(!lineRenderer.enabled && wasLineEnabled) {
 | 
						|
                lineRenderer.enabled = true;
 | 
						|
                wasLineEnabled = false;
 | 
						|
                Deactivate();
 | 
						|
            }
 | 
						|
 | 
						|
            else if(lineRenderer.enabled && !wasLineEnabled && lineRenderer.positionCount > 0) {
 | 
						|
                //Need to do additional check to see if the line has moved just in case someone enables the line while its being disabled
 | 
						|
                if(animationCoroutine != null && lastPosition != lineRenderer.GetPosition(lineRenderer.positionCount-1)) {
 | 
						|
                    StopCoroutine(animationCoroutine);
 | 
						|
                    animationCoroutine = null;
 | 
						|
                }
 | 
						|
 | 
						|
                if(animationCoroutine == null) {
 | 
						|
                    //Initializing this here instead of start because it needs to fill when the line is enabled
 | 
						|
                    if(state == 0 && startAlphaKeys == null) {
 | 
						|
                        startAlphaKeys = new GradientAlphaKey[lineRenderer.colorGradient.alphaKeys.Length];
 | 
						|
                        lineRenderer.colorGradient.alphaKeys.CopyTo(startAlphaKeys, 0);
 | 
						|
                    }
 | 
						|
                    wasLineEnabled = true;
 | 
						|
                    Activate();
 | 
						|
 | 
						|
                }
 | 
						|
            }
 | 
						|
            if(lineRenderer.positionCount > 0)
 | 
						|
                lastPosition = lineRenderer.GetPosition(lineRenderer.positionCount - 1);
 | 
						|
            else
 | 
						|
                lastPosition = Vector3.zero;
 | 
						|
        }
 | 
						|
 | 
						|
        public void Activate() {
 | 
						|
            activated = true;
 | 
						|
            if(animationCoroutine == null)
 | 
						|
                animationCoroutine = StartCoroutine(Animate());
 | 
						|
        }
 | 
						|
 | 
						|
        public void Deactivate() {
 | 
						|
            activated = false;
 | 
						|
            if(animationCoroutine == null)
 | 
						|
                animationCoroutine = StartCoroutine(Animate());
 | 
						|
        }
 | 
						|
 | 
						|
         
 | 
						|
        IEnumerator Animate() {
 | 
						|
            while ((activated && state < 1) || (!activated && state > 0)) {
 | 
						|
                state += Time.deltaTime / activateTime * (activated ? 1 : -1);
 | 
						|
                state = Mathf.Clamp01(state);
 | 
						|
                if(lineReticle != null)
 | 
						|
                    lineReticle.transform.localScale = Vector3.Lerp(Vector3.zero, startReticleScale, state);
 | 
						|
                lineRenderer.widthMultiplier = Mathf.Lerp(0, startWidth, state);
 | 
						|
 | 
						|
                if(useColorCurve)
 | 
						|
                    for(int i = 0; i < startAlphaKeys.Length; i++) {
 | 
						|
                        lineRenderer.colorGradient.alphaKeys[i] = new GradientAlphaKey(Mathf.Lerp(0, startAlphaKeys[i].alpha, colorCurve.Evaluate(state)), startAlphaKeys[i].time);
 | 
						|
                    }
 | 
						|
                yield return null;
 | 
						|
            }
 | 
						|
 | 
						|
            lineRenderer.enabled = wasLineEnabled;
 | 
						|
            animationCoroutine = null;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |