Files
Main/Assets/Launcher/ExternalLibs/MoveVfx/Classes/VfxPosionMove.cs

144 lines
5.2 KiB
C#
Raw Permalink Normal View History

2025-01-25 04:38:09 +08:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace VfxMovePositin.Lipsync
{
[System.Serializable]
public class VfxPosionMove : MonoBehaviour
{
/// <summary>
/// Reference to the scroll view that will be dragged by the script.
/// </summary>
[SerializeField]
public Transform vfxTrans;
[SerializeField]
public float EulerAnglesFrom;
[SerializeField]
public float EulerAnglesTo;
[SerializeField]
public List<GameObject> way;
[SerializeField]
public AnimationCurve ScaleCurve = new AnimationCurve();
// Legacy functionality, kept for backwards compatibility. Use 'scrollView' instead.
//[HideInInspector] [SerializeField] Transform draggablePanel;
Transform mTrans;
//保存设置的路径点,界面上设置的有可能为空
private List<GameObject> wayPoint;
private AnimationCurve Curve = new AnimationCurve();
private int PointCount = 0;
private float scaleModel = 1;
private float _totalDis = 0f;
private List<float> _speedList = new List<float>();
/// <summary>
/// Automatically find the scroll view if possible.
/// </summary>
void OnEnable()
{
_speedList.Clear();
wayPoint = new List<GameObject>();
mTrans = transform;
// Auto-upgrade
if (vfxTrans == null )
{
scaleModel = vfxTrans.localScale.x;
}
Curve.AddKey(0, 1f);
Curve.AddKey(1, 1f);
int _wayCount = 0;
for(int i = 0; i < way.Count; i++)
{
if (way[i] != null)
{
_wayCount += 1;
wayPoint.Add(way[i]);
}
}
if(_wayCount > 1)
{
_totalDis = 0f;
Vector3 _lastPoint = Vector3.zero;
for(int i = 0; i < _wayCount; i++)
{
if(_lastPoint != Vector3.zero)
{
_totalDis += (_lastPoint - wayPoint[i].transform.position).magnitude;
}
_lastPoint = wayPoint[i].transform.position;
}
_lastPoint = Vector3.zero;
var _dis = 0f;
for (int i = 0; i < _wayCount; i++)
{
if (_lastPoint != Vector3.zero)
{
_dis += (_lastPoint - wayPoint[i].transform.position).magnitude;
if(_totalDis > 0)
{
float _speed = _dis / _totalDis;
_speedList.Add(_speed);
}
}
_lastPoint = wayPoint[i].transform.position;
}
}
}
// Update is called once per frame
void Update()
{
if (vfxTrans == null)
return;
if ((EulerAnglesTo > EulerAnglesFrom && vfxTrans.eulerAngles.y >= EulerAnglesFrom && vfxTrans.eulerAngles.y <= EulerAnglesTo)||(EulerAnglesTo < EulerAnglesFrom &&
((vfxTrans.eulerAngles.y > EulerAnglesFrom && vfxTrans.eulerAngles.y <= 360)||(vfxTrans.eulerAngles.y >= 0 && vfxTrans.eulerAngles.y < EulerAnglesTo))))
{
float _speed = 0;
if(EulerAnglesTo < EulerAnglesFrom)
{
if(vfxTrans.eulerAngles.y > EulerAnglesFrom)
_speed = 1 - (vfxTrans.eulerAngles.y - EulerAnglesFrom) / (EulerAnglesTo + 360 - EulerAnglesFrom);
else
_speed = 1 - (vfxTrans.eulerAngles.y + 360 - EulerAnglesFrom) / (EulerAnglesTo + 360 - EulerAnglesFrom);
}
else
_speed = 1 - (vfxTrans.eulerAngles.y - EulerAnglesFrom) / (EulerAnglesTo - EulerAnglesFrom);
int index = GetWayIndex(_speed);
if(index >= 0 && _speedList.Count > 0)
{
float _sp = _speed;
float _lst = 0f;
if (index > 0)
{
_lst = _speedList[index - 1];
}
_sp = (_speed - _lst) / (_speedList[index] - _lst);
vfxTrans.position = Vector3.Lerp(wayPoint[index].transform.position, wayPoint[index + 1].transform.position, _sp);
}
var _curveValue = ScaleCurve.Evaluate(_speed) * scaleModel;
vfxTrans.localScale = new Vector3(_curveValue, _curveValue, _curveValue);
}
else
{
if (vfxTrans.localScale != Vector3.zero)
vfxTrans.localScale = Vector3.zero;
}
}
int GetWayIndex(float speed)
{
for(int i = 0; i < _speedList.Count; i++)
{
if(speed < _speedList[i]) {
return i;
}
}
return 0;
}
}
}