應朋友要求幫忙寫的一個遊戲廣播走馬燈程序,能夠循環播放單條消息的次數也能夠插入消息優先播放,廢話很少說直接上代碼,(這裏只是基本的功能實現,具體封裝本身去封裝了,我就不封裝了,也是對大家的鍛鍊,哈哈)ide
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; } }
我這裏是使用 棧隊和事件完成的,有什麼好的建議能夠留言,(其實這個代碼還能夠優化,只是沒時間去改了,有興趣的同窗能夠本身拿去優化試試~)。優化
下面是執行效果 :
順序播放code
插入 orm