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#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								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;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |