using UnityEngine; using System.Collections; using System; using UnityEngine.UI; using System.Collections.Generic; using UnityEngine.Events; namespace MoreMountains.NiceVibrations { public class HapticCurve : MonoBehaviour { [Range(0f, 1f)] public float Intensity = 1f; [Range(0f, 1f)] public float Sharpness = 0f; public int PointsCount = 50; public float AmplitudeFactor = 3; public int Period = 4; public RectTransform StartPoint; public RectTransform EndPoint; [Header("Movement")] public bool Move = false; public float MovementSpeed = 1f; protected LineRenderer _targetLineRenderer; protected List Points; protected Canvas _canvas; protected Camera _camera; protected Vector3 _startPosition; protected Vector3 _endPosition; protected Vector3 _workPoint; protected virtual void Awake() { Initialization(); } protected virtual void Initialization() { Points = new List(); _canvas = this.gameObject.GetComponentInParent(); _targetLineRenderer = this.gameObject.GetComponent(); _camera = _canvas.worldCamera; DrawCurve(); } protected virtual void DrawCurve() { _startPosition = StartPoint.transform.position; _startPosition.z -= 0.1f; _endPosition = EndPoint.transform.position; _endPosition.z -= 0.1f; Points.Clear(); for (int i = 0; i < PointsCount; i++) { float t = NiceVibrationsDemoHelpers.Remap(i, 0, PointsCount, 0f, 1f); float sinValue = MMSignal.GetValue(t, MMSignal.SignalType.Sine, 1f, AmplitudeFactor, Period, 0f, false); float triangleValue = MMSignal.GetValue(t, MMSignal.SignalType.Triangle, 1f, AmplitudeFactor, Period, 0f, false); if (Move) { sinValue = MMSignal.GetValue(t + Time.time * MovementSpeed, MMSignal.SignalType.Sine, 1f, AmplitudeFactor, Period, 0f, false); triangleValue = MMSignal.GetValue(t + Time.time * MovementSpeed, MMSignal.SignalType.Triangle, 1f, AmplitudeFactor, Period, 0f, false); } float finalValue = Mathf.Lerp(sinValue, triangleValue, Sharpness); _workPoint.x = Mathf.Lerp(_startPosition.x, _endPosition.x, t); _workPoint.y = finalValue * Intensity + _startPosition.y; _workPoint.z = _startPosition.z; Points.Add(_workPoint); } _targetLineRenderer.positionCount = PointsCount ; _targetLineRenderer.SetPositions(Points.ToArray()); } protected virtual void Update() { UpdateCurve(Intensity, Sharpness); } public virtual void UpdateCurve(float intensity, float sharpness) { Intensity = intensity; Sharpness = sharpness; DrawCurve(); } } }