效果:
布局:背景图片添加Mask
Text 我这里用的是TextMeshPro 设置成Overflow
接下来就是代码的编写了。首先说一下思路:1 、设置text的起始位置在如图2的1位置处,text的末尾在2处。使用DoTween动画进行移动。
2 、咱们知道队列的特色是先进先出,因此用到了队列和协程,只有当前消息播放完毕以后才会播放下条消息。
代码:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using DG.Tweening;
public class EntertainingDiversions : MonoBehaviour
{
[SerializeField]
private TMP_Text m_TxtMsg;
private Queue<String> m_MsgQueue;
private bool isScrolling = false;
void Start()
{
this.m_MsgQueue = new Queue<string>();
AddMsg("adscdvrfhtjyiukio8l9;9;9;9;fhgd,hg,gh,hg,h");//测试
}
void AddMsg(string msg)
{
this.m_MsgQueue.Enqueue(msg);
if (this.isScrolling) return;
StartCoroutine(this.Scrolling());
}
IEnumerator Scrolling()
{
float beginX = 400;//背景图片的宽度/2
float leftX = -400;
while (m_MsgQueue.Count > 0)
{
float duration = 10f;
float speed = 200f;
int loop = 3;
string msg = m_MsgQueue.Dequeue();//队列是先进先出
m_TxtMsg.text = msg;
float txtWidth = m_TxtMsg.preferredWidth;//文本自身的长度.
Vector3 pos = m_TxtMsg.rectTransform.localPosition;
float distance = beginX - leftX + txtWidth;//要移动到的末尾位置
duration = distance / speed; //1400/200=700 持续时间
isScrolling = true;
while (loop-- > 0)
{
Debug.Log(loop);
m_TxtMsg.rectTransform.localPosition = new Vector3(beginX, pos.y, pos.z);
m_TxtMsg.rectTransform.DOLocalMoveX(-distance, duration).SetEase(Ease.Linear);
yield return new WaitForSeconds(duration);
}
yield return null;
}
isScrolling = false;
gameObject.SetActive(false);
yield break;
}
}