unity UGUI + DOTween + lua(xlua)实现跑马灯效果

24 篇文章 1 订阅
16 篇文章 0 订阅

1、引言

  上一篇我们给出了cocos的跑马灯实现方法,这里借助上一篇来用unity实现跑马灯效果,具体原理参照上一篇内容,这里是传送门跑马灯原理分析

2、实现过程

  具体实现包括以下步骤。

2.1、制作预制体

  这里的素材只需要一张图就可以了。我也上传了吧,需要尝试的同学,可以拿去试一试。在这里插入图片描述
有了背景,我们就可以开始了!

  • 首先我们先创建空物体,修改名字为ScrollMsgForm,做如图设置
    在这里插入图片描述
  • 添加背景,创建Img!如图所示
    在这里插入图片描述
  • 添加遮罩,创建空物体,添加组件Image(必须添加,不然mask不起作用)和组件Mask,做不显示遮罩图,如图
    在这里插入图片描述
  • 添加文本,添加文本时最好勾选富文本,便于在程序中控制文本的颜色,同时要添加组件Content size Fitter,Content size Fitter组件可以使文本自适应字体的大小和宽高。

  好了,完成这些预制体就制作好了,下面可以动手写代码了。

2.2、代码实现

具体实现如下所示

ScrollMsgForm = class("ScrollMsgForm") -- 滚动消息类
LuaFormManager.formClassDict["ScrollMsgForm"] = ScrollMsgForm

local GameEntry = CS.XinYue.GameEntry
local cs_coroutine = require "cs_coroutine"
local Vector3 = CS.UnityEngine.Vector3

function ScrollMsgForm:ctor( transform,objs )
    print("ScrollMsgForm:ctor")
    self.msgInfoArr = {}
    self.transform = transform
    self.msgTxt = transform:Find("MsgBg/MsgMask/Text"):GetComponent("Text")
    self.mskTrans = self.msgTxt.transform.parent
    
    self.sizeDeltaParentX = self.mskTrans:GetComponent("RectTransform").sizeDelta.x / 2
    
    self.oriTxtVector3 = Vector3(self.sizeDeltaParentX,self.msgTxt.transform.localPosition.y,self.msgTxt.transform.localPosition.z)
    self.msgTxt.transform.localPosition = self.oriTxtVector3
    self.msgTxt.text = ""
end

function ScrollMsgForm:OnOpen(msgInfo)
     print("ScrollMsgForm:OnOpen")
     
     if msgInfo == nil or next(msgInfo) == nil then return end
     self:scrollMsg(msgInfo[1])
end

function ScrollMsgForm:scrollMsg(msgInfo)
     print("ScrollMsgForm:scrollMsg, msgInfo =",msgInfo)
     if msgInfo == nil then
         return
     end
     self.msgInfoArr[#self.msgInfoArr + 1] = msgInfo
     -- 如果正在滚动直插入数据就可以了,不需要重复执行下面的语句
     if CS.DG.Tweening.DOTween.IsTweening(self.msgTxt.transform) then 
         return
     end
     
     local msgTxtWidth
     local moveDistance
     local moveDuration -- 滚动时间
     local function strtScrollMsg()
          if #self.msgInfoArr > 0 then
              local msgContent = self.msgInfoArr[1]
              table.remove(self.msgInfoArr,1) -- 移除这条滚动的消息
              
              cs_coroutine.start(function ()
                   self.msgTxt.text = msgContent
                   -- 这里等待一帧是为了让msgTxtWidth 得到的值为当前文本的长度,否则得到的值是上一次文本的长度
                   coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
                   
                   msgTxtWidth = self.msgTxt.transform:GetComponent("RectTransform").sizeDelta.x
                   -- 滚动距离就是最终的相对坐标
                   moveDistance = msgTxtWidth + self.sizeDeltaParentX  -- 滚动距离为文本宽度+遮罩长度的一半(跟锚点有关)
                   moveDuration = moveDistance / 100
                   
                   -- 这里的设置的缓动函数SetEase为线性,是为了让文本的移动速度恒定,否则会出现前面快,结束时慢的现象,否则体验不好
                   self.msgTxt.transform:DOLocalMoveX(-moveDistance,moveDuration):SetEase(CS.DG.Tweening.Ease.Linear):OnComplete(function()
                         self.msgTxt.text = ""
                         self.msgTxt.transform.localPosition = self.oriTxtVector3
                         strtScrollMsg()
                   end)
              end)
         else	   -- 滚动完成后关闭
              GameEntry.UI:CloseUIForm("ScrollMsgForm")
         end
    end
    
    strtScrollMsg()
end

function ScrollMsgForm:OnClose()
    self = ScrollMsgForm
    if CS.DG.Tweening.DOTween.IsTweening(self.msgTxt.transform) then -- 关闭时要停止动作,同时清空消息队列
        CS.DG.Tweening.DOTween.Kill(self.msgTxt.transform.name)
    end
    self.msgInfoArr = {}
end
2.3、效果展现

使用时,只需要,传入参数就可以了

GameEntry.UI:OpenUIForm(“ScrollMsgForm”,{content})

在这里插入图片描述

3、结束语


The End
  好了,今天的分享就到这里,如有不足之处,还望大家及时指正,随时欢迎探讨交流!!!


喜欢的朋友们,请帮顶、点赞、评论!您的肯定是我写作的不竭动力!

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
Unity实现跑马灯效果,可以使用UI组件中的Text组件,结合代码控制实现文字的滚动。 具体实现步骤如下: 1. 创建一个空的GameObject,命名为MarqueeText。 2. 在MarqueeText下创建一个Text组件,并设置好文字内容、字体大小、颜色等。 3. 在MarqueeText下再创建一个空的GameObject,命名为Content,用于容纳Text组件。 4. 将Text组件拖拽到Content下,调整Content的位置和大小,使Text显示在Content的左边。 5. 编写脚本MarqueeText.cs,用于控制Text的滚动。代码如下: ```csharp using UnityEngine; using UnityEngine.UI; public class MarqueeText : MonoBehaviour { public float speed = 50f; // 滚动速度 private RectTransform contentRect; // Content的RectTransform组件 private Text text; // Text组件 private float textWidth; // Text的宽度 private float contentWidth; // Content的宽度 void Start() { contentRect = transform.Find("Content").GetComponent<RectTransform>(); text = transform.Find("Content/Text").GetComponent<Text>(); textWidth = text.preferredWidth; contentWidth = contentRect.rect.width; } void Update() { contentRect.localPosition -= new Vector3(speed * Time.deltaTime, 0, 0); if (contentRect.localPosition.x <= -textWidth) { contentRect.localPosition += new Vector3(contentWidth + textWidth, 0, 0); } } } ``` 6. 将MarqueeText.cs挂载到MarqueeText对象上,并设置好速度。 7. 运行程序,就可以看到文字在Content中滚动了。 以上就是实现Unity跑马灯效果的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

对酒当歌﹏✍

您的鼓励是我写作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值