Unity Text超框 文字滚动循环显示

news2024/11/6 3:01:47

Unity Text超框 文字滚动循环显示

在这里插入图片描述

在这里插入图片描述
//container Text
在这里插入图片描述


using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;

public class AutoScrollText : MonoBehaviour
{

    private Text[] _texts = new Text[2];
    private RectTransform _container;
    private RectTransform _mask;



    [SerializeField] private string _txt; //显示文本
    [SerializeField] private float _speed = 30f; //滚动速度
    [SerializeField] private float _space; //间距

    [SerializeField] private float _overall; //字体长度
    [SerializeField] private float _overall2; //总长度
    [SerializeField] private float _leftBound = 0;// 左边界
    [SerializeField] private bool _scroll = false; //是否滚动
    private float _startTime;//开始滚动时间



    private void Awake()
    {
        _mask = this.GetComponent<RectTransform>();
        _container = transform.GetChild(0).GetComponent<RectTransform>();

        _texts[0] = _container.GetChild(0).GetComponent<Text>();
        _texts[1] = _container.GetChild(1).GetComponent<Text>();

        _container.pivot = new Vector2(0, 0.5f);
        _texts[0].rectTransform.pivot = new Vector2(0, 0.5f);
        _texts[1].rectTransform.pivot = new Vector2(0, 0.5f);
        var size = _texts[0].gameObject.GetOrAddComponent<ContentSizeFitter>();
        size.horizontalFit = ContentSizeFitter.FitMode.PreferredSize;

        size = _texts[1].gameObject.GetOrAddComponent<ContentSizeFitter>();
        size.horizontalFit = ContentSizeFitter.FitMode.PreferredSize;

    }

    private void Start()
    {
        //SetText(_txt,false);
    }

    private void FixedUpdate()
    {
        if (_scroll && Time.time > _startTime)
        {
            if (_container.localPosition.x < -10000000)
            {
                ResetContainer();
            }

            // 容器 移动
            _container.localPosition += Vector3.left * Time.fixedDeltaTime * _speed;

            //文本 位置 更新
            for (int i = 0; i < _texts.Length; ++i)
            {
                if (_texts[i].rectTransform.localPosition.x + _container.localPosition.x < _leftBound)
                {
                    SetToNextViewPos(i);
                }
            }
        }
    }


    public void StopScroll()//停止 滚动
    {
        ResetContainer(true);
    }

    public void StartScroll() //开始 滚动
    {
        ResetContainer();
    }

    public void SetText(string _txt, bool IsStopScroll = true)
    {
        this._txt = _txt;
        _texts[0].text = _txt;
        _texts[1].text = _txt;

        ResetContainer(IsStopScroll);
    }

    private void ResetContainer(bool IsStopScroll = false)//重置
    {
        _startTime = Time.time + 0.5f;
        _container.localPosition = new Vector2(_mask.rect.xMin + 5f, _container.localPosition.y);
        _texts[0].rectTransform.localPosition = new Vector2(0, _texts[0].rectTransform.localPosition.y);

        LayoutRebuilder.ForceRebuildLayoutImmediate(_texts[0].rectTransform);

        if (!IsStopScroll && _texts[0].rectTransform.rect.width > _mask.rect.width)
        {
            var relative = new Vector2(-_texts[0].rectTransform.rect.width + _mask.rect.min.x, _mask.rect.min.y);
            _leftBound = relative.x;
            _overall = _space + _texts[0].rectTransform.rect.width;
            _overall2 = _overall * 2;
            _texts[1].rectTransform.localPosition = _texts[0].rectTransform.localPosition + Vector3.right * _overall;
            _scroll = true;
            _texts[1].gameObject.SetActive(true);
        }
        else
        {
            _texts[1].gameObject.SetActive(false);
            _scroll = false;
        }
    }

    private void SetToNextViewPos(int index)//文本位置 交替
    {
        var count = Mathf.FloorToInt(-_container.localPosition.x / _overall2);
        var len = (-_container.localPosition.x) % _overall2;
        var x = len > _overall ? _overall2 * (count + 1) : _overall2 * count;
        x += index * _overall;

        _texts[index].rectTransform.localPosition = new Vector2(x, _texts[index].rectTransform.localPosition.y);
    }
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1406872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目难点和优化

难点: 对于同一个位置百度地图定位的经纬度和腾讯地图定位的经纬度不一样&#xff1f; 解决&#xff1a;由于两者所用的算法不同&#xff0c;计算出来的经纬度也是不一样的&#xff0c;将百度地图的经纬度转换成腾讯地图的经纬度/腾讯的经纬度转化百度的经纬度 export functi…

【超简版,代码可用!】【0基础Python爬虫入门——下载歌曲/视频】

安装第三方模块— requests 完成图片操作后输入&#xff1a;pip install requests 科普&#xff1a; get:公开数据 post:加密 &#xff0c;个人信息 进入某音乐网页&#xff0c;打开开发者工具F12 选择网络&#xff0c;再选择—>媒体——>获取URL【先完成刷新页面】 科…

环保投入超20亿,齐鲁制药集团争做绿色制药标杆

近期&#xff0c;由人民日报社指导、人民网主办的2023人民企业社会责任荣誉盛典暨第十八届人民企业社会责任奖颁奖活动在京举行&#xff0c;齐鲁制药集团荣获“人民企业社会责任奖绿色发展奖”。多年来&#xff0c;齐鲁制药深入践行“绿水青山就是金山银山”理念&#xff0c;积…

【Linux】Linux进程间通信

Linux进程间通信 一、进程间通信介绍1、概念2、进程间通信目的3、进程间通信的本质4、进程间通信分类 二、管道1、什么是管道2、匿名管道&#xff08;1&#xff09;匿名管道原理&#xff08;2&#xff09;pipe函数&#xff08;3&#xff09;匿名管道的使用步骤i、父进程调用pip…

SUSE Linux 12 SP5 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

idea中debug Go程序报错error layer=debugger could not patch runtime.mallogc

一、问题场景 在idea中配置了Go编程环境&#xff0c;可以运行Go程序&#xff0c;但是无法debug&#xff0c;报错error layerdebugger could not patch runtime.mallogc: no type entry found, use ‘types’ for a list of valid types 二、解决方案 这是由于idea中使用的d…

定向减免!函数计算让 ETL 数据加工更简单

业内较为常见的高频短时 ETL 数据加工场景&#xff0c;即频率高时延短&#xff0c;一般费用大头均在函数调用次数上&#xff0c;推荐方案一般为攒批处理&#xff0c;高额的计算成本往往令用户感到头疼&#xff0c;函数计算推出定向减免方案&#xff0c;让 ETL数据加工更简单、更…

一篇文章带你搞懂非关系型数据库MongoDB

目录 一、引言 二、核心概念 三、使用场景 四、最佳实践 五、总结 一、引言 随着互联网技术的快速发展&#xff0c;大数据和云计算的普及&#xff0c;传统的关系型数据库在处理海量数据和高并发请求时逐渐显得力不从心。为了满足这些新的需求&#xff0c;非关系型数据库应…

MySQL45道练习题

作业需要数据表SQL语句已给 1. 查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数 select * from Student RIGHT JOIN (select t1.SId, class1, class2 from(select SId, score as class1 from sc where sc.CId 01)as t1, (select SId, score as …

鸿蒙 HarmonyOS ArkTS 点击事件,获取被点击对象的的位置

EntryComponentstruct Page {State screenX:number 0State screenY:number 0State X:number 0State Y:number 0State timestamp:number 0build () {Row () {Column(){Text(应用窗口左上角的X坐标: this.screenX).fontColor(Color.White).margin({bottom:20})Text(应用窗口…

Python教程91:海龟画图turtle画(三角形、正方形、五边形、六边形、圆、同心圆、边切圆,五角星,椭圆)

---------------turtle源码集合--------------- Python教程91&#xff1a;关于海龟画图&#xff0c;Turtle模块需要学习的知识点 Python源码49&#xff1a;海龟画图turtle画美国旗 Python教程48&#xff1a;海龟画图turtle画太极八卦阵 Python源码47&#xff1a;海龟画图tu…

Linux查看各端口网络带宽使用情况

1.安装iftop: yum install -y iftop 2.使用 安装好后在服务器执行iftop -i ens33 就可以查看服务器公网网卡带宽使用情况(如果只执行iftop默认检测第一块网卡使用情况&#xff0c;这样查的会是内网网卡ens33 。 iftop -i ens33 -P 显示进出子网的流量 如果您在子网中&…

聚道云连接器助力钉钉与金蝶云星辰无缝对接,实现多维度数据同步

客户介绍 某企业服务有限公司专注于为企业提供全方位、高质量的企业服务&#xff0c;致力于于企业管理咨询、企业形象策划、市场营销策划、财务管理咨询等方面。该公司拥有一支经验丰富、专业化的团队&#xff0c;他们深入了解企业需求&#xff0c;为客户提供个性化的解决方案…

Ultralist 面向技术人员的命令行任务管理系统

Ultralist CLI 是一个简单且非常快速的命令行任务管理系统。它源于大卫艾伦&#xff08;David Allen&#xff09;推广的“把事情做好”&#xff08;Getting Things Done&#xff09;理念。作者是GTD的忠实粉丝&#xff0c;每天都在使用它。作者一直在寻找一个轻量级的任务管理系…

商城系统中30分钟未付款自动取消订单怎么实现(简单几种方法)

实现以上功能 方法1&#xff1a;定时任务批量执行 写一个定时任务&#xff0c;每隔 30分钟执行一次&#xff0c;列出所有超出时间范围得订单id的列表 AsyncScheduled(cron "20 20 1 * * ?")public void cancelOrder(){log.info("【取消订单任务开始】"…

Vue 动态组件与异步组件:深入理解与全面应用

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介1. 动态组件实现原理&#xff1a;用法示例&#xff1a; 2. 异步组件实现原理&#xff1a;用法示例&#xff1a; 3. 异步组件的高级应用a. 异步组件的命名&#xff1a;b. 异步组件的加载状态管理&#xff1a; ⭐ 写在最后 ⭐ 专栏简…

常用芯片学习——HC244芯片

HC573 三态输出八路缓冲器|线路驱动器 使用说明 SNx4HC244 八路缓冲器和线路驱动器专门设计用于提高三态存储器地址驱动器、时钟驱动器以及总线导向接收器和发送器的性能和密度。SNx4HC244 器件配备两个具有独立输出使能 (OE) 输入的 4 位缓冲器和驱动器。当 OE 为低电平时&a…

1130 - Host 182.244.45,94‘ is not allowed to connect to this MySQL server

1130 - Host 182.244.45,94’ is not allowed to connect to this MySQL server MySQL错误代码 1130 表明连接 MySQL 服务器的主机被拒绝。在这个错误消息中&#xff0c;你提到的是主机 “182.244.45.94”&#xff0c;但可能有一个小错误&#xff0c;IP 地址中的逗号应该是点&…

《Linux系列》Linux虚拟机,LVM逻辑卷扩容,xfs文件系统扩容

Linux虚拟机&#xff0c;LVM逻辑卷扩容&#xff0c;xfs文件系统扩容 1 虚拟机配置介绍 在创建虚拟机的时候只给了20G磁盘空间大小&#xff0c;但是现在需求变更&#xff0c;想要增加到40G磁盘空间大小&#xff0c;所以需要通过两步扩容磁盘空间。 系统版本是Centos7 根目录…

01.Elasticsearch应用(一)

Elasticsearch应用&#xff08;一&#xff09; 1.什么是ELK ELK是一个免费开源的日志分析架构技术栈总称&#xff0c;包含三大基础组件&#xff0c;分别是Elasticsearch、Logstash、Kibana。但实际上ELK不仅仅适用于日志分析&#xff0c;它还可以支持其它任何数据搜索、分析和…