Unity3D UGUI实现Toast

时间:2023-03-09 15:50:54
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 = ;
int ToastHeight = ;
if (StrLenth > )
{
ToastHeight = (StrLenth / )+;
ToastWidth = ; }
else {
ToastWidth = StrLenth;
} image.rectTransform.sizeDelta = new Vector2(* ToastWidth + , * ToastHeight + );
FadeOut(callback);
} public void FadeOut(System.Action callback) {
image.DOFade(,).OnComplete(()=> {
callback.Invoke();
Destroy(gameObject);
});
text.DOFade(,);
} //堆叠向上移动
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=;
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(, comp);
comp.InitToast(str,()=> {
ToastList.Remove(comp);
}); Timer = ; //有新的Toast出现,之前的Toast向上移动
ToastMove(0.2f);
} public void ToastMove(float speed) {
for (int i = ; i < ToastList.Count; i++)
{
ToastList[i].Move(speed,i+);
}
}
}

效果如下:

Unity3D UGUI实现Toast