Unity3d实现跑马灯广播效果

 更新时间:2022年01月05日 14:28:43   作者:心林相夕  
这篇文章主要为大家详细介绍了Unity3d实现跑马灯广播效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Unity3d实现跑马灯广播效果的具体代码,供大家参考,具体内容如下

废话不多说,直接上代码

using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Utils;
//挂在UI上面
public class BroadcastUI : MonoBehaviour
{
    private bool inited = false;
    private BroadcastMan bm;
    public Transform parent;
    public GameObject prefab;
    public float parentWith = 0f;
    private Queue<GameObject> textList = new Queue<GameObject>();
    public string curPlayMsg;
    private int curPlayTime = 0;
    public float moveTime = 5f;
    private int curWaitMsgNum = 0;
    private int curEndIndex = 0;
    private void Init()
    {
        bm = this.gameObject.AddComponent<BroadcastMan>();
        parentWith = parent.GetComponent<RectTransform>().rect.width;
        moveTime = moveTime * Screen.width / 812f;
        Debug.LogError("move speed ==" + moveTime);
        inited = true;
    }
    // Start is called before the first frame update
    private void Awake()
    {
        if (!inited) Init();
    }

    private IEnumerator ScrollMsg()
    {
        curWaitMsgNum = bm.MsgCount;
        parent.gameObject.SetActiveFast(true);
        while (bm.MsgCount > 0 || curPlayTime < bm.repetTime)
        {
            if (curPlayMsg == "")
            {
                curPlayMsg = bm.GetAMsgFromQueue();
                curPlayTime = 1;
            }
            else
            {
                if (bm.repetTime > 1)
                {
                    if (curPlayTime >= bm.repetTime)
                    {
                        curPlayTime = 1;
                        curPlayMsg = bm.GetAMsgFromQueue();
                    }
                    else
                    {
                        curPlayTime++;
                    }
                }
                else
                {
                    curPlayMsg = bm.GetAMsgFromQueue();
                }
            }
            Debug.LogError("msg:" + curPlayMsg);
            GameObject text = GetAText();
            text.GetComponent<Text>().text = curPlayMsg;
            text.transform.SetParent(parent, false);
            text.transform.localPosition = prefab.transform.localPosition;
            yield return new WaitForEndOfFrame();
            float textWith = text.GetComponent<RectTransform>().rect.width;
            float moveDis = textWith + parentWith;
            float curMoveTime = moveTime * moveDis / parentWith;
            //Debug.LogError("当前移动时间,当前播放字越多,时间越长"+curMoveTime);

            Tweener tweener = text.transform.DOLocalMove(new Vector3(text.transform.localPosition.x - moveDis, text.transform.localPosition.y, 0), curMoveTime).SetEase(Ease.Linear)
            .OnComplete(() =>
            {
                curEndIndex++;
                textList.Enqueue(text);
                if (bm.MsgCount == 0 && curEndIndex == curWaitMsgNum * bm.repetTime)
                {
                    parent.gameObject.SetActiveFast(false);
                }
            });
            //Debug.LogError("下一条等待时间,当前字越多,等待时间越长"+ (0.5f * parentWith + textWith) / (moveDis / curMoveTime));
            yield return new WaitForSeconds((0.5f * parentWith + textWith) / (moveDis / curMoveTime));
        }
    }

    private void AddMsg()
    {
        List<string> msgs = new List<string>();
        msgs.Add("<color=#C0FF35>测试一下这个跑马灯的效果>>>>>>>>>>></color>");
        msgs.Add("<color=#C14848>中国第七金!祝贺庞伟、姜冉馨</color>");
        msgs.Add("<color=#6BEE5B>第10金!中国组合获得东京奥运会女子四人双桨金牌</color>");
        msgs.Add("<color=#EE5BBB>台风“烟花”</color>");
        msgs.Add("<color=#DB2136>把鲸鱼送回大海!七米长须鲸搁浅 多方力量开展救援</color>");
        bm.AddMsgToQueue(msgs);
    }

    private void OnDestory()
    {
        inited = false;

    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.A) && bm.MsgCount == 0)
        {
            AddMsg();
            StartCoroutine(ScrollMsg());
        }
    }

    private GameObject GetAText()
    {
        if (textList.Count > 0)
        {
            return textList.Dequeue();
        }
        return GameObject.Instantiate(prefab);
    }
}
using System.Collections.Generic;
using UnityEngine; 
//这个放收到的消息
public class BroadcastMan : MonoBehaviour
{
    private bool inited = false;
    private Queue<string> msgQueue;//灯队列.
    public int repetTime = 2;//广播重复次数
    private void Init()
    {
        msgQueue = new Queue<string>();
        inited = true;
    }
    // Start is called before the first frame update
    private void Awake()
    {
        if (!inited) Init(); 
    }

    public void AddMsgToQueue(List<string> msgs)
    {
        for (int i = 0; i < msgs.Count; i++)
        {
            msgQueue.Enqueue(msgs[i]);
        }
    }

    public string GetAMsgFromQueue()
    {
        if (msgQueue.Count > 0)
        {
            return msgQueue.Dequeue();
        }
        return "";
    }

    public int MsgCount
    {
        get => msgQueue.Count;
    }

    private void OnDestory()
    {
        inited = false;
    }
}

界面

好了,就这样

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#检查指定对象是否存在于ArrayList集合中的方法

    C#检查指定对象是否存在于ArrayList集合中的方法

    这篇文章主要介绍了C#检查指定对象是否存在于ArrayList集合中的方法,涉及C#中Contains方法的使用技巧,需要的朋友可以参考下
    2015-04-04
  • C#实现循环发送电脑屏幕截图

    C#实现循环发送电脑屏幕截图

    这篇文章主要为大家详细介绍了C#实现循环发送电脑屏幕截图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C#实现获取程序路径方法小结

    C#实现获取程序路径方法小结

    这篇文章主要介绍了C#实现获取程序路径方法,实例分析了C#获取文件路径的各种常用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C#操作Byte数组和十六进制进行互转

    C#操作Byte数组和十六进制进行互转

    这篇文章介绍了C#操作Byte数组和十六进制进行互转的的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#重载运算符详解

    C#重载运算符详解

    这篇文章主要介绍了C#重载运算符,是进行C#程序设计中非常重要的一个技巧,需要的朋友可以参考下
    2014-08-08
  • C#语言主要语言区域

    C#语言主要语言区域

    这篇文章主要介绍了C#语言主要语言区域,C#语言区域主要包括数组、集合和 LINQ、数组等,下面文化在哪个内容围绕这些区域得相关资料了展开详情,需要的小伙伴可以参考一下
    2021-12-12
  • WinForm生成验证码图片的方法

    WinForm生成验证码图片的方法

    这篇文章主要介绍了WinForm生成验证码图片的方法,涉及WinForm字符串及图形操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • C#对图片进行马赛克处理可控制模糊程度的实现代码

    C#对图片进行马赛克处理可控制模糊程度的实现代码

    本文通过实例代码给大家介绍了C#对图片进行马赛克处理可控制模糊程度的实现方法,代码超简单,具有一定的参考借鉴价值,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-05-05
  • C#使用Json.Net对JSON与对象的序列化与反序列化

    C#使用Json.Net对JSON与对象的序列化与反序列化

    这篇文章介绍了Json.Net对JSON与对象的序列化与反序列化,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#温故而知新系列教程之闭包

    C#温故而知新系列教程之闭包

    闭包是将一些执行语句的封装,可以将封装的结果像对象一样传递,在传递时,这个封装依然能够访问到原上下文。下面这篇文章主要给大家介绍了关于C#中闭包的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-05-05

最新评论