unity循环跑马灯简易版

unity循环的跑马灯

需求

需要做一个这种无限循环的跑马灯
请添加图片描述

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();
    }

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值