在项目中肯定会有一些提示消息
比如你购买一个物品,但是金币不够就会弹出一条文字,提示你金币不足,像这种tip可以单独写一个脚本来控制显示.
下面先看看效果
下面就是脚本内容, 这里我用到了我之前写的对象池和单例, 你们可以自己实现,也可以看一下我之前写的博文
DoTween插件下载连接: 点我下载Dotween插件
对象池连接: 点我跳转对象池
单例连连接: 点我跳转单例
using DG.Tweening; //自己下载插件 DoTween
using UnityEngine;
using UnityEngine.UI;
//用到了单例模式 可以自己写 也可以看我前一段的博文
public class MgrTips : SingletonBase<MgrTips> {
//单独的画布
private Canvas _tipsCanvas;
//储存所有提示文字节点
private Transform _tipsBase;
/// <summary>
/// 初始化对象池 加载节点
/// </summary>
private void Init()
{
//因为提示文字要显示在所有层级的最上方 我这里在场景新建一个Canvas
_tipsCanvas = this.LoadTipPrefab().GetComponent<Canvas>();
_tipsCanvas.sortingOrder = 100;
_tipsCanvas.transform.SetParent(this.transform);
//新建一个节点储存所有显示的Tip
_tipsBase = _tipsCanvas.transform.Find("TipsBase");
//初始化对象池
MgrPool.Instance.InitPool(PoolType.TEXTTIP, _tipsCanvas.transform.Find("TextTipBg_Image").gameObject, 10);
}
/// <summary>
/// 加载做好的预制体(根据项目来 一般都是打成ab包 我这里方便展示就不写了)
/// </summary>
/// <returns></returns>
private GameObject LoadTipPrefab() {
//我是把这个Canvas做成了预制体放在了 这个目录下
return Instantiate(Resources.Load<GameObject>("UIPrefabs/TipCanvas"));
}
/// <summary>
/// 提示文字 系统消息
/// </summary>
/// <param name="str">提示内容</param>
/// <param name="stayTime">停留几秒</param>
/// <param name="moveY">向上飞多高(根据你提示框的高度自定义)</param>
public void ShowTip (string str, float stayTime = 2f, float moveY = 60f ) {
//第一次调用先初始化池子
if (_tipsCanvas == null) this.Init();
//先判断当前节点下是不是有提示文字 如果有渐隐
int indexcount = 0;
if (this._tipsBase.childCount > 3) {
indexcount = this._tipsBase.childCount - 3;
foreach (Transform childNode in this._tipsBase) {
indexcount--;
childNode.GetComponent<CanvasGroup> ().DOFade (0f, 0.25f);
if (indexcount <= 0) break;
}
}
//让原来的提示向上滚
foreach (RectTransform childNode in this._tipsBase) {
childNode.DOLocalMoveY (childNode.localPosition.y + moveY, 0.3f); //childNode.sizeDelta.y
}
//创建新的提示文字 (这里用到了对象池 你们也可以自己克隆出来那个预制体)
RectTransform tipObj = MgrPool.Instance.Get(PoolType.TEXTTIP).GetComponent<RectTransform>();
tipObj.SetParent (_tipsBase);
tipObj.localPosition = Vector3.zero;
tipObj.gameObject.SetActive (true);
tipObj.GetComponentInChildren<Text> ().text = str;
//判断是否刚显示过一个
float aTime = this._tipsBase.childCount == 1 ? 0f : 0.3f;
//利用Dotween做动画
Sequence sequence = DOTween.Sequence ();
//sequence.Insert (aTime, tipObj.GetComponent<CanvasGroup> ().DOFade (1, 0.2f));
sequence.Append(tipObj.GetComponent<CanvasGroup>().DOFade(1, 0.2f));
sequence.AppendInterval(stayTime + aTime);
sequence.Append(tipObj.GetComponent<CanvasGroup>().DOFade(0, 0.8f));
//动画结束后回收
sequence.OnComplete (() => {
MgrPool.Instance.Put(PoolType.TEXTTIP, tipObj.gameObject);
});
sequence.Play();
}
}
下边是我测试按钮的点击事件
//测试用 摘抄LOL台词
string[] strArr = {
"真正的大师,永远都怀着一颗学徒的心",
"断剑重铸之日,其誓归来之时",
"真正的意志是不会被击败的",
"我于杀戮之中绽放,亦如黎明中的花朵",
"是的,只要998,就能让你爽到不能呼吸",
"物是人非,可我依旧穿着嫁衣,在黑夜中寻找你的身影",
"我好想射点什么",
"是时候表演真正的技术了",
"鸟真多,匹配系统真得能找到所谓的平衡吗?",
"德玛西亚",};
//点击事件
public void OnClickBtn() {
//随机一句话显示出来
string str = strArr[Random.Range(0, strArr.Length)];
MgrTips.Instance.ShowTip(str);
}