如何让Roblox中的TextLabel平滑地从右向左重复滚动?
Roblox TextLabel 平滑循环滚动实现方案
问题分析
- 你原代码用
while wait()循环固定步长修改位置,这种方式依赖帧率,帧率波动时会出现卡顿 - 直接重置位置会导致文本突然跳变,破坏平滑滚动的连续性
方案一:无缝克隆文本滚动(推荐)
通过克隆一个完全相同的TextLabel,让两个文本连续滚动,当第一个完全移出左边缘时,将其重新定位到第二个文本右侧,实现无间断的平滑滚动效果。
local TweenService = game:GetService("TweenService") local textLabel = script.Parent.TextLabel local container = script.Parent -- 假设TextLabel的父级是显示容器 -- 克隆文本标签,同步所有属性 local clonedLabel = textLabel:Clone() clonedLabel.Parent = container clonedLabel.Position = UDim2.new(1, 0, textLabel.Position.Y.Scale, textLabel.Position.Y.Offset) -- 定义补间参数:线性动画保证匀速,时间控制滚动速度 local tweenInfo = TweenInfo.new( 10, -- 滚动一次的时长(秒),值越小速度越快 Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, -1, -- 无限重复 false, 0 ) -- 生成滚动目标位置:向左移动自身宽度的距离 local function getScrollGoal(label) return { Position = UDim2.new(-label.Size.X.Scale, 0, label.Position.Y.Scale, label.Position.Y.Offset) } end -- 创建并启动补间,克隆标签延迟一半时长启动,保证衔接自然 local tween1 = TweenService:Create(textLabel, tweenInfo, getScrollGoal(textLabel)) local tween2 = TweenService:Create(clonedLabel, tweenInfo, getScrollGoal(clonedLabel)) tween1:Play() task.delay(tweenInfo.Time / 2, function() tween2:Play() end) -- 补间完成后重置位置到右侧,循环滚动 tween1.Completed:Connect(function() textLabel.Position = UDim2.new(1, 0, textLabel.Position.Y.Scale, textLabel.Position.Y.Offset) tween1:Play() end) tween2.Completed:Connect(function() clonedLabel.Position = UDim2.new(1, 0, clonedLabel.Position.Y.Scale, clonedLabel.Position.Y.Offset) tween2:Play() end)
方案二:单文本平滑重置补间
如果不想克隆文本,可以通过监听补间完成事件,用瞬时补间实现位置重置,避免直接修改Position导致的跳变。
local TweenService = game:GetService("TweenService") local textLabel = script.Parent.TextLabel local scrollSpeed = 10 -- 滚动一次的时长(秒) local tweenInfo = TweenInfo.new( scrollSpeed, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut ) local function startScroll() -- 计算向左滚动的目标位置 local scrollGoal = { Position = UDim2.new(-textLabel.Size.X.Scale, 0, textLabel.Position.Y.Scale, textLabel.Position.Y.Offset) } local tween = TweenService:Create(textLabel, tweenInfo, scrollGoal) tween:Play() -- 补间完成后用瞬时补间重置到右侧,继续滚动 tween.Completed:Connect(function() local resetTween = TweenService:Create(textLabel, TweenInfo.new(0), { Position = UDim2.new(1, 0, textLabel.Position.Y.Scale, textLabel.Position.Y.Offset) }) resetTween.Completed:Connect(startScroll) resetTween:Play() end) end startScroll()
关键优化点
- 使用
TweenService的线性动画,保证滚动速度均匀,不受帧率波动影响 - 无缝滚动方案通过克隆文本彻底消除重置时的跳变感
- 放弃
while wait()循环直接修改Position的方式,从根源解决帧率依赖导致的卡顿
内容的提问来源于stack exchange,提问作者Qluxp
相关产品推荐
相关产品推荐

