Unity UGUI 文字Tip(根据DOTween)

在项目中肯定会有一些提示消息

比如你购买一个物品,但是金币不够就会弹出一条文字,提示你金币不足,像这种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);
    }

 

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值