using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
[ExecuteInEditMode]
|
|
public class vine : MonoBehaviour
|
|
{
|
|
private LineRenderer lineRenderer;
|
|
|
|
[SerializeField]
|
|
private GameObject position1;
|
|
[SerializeField]
|
|
private GameObject position2;
|
|
|
|
private Vector3 lastPosition1;
|
|
private Vector3 lastPosition2;
|
|
private float lastDipMagnitude;
|
|
private int lastNumberPoints;
|
|
|
|
[SerializeField]
|
|
private AnimationCurve vineCurve;
|
|
[SerializeField]
|
|
private float dipMagnitude = 1f;
|
|
[SerializeField]
|
|
private int numberOfPoints = 20;
|
|
|
|
// Start is called before the first frame update
|
|
void Awake()
|
|
{
|
|
lineRenderer = GetComponent<LineRenderer>();
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
//if both positions are defined
|
|
if (position1 != null && position2 != null)
|
|
{
|
|
//if either of the points have moved
|
|
if ((position1.transform.position != lastPosition1) || (position2.transform.position != lastPosition2) || (dipMagnitude != lastDipMagnitude) || (numberOfPoints != lastNumberPoints))
|
|
{
|
|
Recalculate();
|
|
}
|
|
}
|
|
}
|
|
|
|
[ContextMenu("Recalculate")]
|
|
void Recalculate()
|
|
{
|
|
lineRenderer.positionCount = numberOfPoints;
|
|
|
|
//set start and end
|
|
lineRenderer.SetPosition(0, position1.transform.position);
|
|
lineRenderer.SetPosition(lineRenderer.positionCount-1, position2.transform.position);
|
|
|
|
for (int i = 0; i<lineRenderer.positionCount; i++)
|
|
{
|
|
Vector3 newLerpPos = Vector3.Lerp(position1.transform.position, position2.transform.position, i / (float)(lineRenderer.positionCount - 1));
|
|
Vector3 newDip = Vector3.up * dipMagnitude * (1f - vineCurve.Evaluate(i / (float)(lineRenderer.positionCount - 1)));
|
|
|
|
|
|
lineRenderer.SetPosition(i, newLerpPos - newDip);
|
|
}
|
|
|
|
lastPosition1 = position1.transform.position;
|
|
lastPosition2 = position2.transform.position;
|
|
lastDipMagnitude = dipMagnitude;
|
|
lastNumberPoints = numberOfPoints;
|
|
}
|
|
}
|