Unity游戏广播走马灯可循环可插入

应朋友要求帮忙写的一个游戏广播走马灯程序,可以循环播放单条消息的次数也可以插入消息优先播放,废话不多说直接上代码,(这里只是基本的功能实现,具体封装自己去封装了,我就不封装了,也是对你们的锻炼,哈哈)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

using System;

enum CirculationType
{
    Single,
    Circulation,
    Insertion,
}

class Item
{
    public Item(string pText, int pCount)
    {
        m_pText = pText;
        Count = pCount;
    }
    public string m_pText;
    public int Count;
}

public class NewBehaviourScript : MonoBehaviour
{

    /// <summary>
    /// 公告跑马灯
    /// </summary>
    public Text NoticeText;
    public Vector3 Speed = new Vector3(2, 0, 0);
    public float _MoveEndPoint;
    public Vector2 _MoveStartPoint;
    public float _ParentWidth;
    public float _SelfWidth;
    public Button button;

    private int spe = 3;
    string pname;

    List<string> pName;

    bool m_bCirculation;
    bool m_bInsertion;
    bool m_bRun=true;
    int m_nRun = 0;
    Queue<Item> GetVs = new Queue<Item>();

    /// <summary>
    /// 土豪数据 先进后出
    /// </summary>
    Stack<Item> GetStack = new Stack<Item>();

    public event Action m_pUpdateQueueText;

    public event Action m_pUpdateStackText;

    private void Start()
    {
        GetVs.Enqueue(new Item("元素1222222222222222222222222222222222222222222222222222222222222", 0));
        GetVs.Enqueue(new Item("元素233333333333333333333333333333333333333333333333333333333333", 2));//2  3
        GetVs.Enqueue(new Item("元素344444444444444444444444444444444444444444444444444444444444", 3));//3  4
        GetVs.Enqueue(new Item("元素35555555555555555555555555555555555555555555555555555555555", 0));

        GetQueueText();
        RegisterBroadcast();
        m_pUpdateQueueText += GetQueueText;

        m_pUpdateStackText += GetStackText;

        button.onClick.AddListener(delegate ()
        {
            GetStack.Push(new Item("土豪充值:百万!!!!!!!! 这个是超级土豪!!!!! 大家欢迎!!!!", 3));
        });
    }

    /// <summary>
    /// 注册 公告,便于刷新
    /// </summary>
    /// <param name="text"></param>
    void RegisterBroadcast()
    {
        _ParentWidth = NoticeText.transform.parent.GetComponent<RectTransform>().rect.width;
        _SelfWidth = NoticeText.preferredWidth;
        NoticeText.transform.GetComponent<RectTransform>().pivot = new Vector2(0, 0.5f);

        _MoveEndPoint = -_ParentWidth / 2 - _SelfWidth;

        _MoveStartPoint = new Vector2(_ParentWidth / 2, 0);
    }

    private void FixedUpdate()
    {
        if (GetStack.Count == 0 && GetVs.Count == 0)
        {
            if (m_bRun)
            {
                m_nRun++;
                m_bRun = false;
                Debug.LogError("ddd");
            }
        }
        else
        {

            m_bRun = true;
        }

        if (m_nRun >=2) return;
        m_bInsertion = GetStack.Count != 0 ? true : false;

        // 公告移动
        if (NoticeText.gameObject.activeInHierarchy)
        {
            NoticeText.transform.localPosition -= Speed;
            if (NoticeText.transform.localPosition.x <= _MoveEndPoint)
            {
                NoticeText.transform.localPosition = _MoveStartPoint;

                if (m_nRun == 1) m_nRun++;
                m_bCirculation = spe > 0 ? true : false;
                if (m_bCirculation)
                    spe--;

                if (m_bInsertion)
                {
                    if (m_pUpdateStackText != null)
                        m_pUpdateStackText();
                }
                else
                {
                    if (m_pUpdateQueueText != null && GetVs.Count != 0 && !m_bCirculation)
                    {
                        m_pUpdateQueueText();
                    }
                }
            }
        }
    }

    /// <summary>
    /// 获取下一条
    /// </summary>
    /// <returns></returns>
    public void GetQueueText()
    {
        Item item = GetVs.Dequeue();
        NoticeText.text = item.m_pText;
        spe = item.Count - 1;

    }

    public void GetStackText()
    {
        Item item = GetStack.Pop();
        NoticeText.text = item.m_pText;
        spe = item.Count - 1;
    }
}

我这里是使用 栈队和事件完成的,有什么好的建议可以留言,(其实这个代码还可以优化,只是没时间去改了,有兴趣的同学可以自己拿去优化试试~)。

下面是执行效果 :
顺序播放

插入

原文地址:https://blog.51cto.com/14058389/2466597

时间: 2024-10-21 10:30:29

Unity游戏广播走马灯可循环可插入的相关文章

C#开发Unity游戏教程之使用脚本变量

C#开发Unity游戏教程之使用脚本变量 使用脚本变量 本章前面说了那么多关于变量的知识,那么在脚本中要如何编写关于变量的代码,有规章可循吗?答案是有的.本节会依次讲解变量的声明.初始化.赋值和运算. Unity脚本中声明变量 要想在脚本中使用变量,就必须先声明(declare).这就意味着,需要先告诉Unity,有这样一个变量存在,然后才可以在Unity中使用这个变量.那么,该如何将这个变量存在的事实告知Unity呢?答案就是声明.实际上,读者已经在本章见过多次变量的声明了,没错就是图3-11

Unity优化方向——在Unity游戏中优化脚本(译)

原文地址:https://unity3d.com/cn/learn/tutorials/topics/performance-optimization/optimizing-scripts-unity-games?playlist=44069 介绍 当我们的游戏运行时,我们设备的中央处理器(CPU)执行指令.游戏的每一帧都需要执行数百万的CPU指令.为了保持平滑的帧率,CPU必须在规定的时间内执行指令.当CPU不能及时执行所有指令时,我们的游戏可能会变慢.卡顿. 许多事情会导致CPU有太多的工作

U3D开发者福利 MATRIX : UNITY 游戏技术咨询免费开放

UNITE 2015 BEIJING 于2015年4月18日-20日,在北京国家会议中心隆重举行.在这场被媒体誉为"行业风向标"的大会上,Unity 大中华区总裁符国新提到2015年Unity 将在全球范围内着重发展线上增值服务,并宣布Unity 将在大中华区开启"Matrix 游戏技术咨询". Matrix -最专业的游戏技术咨询平台 Matrix 是由Unity 大中华区的技术咨询团队研发的,旨在帮助游戏团队更加方便.准确地定位和解决游戏开发过程中所遇到的性能问

C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二)

本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一) 上个帖子主要是讲了如何读取Excel,本帖主要是讲述读取的Excel数据是如何序列化成二进制的,考虑到现在在手游中应用很广泛的序列化技术Google的ProtoBuf,所以本文也是按照ProtoBuf的方式来操作的.ProtoBuf是一个开源库,简单来说ProtoBuf就是一个能使序列化的数据变得更小的类库,当然这里指的更小是相对的.好了ProtBuf的东西就不在多说,以后会专门写一篇帖子的.本帖其实就相当于上

C# Unity游戏开发——Excel中的数据是如何到游戏中的 (三)

本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二) 前几天有点事情所以没有继续更新,今天我们接着说.上个帖子中我们看到已经把Excel数据生成了.bin的文件,不过其实这样到游戏中还是不能用的.主要有两个方面,1.bin文件的后缀使我们随便取的名字,但是这种文件Unity不买账.因为Unity中的二进制文件必须是以.bytes命名的.2.在写文件之前其实还可以对二进制进行压缩,这样可以最大化节省设备空间.也就是说我们在生成数据实例后还需要做以下几件事:序列化 -

Unity游戏开发中的内存管理_资料

内存是手游的硬伤——Unity游戏Mono内存管理及泄漏http://wetest.qq.com/lab/view/135.html 深入浅出再谈Unity内存泄漏http://wetest.qq.com/lab/view/150.html 这一次,我优化了37%的内存http://wetest.qq.com/lab/view/147.html Unity项目资源加载与管理http://wetest.qq.com/lab/view/124.html Android应用内存泄露分析.改善经验总结h

【Unity 3D】学习笔记二十六:unity游戏脚本(六)

在3D游戏世界中,任何一个游戏对象在创建的时候都会附带Transform(变换)组件,并且该组件是无法删除的,也不应该删除.在unity中,Transform面板一共有3个属性: Position  (位置) Rotation(旋转) Scale(缩放) 这三个值都是用来调整游戏对象在游戏界面中的位置,状态等相关参数. Position  (位置) 任何一个游戏对象的三维坐标都保存在Vector3容器中,该容器记录对象在X轴,Y轴,Z轴的坐标.一旦Vector33容器中的坐标发生变化,那么Sce

unity基础开发----unity游戏速度更快的简易检查表

让游戏速度更快的简易检查表 保持顶点数在 200K 下面,针对 PC 时每帧应为 3M,主要取决于目标 GPU. 若使用内置着色器,请在移动 (Mobile) 或未点亮 (Unlit) 的类别中选择.它们对非移动平台相同有效,可是是更复杂的着色器的简化和限制版本号. 每一个场景中不同材质的数量尽可能少 - 不同对象之间尽可能共享相同的材质. 在非移动对象上设置静态 (Static) 属性,同意静态批处理 (static batching) 等内部优化. 切勿在不必要的情况下使用像素灯 - 选择仅

Unity 游戏移植到 Windows10 之路 -- 环境搭建

孙广东   2015.8.31 原文:http://blogs.msdn.com/b/windows__windows_game_dev_faq_/archive/2015/08/19/unity-windows10.aspx Windows10 是微软公司最新一代的跨平台及设备应用的操作系统.它统一了包括个人电脑.平板电脑.智慧型手机.嵌入式系统.Xbox One以及新产品Surface Hub和HoloLens等等的整个Windows产品系列的作业系统,共享一个通用的应用程式架构(UWP)和