【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.rhkb.cn/news/343175.html

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

相关文章

关于stm32的复用和重映射问题

目录 需求IO口的复用和重映射使用复用复用加重映射 总结参考资料 需求 一开始使用stm32c8t6&#xff0c;想实现pwm输出&#xff0c;但是原电路固定在芯片的引脚PB10和PB11上&#xff0c;查看了下引脚的功能&#xff0c;需要使用到复用功能。让改引脚作为定时器PWM的输出IO口。…

golang 中的复合类型

前言 所有的api文档都可以使用bash命令 go doc 查看文档的帮助信息 从 Go 1.13 开始&#xff0c;godoc 不再随 Go 发行版一起安装&#xff0c;你需要单独安装它。 需要单独安装 1. go install golang.org/x/tools/cmd/godoclatest 2执行命令 godoc -http:1111 打开浏览器 http:…

开源代码分享(33)-基于储能电站服务的冷热电多微网系统双层优化配置

参考文献&#xff1a; [1]吴盛军,李群,刘建坤,等.基于储能电站服务的冷热电多微网系统双层优化配置[J].电网技术,2021,45(10):3822-3832.DOI:10.13335/j.1000-3673.pst.2020.1838. 1.基本原理 随着储能技术的进步和共享经济的发展&#xff0c;共享储能电 站服务模式将成为未来…

【机器学习】GPT-4中的机器学习如何塑造人类与AI的新对话

&#x1f680;时空传送门 &#x1f50d;引言&#x1f4d5;GPT-4概述&#x1f339;机器学习在GPT-4中的应用&#x1f686;文本生成与摘要&#x1f388;文献综述与知识图谱构建&#x1f6b2;情感分析与文本分类&#x1f680;搜索引擎优化&#x1f4b4;智能客服与虚拟助手&#x1…

微信小程序 npm构建+vant-weaap安装

微信小程序&#xff1a;工具-npm构建 报错 解决&#xff1a; 1、新建miniprogram文件后&#xff0c;直接进入到miniprogram目录&#xff0c;再次执行下面两个命令&#xff0c;然后再构建npm成功 npm init -y npm install express&#xff08;Node js后端Express开发&#xff…

jenkins插件之Jdepend

JDepend插件是一个为构建生成JDepend报告的插件。 安装插件 JDepend Dashboard -->> 系统管理 -->> 插件管理 -->> Available plugins 搜索 Jdepend, 点击安装构建步骤新增执行shell #执行pdepend if docker exec phpfpm82 /tmp/composer/vendor/bin/pdepe…

用C语言实现扫雷

本篇适用于C语言初学者&#xff0c;主要涉及对于函数&#xff0c;数组&#xff0c;分支循环的运用。 目录 设计思想&#xff1a; 总代码&#xff08;改进后&#xff09;&#xff1a; 运行结果展示&#xff1a; 分布介绍&#xff1a; 声明&#xff1a; 代码主体部分&#…

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript - 框选显示高亮几何对象

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript - 框选显示高亮对象 核心代码完整代码&#xff1a;在线示例 在研究 ArcGIS JSAPI RenderNode 高亮&#xff08;highlights&#xff09;FBO 的时候&#xff0c;实现了一下框选高亮几何对象&#xff0c;这里分享一下。 …

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:隧道和矿井绘图设备

RockMass 正在努力打入采矿业和隧道工程利基市场。 这家位于多伦多的初创公司正在利用 NVIDIA AI 开发一款绘图平台&#xff0c;帮助工程师评估矿井和施工中的隧道稳定性。 目前&#xff0c;作为安全预防措施&#xff0c;地质学家和工程师会站在离岩石五米远的地方&#xff0…

chrome调试手机网页

前期准备 1、 PC端安装好chrmoe浏览器 2、 安卓手机安装好chrmoe浏览器 3、 数据线 原文地址&#xff1a;https://lengmo714.top/343880cb.html 手机打开调试模式 进入手机设置&#xff0c;找到开发者模式&#xff0c;然后启用USB调试 打开PC端chrome调试功能 1、点击chr…

聚焦Cayman 环二核苷酸(CDNs)

环二核苷酸CDNs 环二核苷酸&#xff08;cyclic dinucleotides&#xff0c;CDNs&#xff09;是一类天然的环状RNA分子&#xff0c;细菌衍生的CDNs分子包括c-di-GMP、c-di-AMP和3,3-cGAMP&#xff0c;它们介导对恶性、病毒性和细菌性疾病的先天免疫的保护作用&#xff0c;并在自…

springboot古诗文学习系统的设计与实现-计算机毕业设计源码91747

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;古诗文学习系统当然也不能排除在外。古诗文学习系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&am…

跨境反向海淘系统:业务流程解析与未来发展展望

随着全球化的深入发展和互联网技术的飞速进步&#xff0c;跨境购物已经成为越来越多消费者日常生活中的一部分。在这个过程中&#xff0c;反向海淘系统以其独特的优势&#xff0c;逐渐崭露头角&#xff0c;成为跨境电商领域的新星。作为一名在跨境反向海淘系统业务中耕耘了10年…

信创国产化 | 聚铭网络携手银河麒麟完成产品兼容性互认证

在我国信创国产化战略深入推进的大背景下&#xff0c;聚铭网络与麒麟软件积极响应国家号召&#xff0c;共同致力于软件和操作系统的国产化发展。近日&#xff0c;双方宣布已完成产品兼容性互认证工作&#xff0c;这一成果标志着两家公司在信创国产化道路上迈出了坚实的一步。 …

Acrobat Pro DC 2023 for Mac/Win:全平台PDF编辑器的终极解决方案

对于需要处理PDF文档的个人和企业用户来说&#xff0c;Adobe Acrobat Pro DC 2023是一款不可或缺的工具。作为全球领先的PDF编辑器&#xff0c;Acrobat Pro DC 2023在Mac和Windows平台上提供了丰富的功能和令人印象深刻的性能&#xff0c;使其成为用户编辑、转换和管理PDF文档的…

实验9 浮动静态路由配置

--名称-- 一、 原理描述二、 实验目的三、 实验内容四、 实验配置五、 实验步骤 一、 原理描述 浮动静态路由也是一种特殊的静态路由&#xff0c;主要考虑链路冗余。浮动静态路由通过配置一条比主路由优先级低的静态路由&#xff0c;用于保证在主路由失效的情况下&#xff0c;…

商城项目【尚品汇】07分布式锁-2 Redisson篇

文章目录 1 Redisson功能介绍2 Redisson在Springboot中快速入门&#xff08;代码&#xff09;2.1 导入依赖2.2 Redisson配置2.3 将自定义锁setnx换成Redisson实现&#xff08;可重入锁&#xff09; 3 可重入锁原理3.1 自定义分布式锁setnx为什么不可以重入3.2 redisson为什么可…

华为面经整理

文章目录 实习第一面准备提问相关算法相关 第一面结果提问环节 总结 实习 第一面准备 提问相关 操作系统有哪些功能 进程管理&#xff1a; 进程调度、进程同步和通信、多任务处理 内存管理&#xff1a; 内存分配、虚拟内存技术、内存保护 文件系统管理&#xff1a; 文件存储…

数据中心网络架构设计与优化

数据中心是现代企业和组织的核心基础设施&#xff0c;它们用于存储、处理和传输大量的数据和信息。为了满足不断增长的数据需求和提供可靠的服务&#xff0c;设计和优化数据中心网络架构至关重要。 首先&#xff0c;数据中心网络架构设计需要考虑可扩展性。随着业务的增长&…

【Pycharm】功能介绍

1.Code Reformat Code 格式化代码&#xff0c;可以帮助我们去自动调整空格等&#xff0c;根据python语法规范自动调整 2.Settings 1.创建py文件默认填充模版 3.读写py文件编码格式一致性 顶部代码指定的编码方式作用&#xff1a; 可以保证python2/3解释器在读取文件的时候按…