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#

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