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; } }