123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class TailingLine : MonoBehaviour
- {
- [System.Serializable]
- public class LinePointInfo
- {
- public Vector3 pos;
- public Vector3 rotion;
- public Vector3 dir;
- }
- public AnimationCurve offQuanZhong;
- public float quanZhong=5;
- public float disStrength=0.5f;
- // public float addTime;
- public Transform rootTran;
- public int count;
- public float maxDis;
- private LineRenderer _lineRenderer;
- public List<LinePointInfo> _linePointInfo = new List<LinePointInfo>();
- protected float minDis;
- private void Awake()
- {
- _linePointInfo.Clear();
- _lineRenderer = GetComponent<LineRenderer>();
- Init();
- }
- private void Init()
- {
- minDis = maxDis / count;
- // Vector3 startPos = rootTran.position;
- Vector3 startRot = rootTran.rotation.eulerAngles;
- _lineRenderer.positionCount = count;
- for (int i = 0; i < count; i++)
- {
- LinePointInfo linePointInfo = new LinePointInfo();
- Vector3 pos = rootTran.transform.TransformPoint(new Vector3(0, 0, minDis * i * -1));
- linePointInfo.pos = pos;
- linePointInfo.rotion = startRot;
- linePointInfo.dir = rootTran.transform.forward;
- _lineRenderer.SetPosition(i, linePointInfo.pos);
- _linePointInfo.Add(linePointInfo);
- }
- }
- void Start()
- {
- }
- // Update is called once per frame
- void Update()
- {
- LinePointInfo linePointInfo = _linePointInfo[0];
- linePointInfo.pos = rootTran.position;
- linePointInfo.rotion = rootTran.rotation.eulerAngles;
- linePointInfo.dir = rootTran.transform.forward;
- _lineRenderer.SetPosition(0, linePointInfo.pos);
- // float at = (1 - addTime) / _linePointInfo.Count;
- int m = 2;
- int c = _linePointInfo.Count - m;
- float quanZhongWidget = 1.0f / c;
- for (int i = 1; i < _linePointInfo.Count; i++)
- {
- float w = i * 1.0f / _linePointInfo.Count;
- float at = offQuanZhong.Evaluate(w);
- if (at <= 0)
- {
- at = 0.01f;
- }
- LinePointInfo point = _linePointInfo[i];
- LinePointInfo lasetPoint = _linePointInfo[i - 1];
- Vector3 dir = lasetPoint.pos - point.pos;
- float md = dir.magnitude;
- if (md < minDis)
- {
- md = minDis;
- }
- else
- {
- md = Mathf.Lerp(md, minDis, at*disStrength);
- }
- if (m == i)
- {
- var sin = Mathf.Sin(Time.time);
- var cos = Mathf.Cos(Time.time);
- Quaternion quaternion = Quaternion.Euler(sin * quanZhong, cos * quanZhong, 0);
- dir = quaternion * dir;
- }
- Vector3 newDir = Vector3.Lerp(dir.normalized, lasetPoint.dir, at).normalized;
- point.pos = lasetPoint.pos + (newDir * (md * -1));
- point.dir = newDir;
- _lineRenderer.SetPosition(i, point.pos);
- }
- }
- }
|