Unity 文字显示动画(2)

news2024/11/18 15:51:18

针对第一版的优化,自动适配文字大小,TextMeshPro可以拓展各种语言。第一版字母类语言效果更好。
第一版文字预制体优化

using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

public partial class TextBeatCom
{
    List<RectTransform> m_showList = new List<RectTransform>();
    List<Animator> m_aniList = new List<Animator>();
    string m_text = string.Empty;
    int m_space = 50;
    float m_textSize = 1;

    public void Init(string text, int space = 50)
    {
        if (string.IsNullOrEmpty(text)) return;

        m_text = text;
        m_space = space;
        m_textSize = 1;
        ResetContent();
        ShowText();
    }

    void ShowText()
    {
        CreateTextItem();
        StartCoroutine(PlayAnimation());
    }

    void CreateTextItem()
    {
        float last = 0, move = 0, textLength = 0;
        int length = m_text.Length;

        for (int index = 0; index < length; index++)
        {
            var sChar = m_text[index].ToString();
            if (sChar != " ")//排除空格
            {
                float sx = 80;
                var obj = InstantiateChild(sChar, out sx);
                if (obj != null)
                {
                    textLength += sx;
                    var rt = obj.GetComponent<RectTransform>();
                    m_showList.Add(rt);
                }
            }
            else
            {
                textLength += m_space;
                m_showList.Add(null);
            }
        }

        m_textSize = (float)Screen.width / textLength;
        m_textSize = m_textSize > 1 ? 1 : m_textSize;

        for (int index = 0; index < m_showList.Count; index++)
        {
            var rt = m_showList[index];
            if (rt != null)//排除空格
            {
                //设置字体尺寸和缩放
                Vector2 size = rt.sizeDelta;
                size.x *= m_textSize;
                rt.sizeDelta = size;
                rt.localScale = Vector3.one * m_textSize;

                //设置字体间距
                move += rt.rect.width / 2 + last / 2;
                rt.anchoredPosition = new Vector2(move, 0);
                last = rt.rect.width;

                m_aniList.Add(rt.GetComponent<Animator>());
            }
            else
            {
                move += m_space;//空格
            }
        }

        if (m_showList.Count > 0 && m_showList[0] != null) move += (int)m_showList[0].rect.width >> 1;
        move = (int)move >> 1;
        for (int index = 0; index < m_showList.Count; index++)
        {
            var obj = m_showList[index];
            if (obj != null) 
            {
                var pos = obj.anchoredPosition;
                pos.x -= move;
                obj.anchoredPosition = pos;
            }
        }
    }

    Transform InstantiateChild(string sChar, out float outSX)
    {
        var child = m_xxx.transform;

        var childText = child.Find("Text");
        TextMeshProUGUI textMeshProUGUI = childText.GetComponent<TextMeshProUGUI>();
        textMeshProUGUI.text = sChar;

        childText = childText.Find("Text");
        textMeshProUGUI = childText.GetComponent<TextMeshProUGUI>();
        textMeshProUGUI.text = sChar;

        var rt = child.GetComponent<RectTransform>();
        rt.SetActive(true);

        Vector2 size = rt.sizeDelta;
        float sx = size.x;
        TMP_Text m_TextComponent = textMeshProUGUI.GetComponent<TMP_Text>();
        m_TextComponent.havePropertiesChanged = true;
        m_TextComponent.ForceMeshUpdate();

        TMP_TextInfo textInfo = m_TextComponent.textInfo;
        int characterCount = textInfo.characterInfo.Length;
        if (characterCount > 0)
        {
            //sx = textInfo.characterInfo[0].ascender * textInfo.characterInfo[0].aspectRatio - textInfo.characterInfo[0].baseLine;
            sx = textInfo.characterInfo[0].bottomRight.x - textInfo.characterInfo[0].bottomLeft.x;
        }
        size.x = sx;
        rt.sizeDelta = size;
        rt.SetActive(false);

        outSX = size.x * 1.3f;
        return GameObject.Instantiate(child, m_scroll.content.transform);
    }

    IEnumerator PlayAnimation()
    {
        yield return PlayShow();
        PlayBeat();
    }

    IEnumerator PlayShow()
    {
        int playFinishNum = 0;
        for (int i = 0; i < m_aniList.Count; i++)
        {
            var obj = m_aniList[i];
            obj.SetActive(true);
            obj.OnPlay("Show").OnComplete(() => { playFinishNum++; });
            yield return new WaitForSecondsRealtime(0.05f);
        }

        yield return new WaitUntil(() => playFinishNum >= m_aniList.Count);
    }

    void PlayBeat()
    {
        for (int index = 0; index < m_aniList.Count; index++)
        {
            var obj = m_aniList[index];
            obj.Play("Beat");
        }
    }

    void ResetContent()
    {
        for (int index = 0; index < m_scroll.content.childCount; index++)
        {
            m_scroll.content.GetChild(index).SetActive(false);
        }
    }

    public void OnClear()
    {
        for (int index = 0; index < m_showList.Count; index++)
        {
            var tran = m_showList[index];
            m_showList.Remove(tran);
            index--;
            if(tran != null) GameObject.Destroy(tran.gameObject);
        }
        m_showList.Clear();
        m_aniList.Clear();
    }
}

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

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

相关文章

CSS 三栏布局

左右两列定宽&#xff0c;中间自适应 浮动margin <style>.container {width: 500px;height: 200px;line-height: 200px;}.left {width: 100px;height: 100%;float: left;background: orange;text-align: center;}.right {width: 100px;height: 100%;float: right;back…

大模型必备算力:CPUGPU天梯图(2023年最新版)

在当今计算机世界&#xff0c;CPU、GPU和显卡的性能成为了衡量计算机性能的重要指标。今天深入了解CPU、GPU和显卡天梯图。 首先&#xff0c;CPU作为计算机的大脑&#xff0c;负责处理各种任务。它的性能主要由核心数、主频和缓存大小决定。其中&#xff0c;核心数和主频决定了…

学会使用Pandas进行数据清洗

大家好&#xff0c;如果你对数据科学感兴趣&#xff0c;那么数据清洗可能对你来说是一个熟悉的术语&#xff0c;本文将向你介绍使用Pandas进行数据清洗的过程。我们的数据通常来自多个资源&#xff0c;而且并不干净&#xff0c;它可能包含缺失值、重复值、错误或不需要的格式等…

二分查找,求方程多解

1.暴力遍历&#xff1a; 解为两位小数&#xff0c;故0.001的范围肯定可以包含&#xff08;零点存在&#xff09; 2.均分为区间长度为1的小区间&#xff08;由于两解&#xff0c;距离不小于1&#xff09;&#xff0c;一个区间最多一个解 1.防止两边端点都为解 2&…

JOSEF约瑟 JY82-III JY82-1P JY82J电压等级380V 检漏继电器 面板安装

系列型号&#xff1a; JY82A检漏继电器 JY82B检漏继电器 JY82-380/660检漏继电器 JY82-IV检漏继电器 JY82-2P检漏继电器 JY82-2/3检漏继电器 JJKY检漏继电器 JD型检漏继电器 JY82-IV;JY82J JY82-II;JY82-III JY82-1P;JY82-2PA;JY82-2PB 一、产品概述 检漏继电器 J…

GitHub和Gitee的区别以及具体使用

文章目录 GitHub和GiteeGitHub和Gitee区别GitHub的使用Gitee的使用 GitHub和Gitee GitHub和Gitee区别 速度不同&#xff1a;GitHub位于美国&#xff0c;而Gitee位于中国。这意味着在中国使用Gitee可能会有更快的访问速度和更好的稳定性。如果我们希望体验Git飞一般的速度&…

基本指令(1):操作系统/Xshell,文件,路径

一、操作系统 操作系统是一款进行软硬件资源管理的工具&#xff0c;对上提供良好、稳定的运行服务。 二、文件 1. 文件 文件内容 文件属性 2. 所有的文件操作&#xff1a; 对文件的内容进行操作 对文件的属性进行操作 三、路径 3.1 路径的概念 路径的本质是&#xff…

Transformers基本组件(一)快速入门Pipeline、Tokenizer、Model

Transformers基本组件&#xff08;一&#xff09;快速入门Pipeline、Tokenizer、Model Hugging Face出品的Transformers工具包可以说是自然语言处理领域中当下最常用的包之一&#xff0c;实现了大量的主流预训练模型架构&#xff0c;并提供了对应的与训练好的模型文件。 借助…

遗传算法求解旅行商问题(含python源代码)

目录 前言 编码初始化种群 计算适应度 选择 交叉 变异 完整代码 总结 前言 这次的算法有一点不能确定是否正确&#xff0c;希望有大佬能够批评指正。 遗传算法的一般步骤 编码初始化种群 种群&#xff08;population&#xff09;指同一时间生活在一定自然区域内&…

推荐3个好评如潮的多人协作软件!

​在当今高度互联的社会中&#xff0c;多人协作已成为团队高效工作的关键。为了更好地满足团队合作的需求&#xff0c;许多优秀的多人协作软件应运而生。 在本文中&#xff0c;我们将向大家推荐3款拥有良好口碑的多人协作软件&#xff1a;boardmix博思白板、Notion和Trello。这…

Linux_API_系列-整体概览

总论 Linux下API编程不像Windows一样&#xff0c;对每种设备和不同功能都有统一的API&#xff0c;所以有了《Windows核心编程》这种导论一类的大而全的书籍&#xff0c;整本书厚的像一块砖头。 Linux下贯彻了一贯的“一切皆文件”的宗旨&#xff0c;所以对于系统编程而言&…

Linux进程概念(下)

僵尸进程 进程内核数据结构PCB进程的代码和数据&#xff0c;都要占据内存空间&#xff0c;那么进程退出的核心工作之一&#xff1a;即将PCB和自己的代码和数据释放掉 我们创建进程的目标一定是为了完成某种任务&#xff0c;父进程/OS要知道该进程把任务完成的怎么样&#xff…

轻松实现批量转换,将JPG图片一键转换为PNG格式!

在处理大量图片时&#xff0c;将JPG格式图片转换为PNG格式可能会耗费您大量的时间和精力。为了让您的工作更加轻松&#xff0c;我们为您推出了一款高效的批量图片处理工具&#xff0c;让您能够轻松将JPG图片一键转换为PNG格式&#xff0c;提高处理效率&#xff01; 首先&#…

使用命令行cli脚手架创建uniapp项目(微信小程序、H5、APP)

除了使用HBuilderX工具可视化搭建项目外&#xff0c;DCloud官方还提供了一个脚手架用于命令行搭建项目。 uni-app项目支持 uni cli和 HBuilderX cli两种脚手架工具&#xff1a; uni cli&#xff1a;面向非HBuilderX的用户&#xff08;如习惯使用vscode/webstorm的开发者&#…

【数据结构】八大排序

目录 1. 排序的概念及其作用 1.1 排序的概念 1.2 排序运用 1.3 常见的排序算法 2. 常见排序算法的实现 2.1 插入排序 2.1.1 基本思想 2.1.2 直接插入排序 2.1.3 希尔排序&#xff08;缩小增量排序&#xff09; 2.2 选择排序 2.2.1 基本思想 2.2.2 直接选择排序 2.2…

掌握Java中的volatile关键字

高速缓存 什么是高速缓存 高速缓存&#xff08;Cache&#xff09;是一种用于存储计算机数据的临时存储设备&#xff0c;用于加速数据访问速度&#xff0c;减少对主存储器&#xff08;RAM&#xff09;或磁盘的频繁访问。高速缓存通过将最常用的数据存储在更接近CPU的位置&…

使用Perl和WWW::Mechanize库编写

以下是一个使用Perl和WWW::Mechanize库编写的网络爬虫程序的内容。代码必须使用以下代码&#xff1a;jshk.com.cn/get_proxy 首先&#xff0c;确保已经安装了Perl和WWW::Mechanize库。如果没有&#xff0c;请使用以下命令安装&#xff1a; cpan WWW::Mechanize创建一个新的Pe…

【MATLAB源码-第52期】基于matlab的4用户DS-CDMA误码率仿真,对比不同信道以及不同扩频码。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. DS-CDMA系统 DS-CDMA (Direct Sequence Code Division Multiple Access) 是一种多址接入技术&#xff0c;其基本思想是使用伪随机码序列来调制发送信号。DS-CDMA的特点是所有用户在同一频率上同时发送和接收信息&#xf…

抖音热搜榜:探索热门话题的独特魅力

在信息爆炸的时代&#xff0c;我们每天都会接收到大量的信息&#xff0c;而抖音热搜榜就像是一个窗口&#xff0c;让我们能够窥见当下最受欢迎、最具话题性的内容。作为全球最受欢迎的短视频平台之一&#xff0c;抖音凭借其海量的内容、独特的推荐算法&#xff0c;让越来越多的…