Unity抛物线动画

21 篇文章 6 订阅
17 篇文章 0 订阅

文本备忘记录抛物线运动动画,老忘老忘!!

动画效果:
image

以下是源代码

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值