Unity2D轮转图(归正效果,自动播放效果) 手写DoTween中的To方法

代码如下:

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class Lz2D : MonoBehaviour,IDragHandler,IEndDragHandler
{
    public Image itme;//实例化的图片对象
    int n = 3;//实例化对象的个数
    float r;//半径
    float ang;//角度(弧度)
    float moveRad;//移动的弧度
    List<GameObject> games = new List<GameObject>();//实例化对象的集合
    List<Transform> trans = new List<Transform>();//实例化对象Transform集合
    //缩放的最大与最小值
    float max = 1f;
    float min = 0.2f;

    int num = 0;
    // Start is called before the first frame update
    void Start()
    {
        ang = (2 * Mathf.PI) / n;//计算弧度
        r = n * (itme.rectTransform.sizeDelta.x + 500) /(2 * Mathf.PI);//计算半径
        Init();
    }

    private void Init()
    {
        for (int i = 0; i < n; i++)//实例化对象
        {
            float x = Mathf.Cos(i * ang + Mathf.PI / 2 + moveRad) * r;
            float y = Mathf.Sin(i * ang + Mathf.PI / 2 + moveRad) * r;
            if (games.Count <= i)
            {
                GameObject go = Instantiate(itme.gameObject, Vector3.zero, Quaternion.identity, transform);
                go.name = i.ToString();
                
                games.Add(go);
                trans.Add(go.transform);
            }
            //给每个对象赋位置
            games[i].transform.localPosition = new Vector3(x, 0, 0);
            //计算每个对象的缩放值
            float size = (y + r) / (2 * r) + (max - min) + min;
            games[i].transform.localScale = new Vector3(size, size, size);  
        }
        //设置每个对象的层级
        trans = trans.OrderBy(x => x.transform.localScale.x).ToList();
        for (int i = 0; i < trans.Count; i++)
        {
            trans[i].SetSiblingIndex(i);
        }

    }

    // Update is called once per frame
    void Update()
    {
        //自动轮转
        moveRad += Time.deltaTime;
        Init();
    }

    public void OnDrag(PointerEventData eventData)
    {
        moveRad -= eventData.delta.x / r;
        Init();
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        //拖拽结束后归正效果
        float tempRad = Mathf.Asin(trans[trans.Count - 1].transform.localPosition.x / r);
        DT.TO((b) =>
        {
            moveRad = b;
            Init();
        }, moveRad, moveRad + tempRad, 1);
    }
}

以下代码是手写DoTween中的To方法

using System;
using UnityEngine;

public class DoTween : MonoBehaviour
{
    float begin;
    float end;
    float time;
    float beginTime;
    Action<float> action;
    Action complete;
   
    public static DoTween TO(Action<float> action, float begin, float end, float time)
    {
        GameObject go = new GameObject("DT");
        DoTween dT = go.AddComponent<DoTween>();
        dT.begin = begin;
        dT.end = end;
        dT.time = time;
        dT.action = action;
        dT.beginTime = Time.time;
        return dT;
    }
    public DoTween OnComplete(Action comlete)
    {
        this.complete = comlete;
        return this;
    }
    private void Update()
    {
        if (Time.time - beginTime<time)
        {
            float radio = (Time.time - beginTime) / time;
            float offest = radio * (end - begin) + begin;
            action(offest);
        }
        else
        {
            action(end);
            if(complete != null) complete();
            Destroy(gameObject);
        }
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值