Unity3D UGUI实现Toast

项目中有些信息需要以Toast的形式体现出来,不需要交互,弹出后一段时间后消失,多个Toast会向上重叠,下面是一个UGUI Toast的实现,动画部份用到了Dotween来实现

首先需要制作Toast预制体,预制体初始化后就进行淡出动画,初始化的过程中根据str长度改变父节点图片大小

复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;

public class ToastHandler : MonoBehaviour {
    public Image image;
    public Text text;

    //初始化
    public void InitToast(string str,System.Action callback) {
        text.text = str;
        int StrLenth = str.Length;
        int ToastWidth = 1;
        int ToastHeight = 1;
        if (StrLenth > 10)
        {
            ToastHeight = (StrLenth / 10)+1;
            ToastWidth = 10;

        }
        else {
            ToastWidth = StrLenth;
        }
    
        image.rectTransform.sizeDelta = new Vector2(50* ToastWidth + 100, 50* ToastHeight + 100);
        FadeOut(callback);
    }

    public void FadeOut(System.Action callback) {
        image.DOFade(0,2).OnComplete(()=> {
            callback.Invoke();
            Destroy(gameObject);
        });
        text.DOFade(0,2);
    }

    //堆叠向上移动
    public void Move(float speed, int targetPos)
    {
        transform.DOLocalMoveY(targetPos * image.rectTransform.sizeDelta.y, speed);
    }
}
复制代码

 

然后需要一个Manager来创建和管理这些Toast预制体,使用单例模式方便其他地方调用,初始化预制体的时候要传一个回调,预制体淡出销毁前要从Manager的列表里面Remove掉

复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ToastManager : MonoBehaviour {
    private static ToastManager Instance;

    public static ToastManager GetInstance() {
        return Instance;
    }

    private void Awake()
    {
        Instance = this;
    }

    public GameObject ToastPrefab;
    public List<ToastHandler> ToastList = new List<ToastHandler>();

    private float Timer=0;
    public float Interval;

    public Transform Parent;


    //通过这里来创建Toast预制体
    public void CreatToast(string str)
    {
        var Toa = Instantiate(ToastPrefab, Parent.transform.position, Parent.transform.rotation, Parent.transform);
        var comp = Toa.GetComponent<ToastHandler>();
        ToastList.Insert(0, comp);
        comp.InitToast(str,()=> {
            ToastList.Remove(comp);
        });
    
        Timer = 0;

        //有新的Toast出现,之前的Toast向上移动
        ToastMove(0.2f);
    }

    public void ToastMove(float speed) {
        for (int i = 0; i < ToastList.Count; i++)
        {
            ToastList[i].Move(speed,i+1);
        }
    }
}
复制代码

效果如下:

posted on   奇个旦Game  阅读(2213)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示