#region Copyright RenGuiYou. All rights reserved.
//=====================================================
// NeatlyFrameWork
// Author: RenGuiyou
// Feedback: mailto:750539605@qq.com
//=====================================================
#endregion
using UnityEngine;
using System.Globalization;
using System.Text;
using Neatly.UI;
using UnityEngine.UI;
namespace Neatly.Tween
{
///
/// 自定义移动
///
internal sealed class TweenFuncPosObj : TweenObjectBase
{
private RectTransform _rectTransform;
private CanvasGroup _canvasGroup;
private float _startY;
private float _targetY;
private float _time;
private NeatlyTween.PositionDelegate _posResult;
private NeatlyTween.AlphaDelegate _alphaResult;
public static TweenFuncPosObj Create(RectTransform rectTransform, float targetY, float time,
NeatlyTween.PositionDelegate posResult, NeatlyTween.AlphaDelegate alphaResult)
{
var tweenObj = new TweenFuncPosObj
{
gameObject = rectTransform.gameObject,
_rectTransform = rectTransform,
_canvasGroup = rectTransform.GetComponent(),
_startY = rectTransform.anchoredPosition.y,
_targetY = targetY,
_dt = 0,
_time = time,
_posResult = posResult,
_alphaResult = alphaResult,
};
return tweenObj;
}
public override bool Excute(float dt)
{
_dt += dt;
float y = Mathf.Lerp(_startY, _targetY, _dt / _time);
_canvasGroup.alpha = _alphaResult(y);
_rectTransform.anchoredPosition = _posResult(y);
return _dt >= _time;
}
}
public sealed class TweenRtPosObj : TweenObjectBase
{
private enum MoveType
{
Anchored, //UI
Position, //世界坐标
LocalPosition, //区域坐标
Scale,
Rotate,
AutoRotate,
ImageColor,
SizeDelta,
}
private enum TweenType
{
Lerp,
Bezier,
}
private RectTransform _rectTransform;
private Transform _transform;
private Vector3 _startV3;
private Vector3 _targetV3;
private Vector3 _bezierV3;
#region Color
private Graphic _graphic;
private Color _startColor;
private Color _targetColor;
#endregion
private float _time;
private MoveType _moveType;
private TweenType _tweenType;
public static TweenRtPosObj CreateMove(RectTransform rectTransform, Vector2 targetVal, float time)
{
var tweenObj = NeatlyTween.Instance.TweenRtPosPool.Create();
tweenObj.gameObject = rectTransform.gameObject;
tweenObj._rectTransform = rectTransform;
tweenObj._startV3 = rectTransform.anchoredPosition;
tweenObj._targetV3 = targetVal;
tweenObj._dt = 0;
tweenObj._time = time;
tweenObj._moveType = MoveType.Anchored;
tweenObj._tweenType = TweenType.Lerp;
return tweenObj;
}
public static TweenRtPosObj CreateBezierMove(RectTransform rectTransform, Vector2 targetVal, Vector2 bezierVal, float time)
{
var tweenObj = NeatlyTween.Instance.TweenRtPosPool.Create();
tweenObj.gameObject = rectTransform.gameObject;
tweenObj._rectTransform = rectTransform;
tweenObj._startV3 = rectTransform.anchoredPosition;
tweenObj._targetV3 = targetVal;
tweenObj._dt = 0;
tweenObj._bezierV3 = bezierVal;
tweenObj._time = time;
tweenObj._moveType = MoveType.Anchored;
tweenObj._tweenType = TweenType.Bezier;
return tweenObj;
}
public static TweenRtPosObj CreateMove(GameObject gameObject, Vector3 targetVal, float time)
{
var tweenObj = NeatlyTween.Instance.TweenRtPosPool.Create();
tweenObj.gameObject = gameObject;
tweenObj._transform = gameObject.transform;
tweenObj._startV3 = gameObject.transform.localPosition;
tweenObj._targetV3 = targetVal;
tweenObj._dt = 0;
tweenObj._time = time;
tweenObj._moveType = MoveType.Position;
tweenObj._tweenType = TweenType.Lerp;
return tweenObj;
}
public static TweenRtPosObj CreateMoveLocal(GameObject gameObject, Vector3 targetVal, float time)
{
var tweenObj = NeatlyTween.Instance.TweenRtPosPool.Create();
tweenObj.gameObject = gameObject;
tweenObj._transform = gameObject.transform;
tweenObj._startV3 = gameObject.transform.localPosition;
tweenObj._targetV3 = targetVal;
tweenObj._dt = 0;
tweenObj._time = time;
tweenObj._moveType = MoveType.LocalPosition;
tweenObj._tweenType = TweenType.Lerp;
return tweenObj;
}
public static TweenRtPosObj CreateScale(Transform transform, Vector3 targetVal, float time)
{
var tweenObj = NeatlyTween.Instance.TweenRtPosPool.Create();
tweenObj.gameObject = transform.gameObject;
tweenObj._transform = transform;
tweenObj._startV3 = transform.localScale;
tweenObj._targetV3 = targetVal;
tweenObj._dt = 0;
tweenObj._time = time;
tweenObj._moveType = MoveType.Scale;
tweenObj._tweenType = TweenType.Lerp;
return tweenObj;
}
public static TweenRtPosObj CreateRotate(Transform transform, Vector3 targetVal, float time)
{
var tweenObj = NeatlyTween.Instance.TweenRtPosPool.Create();
tweenObj.gameObject = transform.gameObject;
tweenObj._transform = transform;
tweenObj._startV3 = transform.localEulerAngles;
tweenObj._targetV3 = targetVal;
tweenObj._dt = 0;
tweenObj._time = time;
tweenObj._moveType = MoveType.Rotate;
tweenObj._tweenType = TweenType.Lerp;
return tweenObj;
}
public static TweenRtPosObj CreateAutoRotate(Transform transform, Vector3 targetVal, float time)
{
var tweenObj = NeatlyTween.Instance.TweenRtPosPool.Create();
tweenObj.gameObject = transform.gameObject;
tweenObj._transform = transform;
tweenObj._startV3 = transform.localEulerAngles;
tweenObj._targetV3 = targetVal;
tweenObj._dt = 0;
tweenObj._time = time;
tweenObj._moveType = MoveType.AutoRotate;
tweenObj._tweenType = TweenType.Lerp;
return tweenObj;
}
public static TweenRtPosObj CreateColor(Graphic graphic, Color targetVal, float time)
{
var tweenObj = NeatlyTween.Instance.TweenRtPosPool.Create();
tweenObj.gameObject = graphic.gameObject;
tweenObj._graphic = graphic;
tweenObj._startColor = graphic.color;
tweenObj._targetColor = targetVal;
tweenObj._dt = 0;
tweenObj._time = time;
tweenObj._moveType = MoveType.ImageColor;
tweenObj._tweenType = TweenType.Lerp;
return tweenObj;
}
public static TweenRtPosObj CreateSizeDelta(RectTransform rectTransform, Vector2 targetVal, float time)
{
var tweenObj = NeatlyTween.Instance.TweenRtPosPool.Create();
tweenObj.gameObject = rectTransform.gameObject;
tweenObj._rectTransform = rectTransform;
tweenObj._startV3 = rectTransform.sizeDelta;
tweenObj._targetV3 = targetVal;
tweenObj._dt = 0;
tweenObj._time = time;
tweenObj._moveType = MoveType.SizeDelta;
tweenObj._tweenType = TweenType.Lerp;
return tweenObj;
}
public override bool Excute(float dt)
{
_dt += dt;
Vector3 val = Vector3.zero;
if (_moveType != MoveType.Rotate && _moveType != MoveType.ImageColor)
{
if (_tweenType == TweenType.Lerp)
{
val = NMathf.Lerp(_startV3, _targetV3, _dt, _time);
}
else if (_tweenType == TweenType.Bezier)
{
var p1 = NMathf.Lerp(_startV3, _bezierV3, _dt, _time);
var p2 = NMathf.Lerp(_bezierV3, _targetV3, _dt, _time);
val = NMathf.Lerp(p1, p2, _dt, _time);
}
}
switch (_moveType)
{
case MoveType.Anchored:
_rectTransform.anchoredPosition = val;
break;
case MoveType.Position:
_transform.position = val;
break;
case MoveType.LocalPosition:
_transform.localPosition = val;
break;
case MoveType.Scale:
_transform.localScale = val;
break;
case MoveType.Rotate:
_transform.localEulerAngles = NMathf.LerpAngle(_startV3, _targetV3, _dt, _time);
break;
case MoveType.AutoRotate:
_transform.localEulerAngles = val;
break;
case MoveType.ImageColor:
_graphic.color = NMathf.Lerp(_startColor, _targetColor, _dt, _time);
break;
case MoveType.SizeDelta:
_rectTransform.sizeDelta = val;
break;
}
return _dt >= _time;
}
public override void Destroy()
{
NeatlyTween.Instance.TweenRtPosPool.Recycle(this);
}
public override void DoPingPong()
{
if (_moveType == MoveType.ImageColor)
{
var tempColor = _startColor;
_startColor = _targetColor;
_targetColor = tempColor;
}
else
{
var tempV3 = _startV3;
_startV3 = _targetV3;
_targetV3 = tempV3;
}
}
}
///
/// 文本跳动
///
internal sealed class TweenJumpObj : TweenObjectBase
{
private Text _text;
private double _startVal;
private double _targetVal;
private float _time;
public static TweenJumpObj Create(Text text, double startVal, double targetVal, float time)
{
TweenJumpObj obj = new TweenJumpObj
{
gameObject = text.gameObject,
_text = text,
_startVal = startVal,
_targetVal = targetVal,
_time = time,
_dt = 0,
};
return obj;
}
public override bool Excute(float dt)
{
_dt += dt;
long value = (long) NMathf.Lerp(_startVal, _targetVal, _dt / _time);
_text.text = GetJumpVal(value.ToString(CultureInfo.InvariantCulture));
return _dt >= _time;
}
public string GetJumpVal(string str)
{
StringBuilder sb = new StringBuilder();
for (int t = 1, i = str.Length - 1; i >= 0; i--, t++)
{
sb.Insert(0, str[i]);
if (t % 3 == 0 && i > 0)
{
sb.Insert(0, ",");
}
}
return sb.ToString();
}
}
///
/// Slider滑动(向目标)
///
internal sealed class TweenSliderObj : TweenObjectBase
{
private NSlider _slider;
private float _startVal;
private float _targetVal;
private float _time;
public static TweenSliderObj Create(NSlider slider, float targetVal, float time)
{
TweenSliderObj obj = new TweenSliderObj
{
gameObject = slider.gameObject,
_slider = slider,
_startVal = slider.value,
_targetVal = targetVal,
_time = time,
_dt = 0,
};
return obj;
}
public override bool Excute(float dt)
{
_dt += dt;
float val = Mathf.Lerp(_startVal, _targetVal, _dt / _time);
_slider.SetValue(val);
return _dt >= _time;
}
}
///
/// Slider滑动(向终点值)
///
internal sealed class TweenSliderDirectObj : TweenObjectBase
{
private Slider _slider;
private float _startVal;
private float _targetVal;
private float _time;
private float _remainTime;
private float _curTargetVal;
private bool _direct;
private bool _twice;
public static TweenSliderDirectObj Create(Slider slider, float targetVal, float time, bool direct)
{
TweenSliderDirectObj obj = new TweenSliderDirectObj
{
gameObject = slider.gameObject,
_slider = slider,
_startVal = slider.value,
_targetVal = targetVal,
_dt = 0,
_direct = direct,
_twice = direct ? targetVal < slider.value : targetVal > slider.value,
};
if (obj._twice)
{
if (direct)
{
float dis = targetVal + 1 - obj._startVal;
obj._time = (1 - obj._startVal) / dis * time;
}
else
{
float dis = obj._startVal + 1 - targetVal;
obj._time = obj._startVal / dis * time;
}
obj._curTargetVal = direct ? 1 : 0;
}
else
{
obj._time = time;
obj._curTargetVal = targetVal;
}
obj._remainTime = time - obj._time;
return obj;
}
public override bool Excute(float dt)
{
_dt += dt;
float val = Mathf.Lerp(_startVal, _curTargetVal, _dt / _time);
_slider.value = val;
if (_twice && _dt >= _time)
{
_startVal = _direct ? 0 : 1;
_time = _remainTime;
_remainTime = 0;
_curTargetVal = _targetVal;
_dt = 0;
_twice = false;
}
return _dt >= _time;
}
}
///
/// NImage Fill
///
internal sealed class TweenImgFillObj : TweenObjectBase
{
private NImage m_Image;
private float _targetVal;
private float _time;
public static TweenImgFillObj Create(NImage image, float targetVal, float time)
{
TweenImgFillObj obj = new TweenImgFillObj
{
gameObject = image.gameObject,
m_Image = image,
_targetVal = targetVal,
_time = time,
_dt = 0,
};
return obj;
}
public override bool Excute(float dt)
{
_dt += dt;
float val = Mathf.Lerp(0, _targetVal, _dt / _time);
m_Image.fillAmount = val;
return _dt >= _time;
}
}
}