Unity---UI动效

1,531 阅读5分钟

一、UI动效之dotween移动

1.1、页面移入效果

简单方法

 

  • l 创建一个canvas,添加图片image,重命名为Panel,新建一个按钮,放置下方。

  • l 给按钮添加一个脚本文件,用来检测按钮的点击事件

  • l 对这个按钮:第一次点击将Panel隐藏

  • l 在脚本文件中定义一个OnClick方法监测点击事件

public void OnClick()
    {
    }
  • l 将onClick方法注册到按钮的OnClick事件上 image.png

  • l 当点击按钮时把面板显示出来,如何去做?

  • l 因为要控制面板,所以要先得到Panel的组件

image.png

  • l 在脚本文件中定义控制的Panel变量,

代码: public RectTransform panelTransform;

  • l 现在button中将持有Panel,通过点击按钮button将panel回归页面。
  • l 使用dotween的扩展方法,DoMove()
//定义一个方法监测点击事件

    public void OnClick()

    {
        panelTransform.DOMove(new Vector3(0,0,0),2);//將panelTransform从当前位置动画到0,0,0的位置,时间为2秒

    }
  • l 回到页面运行效果有些出入。

image.png

l 原因:不应该变换世界坐标,而是更改局部坐标

//定义一个方法监测点击事件

    public void OnClick()

    {

        //panelTransform.DOMove(new Vector3(0,0,0),2);//將panelTransform从当前位置动画到0,0,0的位置,时间为2秒(修改的是世界坐标)

        panelTransform.DOLocalMove(new Vector3(0, 0, 0), 1.5f);

}

效果图:

image.png

完整代码:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using DG.Tweening;

 

public class MyButton : MonoBehaviour

{

    //定义控制的Panel变量

    public RectTransform panelTransform;

 

    //定义一个方法监测点击事件

    public void OnClick()

    {

        //panelTransform.DOMove(new Vector3(0,0,0),2);//將panelTransform从当前位置动画到0,0,0的位置,时间为2秒(修改的是世界坐标)

        panelTransform.DOLocalMove(new Vector3(0, 0, 0), 1.5f);

    }

}

1.2、页面移出效果

  • l 创建一个布尔值,默认为FALSE,判断panel是否在屏幕当中

public bool isIn = false;

  • l 如果bool为FALSE,说明没有进入,点击播放动画,若在屏幕当中,点击让他离开
//定义一个方法监测点击事件

        if (isIn == false)

        {

            //panelTransform.DOMove(new Vector3(0,0,0),2);//將panelTransform从当前位置动画到0,0,0的位置,时间为2秒(修改的是世界坐标)

           panelTransform.DOLocalMove(new Vector3(0, 0, 0), 1.5f);//

            isIn = true;

        }

        else

        {

            //让panel离开屏幕,将这个动画倒放则是离开

            panelTransform.DOPlayBackwards();//倒放

            isIn = false;

        }
  • l 但是此处点击按钮倒放出问题,页面没有离开,是因为此处默认动画播放完会销毁,倒放此处会出问题,解决:调用DOLocalMove时有个返回值:Tweener,这个Tweener对象保存的是该动画
//定义一个方法监测点击事件

        if (isIn == false)

        {

            //panelTransform.DOMove(new Vector3(0,0,0),2);//將panelTransform从当前位置动画到0,0,0的位置,时间为2秒(修改的是世界坐标)

          Tweener tweener =  panelTransform.DOLocalMove(new Vector3(0, 0, 0), 1.5f);//此处默认动画播放完会销毁,倒放此处会出问题

            //调用DOLocalMove时有个返回值:Tweener,这个Tweener对象保存的是该动画

            //每次调用do类型的方法(关于动画)都会创建一个Tweener对象,这个对象是dotween来管理的

 

            tweener.SetAutoKill(false);//把autokill自动销毁设置为FALSE

 

            isIn = true;

        }

        else

        {

            //让panel离开屏幕,将这个动画倒放则是离开

            panelTransform.DOPlayBackwards();//倒放

            isIn = false;

        }
  • l 运行后成功进入离开

1.3、优化do动画性能

  • l 在播放页面后层级处会出现一个dotween对象,点击详情会看到Active Tweens有一个动画数量为4,这是因为刚刚创建了4次,所以执行了4次动画,这样浪费性能,只需让其调用一次do方法即可,如何做呢? image.png

  • l 将do方法的调用放置start方法里

void Start()

    {

        //panelTransform.DOMove(new Vector3(0,0,0),2);//將panelTransform从当前位置动画到0,0,0的位置,时间为2秒(修改的是世界坐标)

        Tweener tweener = panelTransform.DOLocalMove(new Vector3(0, 0, 0), 1.5f);//此处默认动画播放完会销毁,倒放此处会出问题

          //调用DOLocalMove时有个返回值:Tweener,这个Tweener对象保存的是该动画

          //每次调用do类型的方法(关于动画)都会创建一个Tweener对象,这个对象是dotween来管理的

 

        tweener.SetAutoKill(false);//把autokill自动销毁设置为FALSE

}
  • l 在start中每次执行都会调用该动画,但是最开始时不执行,把它暂停即可 tweener.Pause();
  • l 若要播放,则调用Tweener或panelTransform中的play方法来进行调用 panelTransform.DOPlay();
  • 执行后动画只调用了一次,播放执行了doplay方法,倒放执行了DOPlayBackwards方法,只执行了一次,这是为什么呢?是因为DOPlay只会执行一次,所以使用DOPlayForward方法--向前进行播放。
完整代码如下:

 

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using DG.Tweening;

 

public class MyButton : MonoBehaviour

{

    //定义控制的Panel变量

    public RectTransform panelTransform;

 

    //定义布尔值判断panel是否在屏幕当中

    public bool isIn = false;

 

    void Start()

    {

        //panelTransform.DOMove(new Vector3(0,0,0),2);//將panelTransform从当前位置动画到0,0,0的位置,时间为2秒(修改的是世界坐标)

        Tweener tweener = panelTransform.DOLocalMove(new Vector3(0, 0, 0), 1.5f);//此处默认动画播放完会销毁,倒放此处会出问题

          //调用DOLocalMove时有个返回值:Tweener,这个Tweener对象保存的是该动画

          //每次调用do类型的方法(关于动画)都会创建一个Tweener对象,这个对象是dotween来管理的

 

        tweener.SetAutoKill(false);//把autokill自动销毁设置为FALSE

 

        //每次执行都会调用该动画,但是最开始时不执行,把它暂停即可

        tweener.Pause();

    }

 

    //定义一个方法监测点击事件

    public void OnClick()

    {

        if (isIn == false)

        {

            panelTransform.DOPlayForward();//前放

             isIn = true;

        }

        else

        {

            //让panel离开屏幕,将这个动画倒放则是离开

            panelTransform.DOPlayBackwards();//倒放

            isIn = false;

        }

    }

}