144 lines
5.2 KiB
C#
144 lines
5.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|