当前位置: 首页 > news >正文

【Unity-Lua】音乐播放器循环滚动播放音乐名

前言:Unity中UI节点

图1
图1

如上所示,一开始本来是打算用ScrollView做的,觉得直接计算对应的文本位置就行,所以没用ScrollRect来做,可以忽略Scroll,Viewport这些名字。如下图:需要在一个背景Image组件上添加上Mask组件来显示固定位置的文本显示。
在这里插入图片描述
图2

在这里插入图片描述
图3

并且需要在要显示的文本上挂载Content Size Filter组件,但是这儿会有个坑,后续会提到。
在这里插入图片描述
图4

因为需要循环滚动播放,所以需要两个文本来满足这个需求。所以图1中的MusicDuplicateText是完全复制MusicText的。具体实现过程请继续往下:

1. 刷新音乐名字信息,并初始化两个文本的位置(伪代码)

function xxxxx:RefreshMusicInfo()-- 设置音乐信息local musicInfo = xxx1self.MusicText_txt.text = xxx2self.MusicDuplicateText_txt.text = xxx2-- 更新两个文本位置-- 第一个文本x位置为0,需要设置文本锚点self.MusicText_rect.anchoredPosition = Vector2(0, self.MusicText_rect.anchoredPosition.y)-- 第二个文本x位置:第一个文本位置+文本长度+加上两个文本间隔20(可以自己选择是否要间隔)-- 这儿就是上面提到的坑,只能用preferredWidth来获取文本长度,用rect.width获取的是0self.MusicDuplicateText_rect.anchoredPosition = Vector2(self.MusicText_rect.anchoredPosition.x + self.MusicText_txt.preferredWidth + 20 , self.MusicText_rect.anchoredPosition.y)-- 这儿是我自己设置的文本长度超过显示框的长度才滚动(可以自己选择是否设置)if self.MusicText_txt.preferredWidth > self.MusicNameScroll_rect.rect.width thenself.scrollingMusic = trueend
end

注:Content Size Filter坑点:

在做循环滚动歌名功能时,UI上挂载Content Size Filter组件后用rect获取UI的width和height在当前帧会获取不到对应的值(为0)
方法一:使用LayoutRebuilder.ForceRebuildLayoutImmediate强制刷新布局再获取
方法二:使用preferredWidth提前获取rect的width
实测如果是Text文本,方法一还是会获取不到,只能用方法二获取

2. 滚动播放,实时更新文本位置

-- xxx_rect是某个gameobject身上的RectTransnform组件
function xxxxx:Update()if self.scrollingMusic == true then-- 更新第一个文本位置self.MusicText_rect.anchoredPosition = self.MusicText_rect.anchoredPosition - Vector2(50 * Time.deltaTime, 0)-- 更新第二个文本位置self.MusicDuplicateText_rect.anchoredPosition = self.MusicDuplicateText_rect.anchoredPosition - Vector2(50 * Time.deltaTime, 0)-- 如果第一个文本超出显示的区域框,将第一个文本的位置设置到第二个文本的后面,可以自己画图理解理解if self.MusicText_rect.anchoredPosition.x <= -self.MusicText_txt.preferredWidth thenself.MusicText_rect.anchoredPosition = Vector2(self.MusicDuplicateText_rect.anchoredPosition.x + self.MusicText_txt.preferredWidth + 20, self.MusicText_rect.anchoredPosition.y)end-- 这儿是因为我只设置了滚动一次,如果需要一直滚动可以将这儿改成下面注释掉的代码if self.MusicDuplicateText_rect.anchoredPosition.x <= 0 thenself.scrollingMusic = falseend-- if self.MusicDuplicateText_rect.anchoredPosition.x <= -self.MusicDuplicateText_rect.preferredWidth then-- self.MusicDuplicateText_rect.anchoredPosition = Vector2(self.MusicText_rect.anchoredPosition.x + self.MusicDuplicateText_txt.preferredWidth + 20, self.MusicDuplicateText_rect.anchoredPosition.y)-- endend
end

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【微服务】Ribbon(负载均衡,服务调用)+ OpenFeign(服务发现,远程调用)【详解】
  • 【Kubernetes】常见面试题汇总(二)
  • JVM: JDK内置命令 - JPS
  • 微信小程序-formData使用
  • 【MySQL】查询表中重复数据、模糊查询列信息、快速copy表数据(1)
  • 分布式锁-Redisson 可重入锁
  • 注意力机制的细节
  • redis群集的三种模式
  • Jenkins 通过 Version Number Plugin 自动生成和管理构建的版本号
  • crm如何做私域运营?
  • Harmony Next 文件命令操作(发送、读取、媒体文件查询)
  • 【Hot100】LeetCode—215. 数组中的第K个最大元素
  • Qt常用控件——QLineEdit
  • uts+uniapp踩坑记录(vue3项目
  • 美团面试题:生成字符串的不同方式
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 30秒的PHP代码片段(1)数组 - Array
  • ComponentOne 2017 V2版本正式发布
  • Javascript编码规范
  • Java-详解HashMap
  • leetcode386. Lexicographical Numbers
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • magento2项目上线注意事项
  • node入门
  • oschina
  • PHP的Ev教程三(Periodic watcher)
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 从0到1:PostCSS 插件开发最佳实践
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 力扣(LeetCode)21
  • 聊一聊前端的监控
  • 目录与文件属性:编写ls
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 小而合理的前端理论:rscss和rsjs
  • 延迟脚本的方式
  • 译米田引理
  • 用 Swift 编写面向协议的视图
  • postgresql行列转换函数
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​什么是bug?bug的源头在哪里?
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (30)数组元素和与数字和的绝对差
  • (4)Elastix图像配准:3D图像
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (二十三)Flask之高频面试点
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)jQuery 基础
  • (转)创业的注意事项
  • (自用)仿写程序
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .net 7 上传文件踩坑
  • .NET Core 2.1路线图