83 lines
2.0 KiB
C#
83 lines
2.0 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
[RequireComponent(typeof(LineRenderer))]
|
|
[ExecuteInEditMode]
|
|
public class Cable_Procedural_Simple : MonoBehaviour
|
|
{
|
|
private LineRenderer line;
|
|
|
|
[SerializeField]
|
|
private Transform endPointTransform;
|
|
|
|
[SerializeField]
|
|
private int pointsInLineRenderer = 5;
|
|
|
|
[SerializeField]
|
|
private float sagAmplitude = 1f;
|
|
|
|
[SerializeField]
|
|
private float swayMultiplier = 1f;
|
|
|
|
[SerializeField]
|
|
private float swayXMultiplier = 1f;
|
|
|
|
[SerializeField]
|
|
private float swayYMultiplier = 0.5f;
|
|
|
|
[SerializeField]
|
|
private float swayFrequency = 1f;
|
|
|
|
private Vector3 vectorFromStartToEnd;
|
|
|
|
private Vector3 sagDirection;
|
|
|
|
private float swayValue;
|
|
|
|
private void Start()
|
|
{
|
|
line = GetComponent<LineRenderer>();
|
|
line.positionCount = pointsInLineRenderer;
|
|
sagDirection = Physics.gravity.normalized;
|
|
swayValue = UnityEngine.Random.Range(0f, 3.14f);
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
Animate();
|
|
}
|
|
|
|
private void Animate()
|
|
{
|
|
if (!endPointTransform)
|
|
{
|
|
Debug.LogError("No Endpoint Transform assigned to Cable_Procedural component attached to " + base.gameObject.name);
|
|
}
|
|
else
|
|
{
|
|
vectorFromStartToEnd = endPointTransform.position - base.transform.position;
|
|
base.transform.forward = vectorFromStartToEnd.normalized;
|
|
}
|
|
int i = 0;
|
|
swayValue += swayFrequency * Time.deltaTime;
|
|
if (swayValue > MathF.PI * 2f)
|
|
{
|
|
swayValue = 0f;
|
|
}
|
|
if (swayValue < 0f)
|
|
{
|
|
swayValue = MathF.PI * 2f;
|
|
}
|
|
for (; i < pointsInLineRenderer; i++)
|
|
{
|
|
float num = (float)i / (float)(pointsInLineRenderer - 1);
|
|
float num2 = Mathf.Sin(num * MathF.PI);
|
|
Vector3 vector = vectorFromStartToEnd * num;
|
|
Vector3 vector2 = sagDirection * sagAmplitude;
|
|
Vector3 vector3 = swayMultiplier * base.transform.TransformDirection(new Vector3(Mathf.Sin(swayValue) * swayXMultiplier, Mathf.Cos(2f * swayValue + MathF.PI) * 0.5f * swayYMultiplier, 0f));
|
|
Vector3 position = base.transform.position + vector + (vector3 + Vector3.ClampMagnitude(vector2, sagAmplitude)) * num2;
|
|
line.SetPosition(i, position);
|
|
}
|
|
}
|
|
}
|