需求
需要做一个这种无限循环的跑马灯
UI结构
最上层是mask 下边加了两条一样的文字(如果文字特别短,可以多加几个) mask上边有horizonal的layout 控制一下显示
mask代码
public class SlideMain : MonoBehaviour
{
public Text txt1;
public Text txt2;
public SlideText slideText1;
public SlideText slideText2;
public Vector3 rightPos;
public Vector3 initPos;
public void InitSlide()
{
rightPos = txt2.rectTransform.anchoredPosition3D;
initPos = txt1.rectTransform.anchoredPosition3D;
slideText1.rightPos = rightPos;
slideText2.rightPos = rightPos;
slideText1.initPos = initPos;
slideText2.initPos = rightPos;
}
public void StartRoll()
{
slideText1.StartCo();
slideText2.StartCo();
}
public void StopRoll()
{
slideText1.StopCo();
slideText2.StopCo();
}
public void PauseRoll()
{
slideText1.PauseRoll();
slideText2.PauseRoll();
}
}
滑动条代码
public class SlideText : MonoBehaviour
{
public Text txt1;
public Text txt2;
bool startScroll = false;
public Vector3 rightPos;
public Vector3 initPos;
public int space = 80; //layout设置的space
public Coroutine coroutine;
public Tweener tweener;
public IEnumerator Scrolling()
{
while (startScroll)
{
float duration = 10f;
float speed = 100f;
float txtWidth = txt1.preferredWidth;
Vector3 pos = txt1.rectTransform.anchoredPosition3D;
while (txt1.rectTransform.anchoredPosition3D.x <= 0)
{
float distance = txtWidth + space;
duration = distance / speed;
tweener = txt1.rectTransform.DOLocalMoveX(-distance, duration).SetEase(Ease.Linear).OnComplete(() => { txt1.rectTransform.anchoredPosition3D = rightPos;
if(coroutine == null)
{
coroutine = StartCoroutine(Scrolling());
}
});
yield return new WaitForSeconds(duration);
}
while(txt1.rectTransform.localPosition.x >= rightPos.x)
{
float distance = rightPos.x;
duration = distance / speed;
tweener = txt1.rectTransform.DOLocalMoveX(0, duration).SetEase(Ease.Linear).OnComplete(()=> {
if(coroutine == null)
{
coroutine = StartCoroutine(Scrolling());
}
});
yield return new WaitForSeconds(duration);
}
yield return null;
}
yield break;
}
public void StartCo()
{
startScroll = true;
if (tweener != null)
{
tweener.Play();
coroutine = null;
}
else
{
coroutine = StartCoroutine(Scrolling());
}
}
public void StopCo()
{
startScroll = false;
if (coroutine != null)
{
StopCoroutine(coroutine);
coroutine = null;
}
if (tweener != null)
{
tweener.Kill(true);
tweener = null;
}
}
public void PauseRoll()
{
if (coroutine != null)
{
StopCoroutine(coroutine);
coroutine = null;
}
if (tweener != null)
{
tweener.Pause();
}
}
}