zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    }

    效果如下:

  • 相关阅读:
    中国区 Azure 服务和定价模式概述
    云计算的那些「What」
    【虚拟机-可用性集】ARM 中可用性集使用的注意事项
    【虚拟机-可用性集】将虚拟机添加到可用性集中
    【虚拟机-远程连接】Azure Linux 虚拟机常见导致无法远程的操作
    【虚拟机-远程链接】Azure Windows 虚拟机常见导致无法远程的操作
    【虚拟机-网络IP】使用 Powershell 设置 VNET 中的静态 IP
    matlab的diff()函数
    matlab的拟合函数polyfit()函数
    解决Python各种no module named "XX"的问题
  • 原文地址:https://www.cnblogs.com/Mr147/p/9890432.html
Copyright © 2011-2022 走看看