【Unity3D小功能】Unity3D中UGUI-Text实现打字机效果

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地址
  • QQ群:398291828

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

需求要实现Text的打字机效果,一看居然还没这类型的教程,遂补上。

二、实现

2-1、使用DOTween插件实现效果

using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;public class TextWriterDoTween : MonoBehaviour
{private void Start(){DoTweenText("123456", 6, () => {Debug.Log("用6秒显示6个字");});}/// <summary>/// 打字机效果显示文字/// </summary>/// <param name="text">文字内容</param>/// <param name="time">时间</param>/// <param name="action">结束后执行方法</param>void DoTweenText(string text, float time, UnityAction action){Text tmpText = transform.GetComponent<Text>();tmpText.text = string.Empty;try{tmpText.DOText(text, time, true, ScrambleMode.None, null).SetEase(Ease.Linear).OnComplete(() => { action(); });}catch (System.NullReferenceException){Debug.LogError("该对象不存在Text组件");}}
}

效果图:
在这里插入图片描述

2-2、实现Text的打字机效果

参考代码:

using System.Collections;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;/// <summary>
/// 用于Text的打字机效果组件。
/// </summary>
[RequireComponent(typeof(Text))]
public class TextWriter : MonoBehaviour
{/// <summary>/// 打字机效果状态。/// </summary>public enum TypewriterState{/// <summary>/// 已完成输出。/// </summary>Completed,/// <summary>/// 正在输出。/// </summary>Outputting,/// <summary>/// 输出被中断。/// </summary>Interrupted}/// <summary>/// 打字机效果用时/// </summary>private float useTime;/// <summary>/// 打字机效果状态。/// </summary>private TypewriterState state = TypewriterState.Completed;/// <summary>/// Text组件。/// </summary>private Text tmpText;/// <summary>/// 文本内容。/// </summary>string words;/// <summary>/// 显示间隔。/// </summary>int charsSecond;/// <summary>/// 用于输出字符的协程。/// </summary>private Coroutine outputCoroutine;/// <summary>/// 字符输出结束时的回调。/// </summary>private UnityAction outputEndCallback;void Awake(){tmpText = GetComponent<Text>();}private void Start(){OutputText("123456", 12, () => {Debug.Log("用12秒显示6个字");});}void OnDisable(){// 中断输出if (state == TypewriterState.Outputting){state = TypewriterState.Interrupted;StopCoroutine(outputCoroutine);OnOutputEnd(true);}}/// <summary>/// 输出文字。/// </summary>/// <param name="text"></param>/// <param name="onOutputEnd"></param>public void OutputText(string text, float time, UnityAction onOutputEnd = null){// 如果当前正在执行字符输出,将其中断if (state == TypewriterState.Outputting){StopCoroutine(outputCoroutine);state = TypewriterState.Interrupted;OnOutputEnd(false);}tmpText.text = text;useTime = time;outputEndCallback = onOutputEnd;words = text;// 如果对象未激活,直接完成输出if (!isActiveAndEnabled){state = TypewriterState.Completed;OnOutputEnd(true);return;}outputCoroutine = StartCoroutine(OutputText());}/// <summary>/// 以不带淡入效果输出字符的协程。/// </summary>/// <param name="skipFirstCharacter"></param>/// <returns></returns>private IEnumerator OutputText(){state = TypewriterState.Outputting;// 先隐藏所有字符tmpText.text = "";// 按时间逐个显示字符float timer = 0f;Text textInfo = tmpText;float speed = useTime / words.Length;//计算出出现文字的间隔while (charsSecond < words.Length){timer += Time.deltaTime;if (timer >= speed){timer = 0;charsSecond++;tmpText.text = words.Substring(0, charsSecond);}yield return null;}// 输出过程结束state = TypewriterState.Completed;OnOutputEnd(false);}/// <summary>/// 完成正在进行的打字机效果,将所有文字显示出来。/// </summary>public void CompleteOutput(){if (state == TypewriterState.Outputting){state = TypewriterState.Completed;StopCoroutine(outputCoroutine);OnOutputEnd(true);}}/// <summary>/// 处理输出结束逻辑。/// </summary>/// <param name="isShowAllCharacters"></param>private void OnOutputEnd(bool isShowAllCharacters){// 清理协程outputCoroutine = null;// 将所有字符显示出来if (isShowAllCharacters){tmpText.text = words;}// 触发输出完成回调if (outputEndCallback != null){var temp = outputEndCallback;outputEndCallback = null;temp.Invoke();}}
}

效果图:
在这里插入图片描述

2-3、使用TextMeshPro实现打字机效果

参考代码:

using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;namespace Tools
{/// <summary>/// 打字机效果状态。/// </summary>public enum TypewriterState{/// <summary>/// 已完成输出。/// </summary>Completed,/// <summary>/// 正在输出。/// </summary>Outputting,/// <summary>/// 输出被中断。/// </summary>Interrupted}/// <summary>/// 用于TextMeshPro的打字机效果组件。/// </summary>[RequireComponent(typeof(TextMeshProUGUI))]public class TextWriterTmp : MonoBehaviour{/// <summary>/// 打字机效果用时/// </summary>private float useTime;/// <summary>/// 打字机效果状态。/// </summary>private TypewriterState state = TypewriterState.Completed;/// <summary>/// TextMeshPro组件。/// </summary>private TMP_Text tmpText;/// <summary>/// 用于输出字符的协程。/// </summary>private Coroutine outputCoroutine;/// <summary>/// 字符输出结束时的回调。/// </summary>private UnityAction outputEndCallback;/// <summary>/// 输出文字。/// </summary>/// <param name="text"></param>/// <param name="onOutputEnd"></param>public void OutputText(string text, float time, UnityAction onOutputEnd = null){// 如果当前正在执行字符输出,将其中断if (state == TypewriterState.Outputting){StopCoroutine(outputCoroutine);state = TypewriterState.Interrupted;OnOutputEnd(false);}tmpText.text = text;useTime = time;outputEndCallback = onOutputEnd;// 如果对象未激活,直接完成输出if (!isActiveAndEnabled){state = TypewriterState.Completed;OnOutputEnd(true);return;}outputCoroutine = StartCoroutine(OutputText());}/// <summary>/// 完成正在进行的打字机效果,将所有文字显示出来。/// </summary>public void CompleteOutput(){if (state == TypewriterState.Outputting){state = TypewriterState.Completed;StopCoroutine(outputCoroutine);OnOutputEnd(true);}}private void Awake(){tmpText = GetComponent<TMP_Text>();}private void Start(){OutputText("123456", 6, () => {Debug.Log("用6秒显示6个字");});}private void OnDisable(){// 中断输出if (state == TypewriterState.Outputting){state = TypewriterState.Interrupted;StopCoroutine(outputCoroutine);OnOutputEnd(true);}}/// <summary>/// 以不带淡入效果输出字符的协程。/// </summary>/// <param name="skipFirstCharacter"></param>/// <returns></returns>private IEnumerator OutputText(bool skipFirstCharacter = false){state = TypewriterState.Outputting;// 先隐藏所有字符tmpText.maxVisibleCharacters = skipFirstCharacter ? 1 : 0;tmpText.ForceMeshUpdate();// 按时间逐个显示字符float timer = 0f;TMP_TextInfo textInfo = tmpText.textInfo;float speed = useTime / textInfo.characterCount;while (tmpText.maxVisibleCharacters < textInfo.characterCount){timer += Time.deltaTime;if (timer >= speed){timer = 0;tmpText.maxVisibleCharacters++;}yield return null;}// 输出过程结束state = TypewriterState.Completed;OnOutputEnd(false);}/// <summary>/// 设置字符的顶点颜色Alpha值。/// </summary>/// <param name="index"></param>/// <param name="alpha"></param>private void SetCharacterAlpha(int index, byte alpha){var materialIndex = tmpText.textInfo.characterInfo[index].materialReferenceIndex;var vertexColors = tmpText.textInfo.meshInfo[materialIndex].colors32;var vertexIndex = tmpText.textInfo.characterInfo[index].vertexIndex;vertexColors[vertexIndex + 0].a = alpha;vertexColors[vertexIndex + 1].a = alpha;vertexColors[vertexIndex + 2].a = alpha;vertexColors[vertexIndex + 3].a = alpha;}/// <summary>/// 处理输出结束逻辑。/// </summary>/// <param name="isShowAllCharacters"></param>private void OnOutputEnd(bool isShowAllCharacters){// 清理协程outputCoroutine = null;// 将所有字符显示出来if (isShowAllCharacters){var textInfo = tmpText.textInfo;for (int i = 0; i < textInfo.characterCount; i++){SetCharacterAlpha(i, 255);}tmpText.maxVisibleCharacters = textInfo.characterCount;tmpText.ForceMeshUpdate();}// 触发输出完成回调if (outputEndCallback != null){var temp = outputEndCallback;outputEndCallback = null;temp.Invoke();}}}
}

效果图:
在这里插入图片描述

三、后记

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏方向简介
Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。

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

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

相关文章

机器学习作业6——svm支持向量机

目录 一、理论 概念&#xff1a; 线性可分&#xff1a; 支持向量&#xff1a; 间隔&#xff1a; 目标&#xff1a; 软间隔&#xff1a; 梯度下降法&#xff1a; 别的方法&#xff1a; 拉格朗日函数&#xff1a; SMO算法&#xff1a; 核函数&#xff1a; 二、代码 …

python代码中参数的默认值

python中的函数&#xff0c;可以给形参指定默认值。 带有默认值的参数&#xff0c;可以在调用的时候不传参。 如上图所示&#xff0c;在给函数设定形参的时候可以给函数形参设定默认值&#xff0c;当然默认参数的形参应该在非默认形参的后面。 如果在调用函数的时候&#xff…

Linux云计算架构师涨薪班就业服务有哪些?

学员一站式就业服务:一次学习&#xff0c;薪资翻倍 简历制作与指导 学员在培训期间&#xff0c;人才顾问会提供简历制作和指导服务&#xff0c;帮助学员制作出一份专业、有吸引力的简历。简历是求职者给招聘单位的第一印象&#xff0c;因此非常重要 模拟面试与技巧指导 为了让…

WebGPU 引领前端未来,互动渲染如何驱动小红书业务增长?

在大前端时代&#xff0c;浏览器能力得到显著的增强&#xff0c;为前端开发带来了更多的可能性和挑战。作为一套全新的 Web API 标准&#xff0c;WebGPU 旨在提供高性能的 3D 图形和数据并行计算能力&#xff0c;其在游戏、虚拟现实、机器学习等多个行业和应用场景中展现出潜力…

嵌入式Linux系统编程 — 3.2 stat、fstat 和 lstat 函数查看文件属性

目录 1 文件有哪些属性 2 stat函数 2.1 stat函数简介 2.2 struct stat 结构体 2.3 struct timespec 结构体 2.4 示例程序 3 fstat 和 lstat 函数 3.1 fstat 函数 3.2 lstat 函数 1 文件有哪些属性 Linux文件属性是对文件和目录的元数据描述&#xff0c;包括文件类型…

30-unittest生成测试报告(HTMLTestRunner插件)

批量执行完测试用例后&#xff0c;为了更好的展示测试报告&#xff0c;最好是生成HTML格式的。本文使用第三方HTMLTestRunner插件生成测试报告。 一、导入HTMLTestRunner模块 这个模块下载不能通过pip安装&#xff0c;只能下载后手动导入&#xff0c;下载地址是&#xff1a;ht…

应用广义线性模型一|线性模型

文章目录 一、统计学及思维模式二、未知现象的数学描述三、线性模型&#xff08;一&#xff09;线性模型的定义&#xff08;二&#xff09;线性模型的参数估计&#xff08;三&#xff09;线性模型的应用&#xff08;四&#xff09;离散解释变量的设计向量构建方法 四、线性模型…

SpringAOP 常见应用场景

文章目录 SpringAOP1 概念2 常见应用场景3 AOP的几种通知类型分别有什么常见的应用场景4 AOP实现 性能监控4.1 首先&#xff0c;定义一个切面类&#xff0c;用于实现性能监控逻辑&#xff1a;4.2 定义自定义注解4.3 注解修饰监控的方法 5 AOP实现 API调用统计5.1 定义切面类&am…

深度图的方法实现加雾,Synscapes数据集以及D455相机拍摄为例

前言 在次之前&#xff0c;我们已经做了图像加雾的一些研究&#xff0c;这里我们将从深度图的方法实现加雾展开细讲 图像加雾算法的研究与应用_图像加雾 算法-CSDN博客 接下来将要介绍如何使用深度图像生成雾效图像的方法。利用Synscapes数据集&#xff0c;通过读取EXR格式的…

【实盘】第二十期:2024-06月~第一周

一、每周净值 01 CTA投资组合 CTA多品种全覆盖全天候策略2024年2月至2024年5月底实盘总收益12.753%&#xff0c;当前浮动净值为1.1407&#xff0c;当前平仓净值为1.12753。 月度最大本金回撤0.3%(资金曲线为平仓盈亏,总体回撤应加入浮动持仓的盈亏总体计算,实际当前净值见棕色…

各种空气能热泵安装图

空气能热泵安装图 循环式空气能热泵安装图 直热循环式空气能热泵安装图 泳池空气能热泵安装图 循环式水源热泵热安装系统原理图 直热循环式水源热泵安装系统图 空气水源热泵安装图

flutter as连接网易模拟器

网易模拟器下载 Mac 使用MuMu模拟器调试 Flutter开发 Android Studio 安装第三方模拟器—网易MuMu Mac 安卓Studio使用外部模拟器 Mac电脑&#xff1a;Android Studio 连接 MUMU 网易模拟器 Mac 上 Android Studio 链接网易 MuMu 模拟器调试 在 .zshrc 中设置 adb 二进制文…

重构某测试站点

一、计算校验值 校验值结果&#xff1a; 文件名称&#xff1a;培训用centos.rar&#xff0c;文件大小&#xff1a;1,335,759,953&#xff0c;MD5&#xff1a;534EC38CDA7DA2196C84AC8F6092514B&#xff0c;SHA1&#xff1a;FD35D86A27A007AE10872980C48653A110DF6067&#xf…

EverWeb 强大的零基础Mac网页设计制作软件

搜索Mac软件之家下载EverWeb 强大的零基础Mac网页设计制作软件 EverWeb 4.2是非专业网页设计师的绝佳网页制作工具&#xff0c;无需编码即可创建美观、响应迅速的网站。只需拖放自己的图像、文本和其他任何html元素到网页布局的任何位置。 EverWeb的功能特性&#xff1a; 下…

C++模板编程—学习C++类库的编程基础

课程总目录 文章目录 一、详解函数模板二、类模板三、类模板实践&#xff1a;实现向量容器vector四、理解容器空间配置器allocator的重要性 一、详解函数模板 模板的意义&#xff1a;对类型也可以进行参数化了 // 也可以用template<class T>&#xff0c;但class容易和类…

适用于 Windows 的 8 大数据恢复软件

数据恢复软件可帮助您恢复因意外删除或由于某些技术故障&#xff08;如硬盘损坏等&#xff09;而丢失的数据。这些工具可帮助您从硬盘驱动器 (HDD) 中高效地恢复丢失的数据&#xff0c;因为这些工具不支持从 SSD 恢复数据。重要的是要了解&#xff0c;您删除的数据不会被系统永…

NodeJs实现脚本:将xlxs文件输出到json文件中

文章目录 前期工作和依赖笔记功能代码输出 最近有一个功能&#xff0c;将json文件里的内容抽取到一个xlxs中&#xff0c;然后维护xlxs文件。当要更新json文件时&#xff0c;就更新xlxs的内容并把它传回json中。这个脚本主要使用NodeJS写。 以下是完成此功能时做的一些笔记。 …

【面试八股总结】内存页面置换算法

参考资料&#xff1a;小林coding、阿秀 缺页中断 在 CPU 里访问一条 Load M 指令&#xff0c;然后 CPU 会去找 M 所对应的页表项。如果该页表项的状态位是「有效的」&#xff0c;那 CPU 就可以直接去访问物理内存了&#xff0c;如果状态位是「无效的」&#xff0c;则 CPU 则会…

stanfordcorenlp+python做中文nlp任务,得到的结果中全是空字符串,而不是中文字符串

问题描述 代码&#xff1a; from stanfordcorenlp import StanfordCoreNLP import logging#中文中的应用&#xff0c;一定记得下载中文jar包&#xff0c;并标志lang‘zh’ nlp_zh StanfordCoreNLP(rD:\stanford-corenlp-full-2016-10-31, port8094, langzh,quietFalse,logg…

GiantPandaCV | 提升分类模型acc(一):BatchSizeLARS

本文来源公众号“GiantPandaCV”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;提升分类模型acc(一)&#xff1a;BatchSize&LARS 在使用大的bs训练情况下&#xff0c;会对精度有一定程度的损失&#xff0c;本文探讨了训练的b…