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);
        }
    }
}

效果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM