Unity 鼠标悬浮时文本滚动(Text Mesh Pro)

news2025/1/22 14:45:44

效果

请添加图片描述
直接将脚本挂载在Text Mesh Pro上,但是需要滚动的文本必须在Scroll View中,否侧会定位错误,还需要给Scroll View中看需求添加垂直或者水平布局的组件

代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using TMPro;
using UnityEngine.EventSystems;

public class TextScroll : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler {
    // TextMeshPro的文本框
    private TextMeshProUGUI text;

    private string saveStr; // 保存文本内容,可以保存,但是没有必要,需要实现动态文本
    private Vector3 savePostion; // 保存文本位置
    private Vector2 savesizeDelta; // 保存尺寸
    private float saveMoveWeight;
    private RectTransform rect; // 文本的方形转换器


    [Tooltip("开启自动权重")]
    public bool AutoMoveWeight = true;

    // 如果开启自动权重那么对该变量修改不在起作用
    [Tooltip("溢出文本移动的权重,会根据权重的值,来对溢出内容的多少进行加速")]
    public float moveWeight = 3;
    private void OnEnable() {
        text = GetComponent<TextMeshProUGUI>();
        rect = text.gameObject.GetComponent<RectTransform>();
        Init();
    }

    /// <summary>
    /// 初始化文本内容
    /// </summary>
    public void Init() {
        saveStr = text.text;
        savePostion = rect.position;
        savesizeDelta = rect.sizeDelta;
        saveMoveWeight = moveWeight;
    }
    
    private Coroutine coroutine; // 接收协程

    /// <summary>
    /// 鼠标进入
    /// </summary>
    /// <param name="eventData">传入事件数据,鼠标位置等</param>
    public void OnPointerEnter(PointerEventData eventData) 
    {
        // Debug.Log("鼠标进入开始文本滚动");
        // saveStr = text.text;

        // 是否存在截断
        float fontsLenght = CalculateTextWidth(text);
        if (fontsLenght < rect.sizeDelta.x ) return;
    
        // 处理上一次退出后未完成恢复完成就再次进入
        if (coroutine != null) {
            StopCoroutine(coroutine);
            Reset();
        }
        // 是否启动自动更新
        if (AutoMoveWeight) {
            moveWeight = (fontsLenght - rect.sizeDelta.x) / 100;
        }

        // 计算所需时间
        float sumTime = (fontsLenght - rect.sizeDelta.x) / text.fontSize / moveWeight;
        rect.sizeDelta = new Vector2(fontsLenght + 100, rect.sizeDelta.y);
        coroutine = StartCoroutine(IETextScroll(sumTime, false));
    }
   
    /// <summary>
    /// 鼠标移出
    /// </summary>
    /// <param name="eventData"></param>
    public void OnPointerExit(PointerEventData eventData) {

        // Debug.Log("text begine reset");
        // 过滤
        if (text == null || (coroutine == null && CalculateTextWidth(text) < rect.sizeDelta.x) || totalDistance == 0) return;
        if (coroutine != null) { // 文本正在向左滚动
            StopCoroutine(coroutine);
        } 
        coroutine = StartCoroutine(IETextScroll(totalTime / 3, true));
        // Reset();
    }

    /// <summary>
    /// 计算文本内容宽度
    /// </summary>
    /// <param name="text"></param>
    /// <returns></returns>
    private float CalculateTextWidth(TextMeshProUGUI text) {
        float width = text.preferredWidth;
        return width;
    }


    private float totalDistance = 0;
    private float totalTime = 0;
    /// <summary>
    /// 文本滚动的协程
    /// </summary>
    /// <param name="time">协程运行时间</param>
    /// <param name="isReset">是否是恢复时启动的协程</param>
    /// <returns></returns>
    private IEnumerator IETextScroll(float time, bool isReset) {
        // float moveSpeed = 0;

        float perDistance = 0;
        if (!isReset) {
            while (time > 0) {
                // Time.deltaTime 是一个不确定的量,需要每帧更新。
                perDistance = moveWeight * text.fontSize * Time.deltaTime;
                rect.position = new Vector3(rect.position.x - perDistance, rect.position.y);
                time -= Time.deltaTime;

                totalDistance += perDistance;
                totalTime += Time.deltaTime;
                yield return null;
            }
        } else { // 恢复

            //moveSpeed = totalDistance / time;
            //while (time > 0) {
            //    perDistance = moveSpeed * Time.deltaTime;
            //    rect.position = new Vector3(rect.position.x + perDistance, rect.position.y);
            //    time -= Time.deltaTime;
            //    yield return null;
            //}

            Reset();
        }
        // Debug.Log("移动权重: " + moveWeight + " 每次距离: " + totalDistance + " 花费时间: " + totalTime);

        yield return null;
    }

    /// <summary>
    /// 恢复
    /// </summary>
    private void Reset() 
    {
        if (text == null) return;
        // text.text = saveStr;
        rect.position = savePostion;
        rect.sizeDelta = savesizeDelta;
        moveWeight = saveMoveWeight; // 采用自动权重时会再次自动计算权重

        totalDistance = 0;
        totalTime = 0;
    }
}

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

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

相关文章

【生物信息学】使用谱聚类(Spectral Clustering)算法进行聚类分析

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 3. IDE 三、实验内容 0. 导入必要的工具 1. 生成测试数据 2. 绘制初始数据分布图 3. 循环尝试不同的参数组合并计算聚类效果 4. 输出最佳参数组合 5. 绘制最佳聚类结果图 6. 代码整合 一、实验介绍…

【BLIP/BLIP2/InstructBLIP】一篇文章快速了解BLIP系列(附代码讲解说明)

文章目录 BLIP系列1. BLIP1.1 动机1.2 整体架构1.3 损失函数1.4 Captioning and Filtering(CapFilt)1.4.1 Why&#xff1f;1.4.2 方法 2. BLIP22.1 Q-Former的设计2.2 实现功能2.2.1 图像文本检索(Image-Text Retrieval)2.2.2 图像字幕(Image Captioning)2.2.3 视觉问答(VQA)2.…

1. Flink程序打Jar包

文章目录 步骤注意事项 步骤 用 maven 打 jar 包&#xff0c;需要在 pom.xml 文件中添加打包插件依赖 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><ver…

Python绘图系统24:绘图类型和坐标映射的关系

文章目录 类别与轴数坐标类别对映射的影像绘图类别对坐标轴的影响源代码 Python绘图系统&#xff1a; 前置源码&#xff1a; Python打造动态绘图系统&#x1f4c8;一 三维绘图系统 &#x1f4c8;二 多图绘制系统&#x1f4c8;三 坐 标 轴 定 制&#x1f4c8;四 定制绘图风格 &a…

CV面试知识点总结

一.卷积操作和图像处理中的中值滤波操作有什么区别&#xff1f; 1.1卷积操作 卷积操作是一种线性操作&#xff0c;通常用于特征的提取&#xff0c;通过卷积核的加权求和来得到新的像素值。1.2中值滤波 原文&#xff1a; https://blog.csdn.net/weixin_51571728/article/detai…

英飞凌Tricore原理及应用介绍06_系统定时器(STM)模块详解

目录 1.概述2 STM外设基本介绍3. STM模块使用原理3.1 64位数据如何同步读取?3.2 比较寄存器的原理?1.概述 STM全称为System Timer即系统定时器模块,在英飞凌Tricore芯片中,每个单独的CPU操作系统中配备一个系统定时器,为其操作系统程序调度提供时钟基础,在整个大系统中,…

【day9.30】消息队列实现进程间通信

write.c linuxlinux:~/23062/930$ cat write.c #include<myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\ }while(0)typedef struct {long msgtype; //消息类型char data[1024]; //消息正文 }Msg_s;#define SIZ…

Java单链表

链表的介绍&#xff1a; 1) 链表是以节点的方式来储存的&#xff0c;是链式存储结构 2&#xff09;每个节点包含data域和next域&#xff0c;next域指向下一个节点 3&#xff09;链表内存储的元素不一定连续 4&#xff09;链表分带头节点的链表和不带头节点的链表 ​​​​ …

[论文笔记]UNILM

引言 今天带来论文Unified Language Model Pre-training for Natural Language Understanding and Generation的笔记,论文标题是 统一预训练语言模型用于自然语言理解和生成。 本篇工作提出了一个新的统一预训练语言模型(Unifield pre-trained Language Model,UniLM),可以同…

中间件漏洞靶场复现

一、简介 1.tomcat弱口令复现 通过弱口令复现的靶场复现&#xff0c;进一步熟悉了burpsuite的使用&#xff0c;冰蝎的使用以及爆破和木马生成waf上传的技术。 登陆到页面&#xff0c;先使用burpsuite对登陆进行拦截抓包&#xff0c;对参数进行修改破解爆破出密码。接着使用冰蝎…

【新书推荐】人工智能的当下,测试团队如何敏捷转型 —— 无测试组织

文章目录 〇、引子一、什么是“无测试组织”&#xff1f;二、无测试组织适用于哪些场景&#xff1f;三、无测试组织还有哪些优势或特点&#xff1f;新书推荐 —— 《**无测试组织&#xff1a;测试团队的敏捷转型** 》 〇、引子 初次看到“无测试组织”的朋友可能会觉得有标题党…

picoctf_2018_can_you_gets_me

picoctf_2018_can_you_gets_me Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)32位&#xff0c;只开了NX 拿到这么大的程序&#xff0c;直接ROPchain看看 #!/usr/bin/env python2# execve …

基于SpringBoot的校园点餐系统

基于SpringBoot的校园点餐系统的设计与实现&#xff0c;前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1a;用户、管理员 用户前台&#xff1a;…

直播协议 python 常见直播协议

1. 推流、直播 和 点播分别是什么意思&#xff1f; 推流 主播将本地视频源和音频源推送到云服务器&#xff0c;也被称为“RTMP发布”。 直播 即直接观看主播实时推送过来的音视频数据。 点播 视频源已经事先存储于云服务器之上的音视频文件&#xff0c;观众随时可以观看。 目…

手机投屏到笔记本电脑小方法

1、我们可以开启Windows自带的投影功能&#xff0c;将我们的手机和电脑连接同一个无线网络。 2、在电脑开始菜单栏里找到设置选项并打开。 3、我们进入之后找到系统选项&#xff0c;点击进去之后找到点击投影到这台电脑&#xff0c;接下来我们将默认的始终关闭的下拉选项更改为…

【ShaderLab罪恶装备卡通角色_二次元风格_“Sol Badguy“_角色渲染(第二篇)】

罪恶装备背德之炎卡通角色_二次元风格_Unity 角色渲染 角色初始效果&#xff1a;基础渲染SimpleBas 资源分析模型顶点颜色&#xff1a; 贴图资源SOL_base_基础色块效果&#xff1a;其中SOL_base_A通道的效果&#xff1a; SOL_ilm&#xff1a;如下SOL_ilm模型上区域分布- 左到右…

【Axure】元件库和母版、常见的原型规范、静态原型页面制作

添加现有元件库 点击元件库——载入 当然也可以创建元件库&#xff0c;自己画自己保存 建立京东秒杀母版 静态原型页面的制作 框架 选择以iphone8的界面大小为例&#xff0c;顶部状态栏高度为20 左侧类似于标尺&#xff0c;因为图标、文字离最左侧的间距是不一样的 信…

开绕组电机零序Bakc EMF-based无感控制以及正交锁相环inverse Park-based

前言 最近看论文遇到了基于反Park变换的锁相环&#xff0c;用于从开绕组永磁同步电机零序电压信号中提取转子速度与位置信息&#xff0c;实现无感控制。在此记录 基于零序Back EMF的转子估算 开绕组电机的零序反电动势 e 0 − 3 ω e ψ 0 s i n 3 θ e e_0-3\omega_e\psi_…

C++-哈希Hash

本期我们来学习哈希 目录 unordered系列关联式容器 unordered_map unordered_set 性能比较 哈希概念 哈希冲突 哈希函数 哈希冲突解决 闭散列 模拟实现 开散列 模拟实现 全部代码 unordered系列关联式容器 在 C98 中&#xff0c; STL 提供了底层为红黑树结构的一…

知识图谱小白入门(1):neo4j的安装与CQL的使用

文章目录 序一、安装neo4j1.1 下载neo4j1.2 安装JDK1.3 BUG&#xff1a;dbms failed to start 二、CQL语法2.1 CQL语法2.2 习题 习题答案 序 知识图谱&#xff0c;是一种实体间的信息与关系知识的网状结构&#xff0c;借用图论中点与边的概念进行组建&#xff0c;易于结构化和…