文本备忘记录抛物线运动动画,老忘老忘!!
动画效果:
以下是源代码
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
public class TestMain : MonoBehaviour
{
public RectTransform rect_move_0;
//http://blog.csdn.net/sinat_24229853/article/details/43033051 连接地址
// Use this for initialization
void Start()
{
rect_move_0.gameObject.SetActive(false);
DOTween.Init();
}
void OnGUI()
{
if (GUILayout.Button("播放飘字"))
{
RectTransform rect = GameObject.Instantiate(rect_move_0.gameObject).GetComponent<RectTransform>();
rect.gameObject.SetActive(true);
rect.SetParent(rect_move_0.parent, false);
rect.DOKill();
int testNum = UnityEngine.Random.Range(0, 3);
switch (testNum)
{
case 0:
rect.GetComponent<Text>().text = "+" + UnityEngine.Random.Range(1, 200);
rect.GetComponent<Text>().color = new Color(0f,180f/255f, 1f, 1f);
break;
default:
rect.GetComponent<Text>().text = "-" + UnityEngine.Random.Range(1, 200);
rect.GetComponent<Text>().color = new Color(200f/255f, 40/255f, 170/255f, 1);
break;
}
//坐标参数
int moveRelativeDstMaxX = 200;//抛物线终点的水平max
int moveRelativeDstMinX = 100;//抛物线终点的水平min
int moveRelativeDstY = 10;// 抛物终点 顶点高度
int relativeStartMaxX = 100;//起点 向右水平随机
Vector2 StartPos = new Vector2(UnityEngine.Random.Range(+relativeStartMaxX, 0), 50);
Vector2 endPos = StartPos + new Vector2(UnityEngine.Random.Range(moveRelativeDstMinX,moveRelativeDstMaxX), moveRelativeDstY);
float moveDuration = 2f;
// Debug.LogError("起点=" + StartPos + ",落点=" + endPos);
float playTime = 0f;
Vector2 center = Vector2.zero;
Sequence s = DOTween.Sequence();
s.Append(
rect.DOScale(Vector3.one *0.1f, moveDuration).SetEase(Ease.Linear).OnUpdate(delegate
{
center = (StartPos + endPos) * 0.5F;
center -= new Vector2(0, 1);//, 0);
Vector2 riseRelCenter = StartPos - center;
Vector2 setRelCenter = endPos - center;
rect.anchoredPosition = Vector3.Slerp(riseRelCenter, setRelCenter, playTime);// Time.time);
rect.anchoredPosition += center;
playTime += Time.deltaTime;
})
);
s.OnComplete(delegate
{
// Debug.Log("time=" + Time.unscaledTime + "播放完毕!");
rect.gameObject.SetActive(false);
});
}
}
//void Update()
//{
// Vector2 center = StartPos + endPos * 0.5F;
// center -= new Vector2 (0, 1);//, 0);
// Vector2 riseRelCenter = StartPos - center;
// Vector2 setRelCenter = endPos - center;
// rect_move_0.anchoredPosition = Vector3.Slerp(riseRelCenter, setRelCenter, Time.time);
// rect_move_0.anchoredPosition += center;
//}
}
最后,单独附上抛物线的刷新函数:
using UnityEngine;
using System.Collections;
public class ParabolaUpdate : MonoBehaviour {
Vector2 StartPos;
Vector2 endPos;
float currentTime=0;
// Use this for initialization
void Start () {
currentTime = 0;
StartPos = new Vector2 (UnityEngine.Random.Range (-300, 0), 0);
endPos = StartPos + new Vector2 (UnityEngine.Random.Range (-300, -100), 10);
}
// Update is called once per frame
void Update () {
Vector2 center = StartPos + endPos * 0.5F;
center -= new Vector2(0, 1);//, 0);
Vector2 riseRelCenter = StartPos - center;
Vector2 setRelCenter = endPos - center;
Vector2 currentPos = Vector3.Slerp(riseRelCenter, setRelCenter, currentTime);
currentPos += center;
currentTime += Time.deltaTime;
Debug.Log ("time=" + Time.time + ",currentPos=" + currentPos);
}
}