using UnityEngine;
///
/// 控制缓动的UI组件
///
public class UITweenSpring : MonoBehaviour {
public float MomentumAmount = 35f * 0.01f;
public float Strength = 9;
public bool IsUseCallBack;
public Vector3 Momentum;
public CallBack OnUpdate;
public CallBack OnMoveEnd;
private Vector3 _startMomentum;
private float _duration;
private float _startTime;
public void LerpMomentum(Vector3 offset)
{
Momentum = offset * MomentumAmount;
_startMomentum = offset * MomentumAmount;
_duration = MomentumAmount / Strength;
_startTime = 0;
}
public void Rebound(int type, float strength) // x 0x1 y 0x10 z 0x100
{
switch (type)
{
case 1:
_startMomentum.x = -strength * _startMomentum.x;
break;
case 2:
_startMomentum.y = -strength * _startMomentum.y;
break;
case 3:
_startMomentum.x = -strength * _startMomentum.x;
_startMomentum.y = -strength * _startMomentum.y;
break;
case 4:
_startMomentum.z = -strength * _startMomentum.z;
break;
case 5:
_startMomentum.x = -strength * _startMomentum.x;
_startMomentum.z = -strength * _startMomentum.z;
break;
case 6:
_startMomentum.y = -strength * _startMomentum.y;
_startMomentum.z = -strength * _startMomentum.z;
break;
case 7:
_startMomentum.x = -strength * _startMomentum.x;
_startMomentum.y = -strength * _startMomentum.y;
_startMomentum.z = -strength * _startMomentum.z;
break;
}
}
// Update is called once per frame
void Update () {
if (!Application.isPlaying) return;
float delta = Time.unscaledDeltaTime;
if (IsUseCallBack)
{
_startTime += delta;
if (_startTime < _duration)
{
Momentum = Vector3.Lerp(Vector3.zero, _startMomentum, ease(_startTime / _duration));
OnUpdate(Momentum);
}
else
{
enabled = false;
Momentum = Vector3.zero;
if (OnMoveEnd != null)
OnMoveEnd();
}
}
else
{
_startTime += delta;
Momentum = Vector3.Lerp(Vector3.zero, _startMomentum, ease(_startTime / _duration));
}
}
static float ease(float progress)
{
return progress * progress - 2 * progress + 1;
}
}