using Assets.Scenes.Ride.Scripts; using Assets.Scripts; using DG.Tweening; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; using UnityEngine.UI; public class MessageScript : MonoBehaviour { public GameObject _message; RectTransform content; List data = new List(); bool animating = false; float timer = 1f; float speed = 50f; float datatimer = 300f; private void Awake() { content = (RectTransform)transform.Find("Scroll View/Viewport/Content"); //EventQueueSystem.AddListener(LinkedMessageHandler); } private void LinkedMessageHandler(LinkedMessageEvent e) { if (App.globalMessageQueue.Count == 5) { App.globalMessageQueue.Dequeue(); } App.globalMessageQueue.Enqueue(e); data.Add(new MessageModel { Avatar = e.avatar, Content = "" + e.nickname+""+e.content, Type = 1, }); } void Start() { InitAsync();//初始化数据 } float currentWith = 0f; // Update is called once per frame void Update() { //数据源 datatimer -= Time.deltaTime; if (datatimer <= 0) { GetData(); datatimer += 300f; } //动画 timer -= Time.deltaTime; if (timer <= 0) { if (animating) return; currentWith = content.rect.width; animating = true; var wait = Mathf.Max(Mathf.Floor(currentWith / speed),2f); var tween = content.DOLocalMoveX(-currentWith, wait).SetEase(Ease.Linear); tween.onComplete += () => { //刷新内容 Refresh(); //初始化位置 content.transform.localPosition = new Vector3(1245f, 0, 0); }; datatimer += 5f; } } private async Task InitAsync() { await GetData(); Refresh(); } private void Refresh() { Utils.DestroyChildren(content.transform); //创建新的内容 foreach (var item in data) { if (!item.OutDated && item.Type != 0 || item.Type == 0) { var cell = Instantiate(_message, content); var headImage = cell.transform.Find("bg/Avatar").GetComponent(); var text = cell.transform.Find("Message").GetComponent(); //创建头像 if (!string.IsNullOrEmpty(item.Avatar)) { Utils.DisplayImage(headImage, item.Avatar); } //创建消息 text.GetComponent().text = item.Content; cell.SetActive(true); LayoutRebuilder.ForceRebuildLayoutImmediate(content); item.OutDated = true; } } LayoutRebuilder.ForceRebuildLayoutImmediate(content); //释放动画锁 animating = false; } private async Task GetData() { foreach (var item in data) { if (item.Type == 0) { data.Remove(item); } } var res = await ConfigHelper.mapApi.GetMaxRanking(); if (res.result) { var maxList = res.data; foreach (var item in maxList) { data.Add(new MessageModel { Avatar = item.WxHeadImg, Content = $"{item.NickName}{item.Message}", Type = 0, }); } } var r = await ConfigHelper.userApi.GetNotify(); if (r.result) { var info = r.data["Content"].ToString().Replace("\r\n", " "); if (!string.IsNullOrEmpty(info)) { data.Add(new MessageModel { Avatar = string.Empty, Content = info, Type = 0, }); } } } public class MessageModel { public string Avatar { get; set;} public string Content { get; set; } public int Type { get; set; } public bool OutDated { get; set; } } }