Unity 文字显示动画(2)

针对第一版的优化,自动适配文字大小,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.rhkb.cn/news/167632.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 10.0 Launcher3定制化之动态时钟图标功能实现

1.概述 在10.0的系统产品rom定制化开发中,在Launcher3中的定制化的一些功能中,对于一些产品要求需要实现动态时钟图标功能,这就需要先绘制时分秒时针表盘,然后 每秒刷新一次时钟图标,时钟需要做到实时更新,做到动态时钟的效果,接下来就来分析这个功能的实现 如图: 2.动…

LoadRunner录制脚本+编写脚本

LoadRunner安装* 为什么选择LoadRunner 1&#xff09;Jmeter没有录制功能 2&#xff09;可以设计非常非常丰富的测试场景 3&#xff09;LoadRunner能够产出非常丰富的测试报告 LoadRunner三大组件的关系 每个组件是干什么的 VUG&#xff1a;录制脚本&#xff0c;&#xff…

[CSP-S 2023] 种树 —— 二分+前缀和

This way 题意&#xff1a; 一开始以为是水题&#xff0c;敲了一个二分贪心检查的代码&#xff0c;20分。发现从根往某个节点x走的时候&#xff0c;一路走来的子树上的节点到已栽树的节点的距离会变短&#xff0c;那么并不能按照初始情况贪心。 于是就想着检查时候用线段树…

C++对象模型(19)-- 函数语义学:成员函数

1、普通成员函数的调用 1.1 调用方式的转换 为了提高普通成员函数的调用效率&#xff0c;在C中&#xff0c;对普通成员函数的调用&#xff0c;会转换成对全局函数的调用。 假如有下面所示的成员函数&#xff1a; class Test { public:int m_i;int func(int a) {m_i a;retu…

【C++】类型转换

一、C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与 接收返回值类型不一致时&#xff0c;就需要发生类型转化。 C语言中总共有两种形式的类型转换&#xff1a;隐式类型转换和显式…

【三】kubernetes kuboard部署分布式系统

#服务器 #部署 #云原生 #k8s 目录 一、前言二、搭建docker私有仓库三、系统搭建1、NFS部署1)部署nfs server &#xff08;192.168.16.200&#xff09;2)部署nfs client &#xff08;全部节点&#xff09;3)在Kuboard中创建 NFS 存储类 2、创建命名空间3、添加docker密文4、创建…

解决 Could not build wheels for pandas, which is required to install pyproject.toml-based projects

最近在学习李沐老师的深度学习的课程&#xff0c;在安装 d2l 时&#xff0c; pip install d2l0.17.6遇到了问题&#xff1a; ERROR: Could not build wheels for pandas, which is required to install pyproject.toml-based projects 由于我忘记截错误的图了&#xff0c;在论…

基于SSM的图书商城网站设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Linux下Samba服务安装及启用全攻略

Linux下Samba服务安装及启用全攻略 前言一、安装SSH Server二、安装Samba Server1.安装net-tool2.建立账号的samba3.windows通过Samba与linux共享文件4.使用远程工具登录Linux 总结 前言 提示&#xff1a;本文详解了在Linux系统下如何安装和启用Samba服务&#xff0c;涵盖了从…

5、Kafka集成 SpringBoot

SpringBoot 是一个在 JavaEE 开发中非常常用的组件。可以用于 Kafka 的生产者&#xff0c;也可以 用于 SpringBoot 的消费者。 1&#xff09;在 IDEA 中安装 lombok 插件 在 Plugins 下搜索 lombok 然后在线安装即可&#xff0c;安装后注意重启 2&#xff09;SpringBoot 环境准…

三十七、【进阶】SQL的explain

1、explain 2、基础使用 在使用explain关键字时&#xff0c;只需要在所执行语句前加上explain即可 mysql> explain select * from stu where id3; ---------------------------------------------------------------------------------------------------------- | id | s…

shell学习脚本04(小滴课堂)

他就可以直接读出来了。不需要在sh后面加参数。 可以用-s隐藏内容&#xff1a; 可以用-t进行指定几秒后显示。 -n限制内容长度。 输入到长度为5自动打印。 我们把-s放到-p后面的话&#xff1a; 这样会出错。 如果最后加5m会一直闪烁。 大家可以按照需求自行使用。

Qt第六十五章:自定义菜单栏的隐藏、弹出

目录 一、效果图 二、qtDesigner 三、ui文件如下&#xff1a; 四、代码 一、效果图 二、qtDesigner 原理是利用属性动画来控制QFrame的minimumWidth属性。 ①先拖出相应的控件 ②布局一下 ③填上一些样式 相关QSS background-color: rgb(238, 242, 255); border:2px sol…

雪数据同化系统Snow Data Assimilation System数据集

雪数据同化系统&#xff08;SNODAS&#xff09; 雪资料同化系统&#xff08;SNODAS&#xff09;是国家水文遥感业务中心&#xff08;NOHRSC&#xff09;精心开发的综合建模和资料同化系统。其主要目标是提供高度准确的积雪和相关参数估计&#xff0c;作为水文建模和分析的重要…

如何正确维护实验室超声波清洗机

实验室一直被视作一个严谨且严肃的场所&#xff0c;在其中所做的试验都需要遵照一定流程&#xff0c;所用的设备也经过了细致化挑选&#xff0c;例如实验室超声波清洗机&#xff0c;其性能远强于普通类别的清洗机。专门负责采购的实验室人员&#xff0c;通常会对质量优服务好的…

居民小区电动汽车有序充电策略研究

摘 要&#xff1a;针对电动汽车在居民小区无序充电对电网系统产生严重隐患及充电间时过长问题&#xff0c;提出一种采用延迟充电的电动汽车有序充电控制策略&#xff0c;并在分析国内外电动汽车有序充电的研究现状后&#xff0c;设计了居民小区电动汽车有序充电策略的总体框架。…

Linux常用命令——clock命令

在线Linux命令查询工具 clock 用于调整 RTC 时间。 补充说明 clock命令用于调整 RTC 时间。 RTC 是电脑内建的硬件时间&#xff0c;执行这项指令可以显示现在时刻&#xff0c;调整硬件时钟的时间&#xff0c;将系统时间设成与硬件时钟之时间一致&#xff0c;或是把系统时间…

【网络爬虫 | Python】数字货币ok链上bitcoin大额交易实时爬取,存入 mysql 数据库

文章目录 一、网站分析二、js 逆向获取 X-Apikey三、python 调用 js 获取 X-Apikey四、python 爬虫部分五、mysql 数据库、日志、配置文件、目录结构六、结尾 一、网站分析 oklink&#xff1a;https://www.oklink.com/ btc 大额交易&#xff1a;https://www.oklink.com/btc/tx-…

初始Redis 分布式结构的发展演变

目录 Redis的特点和使用场景 分布式系统的引入 单机系统 分布式系统 应用服务器的增多&#xff08;处理更多的请求&#xff09; 数据库读写分离&#xff08;数据服务器的增多) 引入缓存 应对更大的数据量 业务拆分&#xff1a;微服务 Redis的特点和使用场景 我们先来…

Notepad++正则查询替换操作

Notepad编辑器查找功能非常强大&#xff0c;本处记录一些实战中常用到复杂查询替换操作。 注意&#xff1a;如果是重要文件&#xff0c;替换操作前最好备份&#xff1b;当前一个操作后也可以用ctrlz恢复。 查找重复行 用查找(ctrlf)功能&#xff0c;用正则表达式模式匹配。 查…