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