項目中有些信息需要以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); } } }
效果如下: