Unity 实现字幕打字效果

Text文本打字效果,TextMeshPro可以对应参考,差距不大,改改参数名就能用。改脚本原本被我集成到其他的程序集中,现在已经分离。

效果

请添加图片描述

实现功能

1.能够设置每行能够容纳的字数和允许的冗余
2.打字效果
3.每行打完上移
4.开头进入,结束弹出
5.行居中

脚本使用

请添加图片描述
请添加图片描述

属性解释
TypingSpeed打字速度(.s 每过多少时间打一个)
RowShowMax一行显示的最大值
AllowRedundancy每行能够允许的冗余
IsUpdateText更新文本,默认不启动,勾选点击运行就更新
Text挂载text文本
OffsetY对每行上移的补偿
SaveMarqueeoriginPosition保存字幕整体的初始位置
TextCloseDelayTime字幕消失的时间(Obsolete)
BottomShow需要挂载下方显示的整体
函数功能
UpdateText更新文本,需要再Update中调用
OnFinish更新完成,更新文本完成后调用的函数
OnTextUpdate(string)文本更新,在打字过程中如果发生文本更新需要调用的方法
OnTextReset文本重置


设置

** 1.物体设置 **
请添加图片描述

** 2.text文本设置 **
请添加图片描述
1.需要文字的size(如果有外描边的话)来计算字占据的行宽,来决定每行上移的距离
2.文本每行居中,但定格显示

代码

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;namespace YBZ {public class TypewriterEffect : MonoBehaviour {// 测试文本private readonly string text_test = "SVN中我需要维护的东西Scene; Scripts/Engine/WSC SteamingAsset/2DPivots.json Editor/WSCPivotEditor.cs \n 下方提示";[Header("文本显示"), Space(10)]public float typingSpeed = 0.2f; // 打字速度public int rowShowMax = 25; // 一行最大显示数量public int allowRedundancy = 6; // 允许的冗余数量public bool isUpdateText = false; // 是否播放public Text text; // 底部字幕[Range(-25, 25), Space(5)]public int offsetY = -3; // 第一行Y轴补偿public Vector3 saveMarqueeOriginPostion = new Vector3(0, -63, 0); // 下方字幕的原初位置private float textTimeCount = 0; // 更新用的计时器private string word = ""; //保存字幕private int currentPos = 0; // 打字字符索引private int LineBreakCount = 0; // 换行符计数private Vector3 saveTextLocatePostion;  // 用于保存TextUI位置private bool isOriginPosition = true;void Update() {UpdateText();if (Input.GetMouseButtonDown(0)) {OnTextUpdate(text_test);}}// 文本更新private void UpdateText() {if (!isUpdateText) {return;}// 检查字幕是否位于原初位置if (isOriginPosition) {isOriginPosition = !isOriginPosition;BottomShow.transform.DOLocalMove(Vector3.zero, 1.0f);}BottomShow.SetActive(true);if (saveTextLocatePostion == Vector3.zero) {saveTextLocatePostion = text.rectTransform.localPosition;}if (word == "") {word = text.text;}textTimeCount += Time.deltaTime;if (textTimeCount > typingSpeed) {textTimeCount = 0;currentPos++;if (currentPos >= word.Length) {Debug.Log("播放完成");OnFinish();return;}text.text = word[..currentPos];//刷新文本显示内容if (word[currentPos - 1] == '\n') {Debug.Log("发现换行符");LineBreakCount++;// 每次遇到一个换行符就上移25个单位if (LineBreakCount == 1) {text.rectTransform.DOLocalMoveY(text.rectTransform.localPosition.y + 25 + offsetY, 1f);} else if (LineBreakCount != 1) {text.rectTransform.DOLocalMoveY(text.rectTransform.localPosition.y + 25, 1f);}}// 每次处理行超限int lineCount;if (LineBreakCount == 0) {lineCount = text.text.Length;} else {lineCount = text.text[text.text.LastIndexOf('\n')..].Length;}// 行超限if (lineCount > rowShowMax + allowRedundancy) {word = text.text + '\n' + word[text.text.Length..];}}}[Header("下方显示延迟消失的所需要的时间")]public float textCloseDelayTime = 2.0f;/// <summary>/// 下方提示游戏物体,在使用前预加载/// </summary>public GameObject BottomShow;public IEnumerator IE_TextCloseDelayTime(float time) {yield return new WaitForSeconds(time);BottomShow.SetActive(false);Debug.Log("下方显示已关闭");}public IEnumerator IE_OnTextReset(float time) {yield return new WaitForSeconds(time);OnTextReset();Debug.Log("文本恢复默认");isOriginPosition = true;BottomShow.transform.DOLocalMove(saveMarqueeOriginPostion, 1.0f);}// 文本更新完成 , 一旦确认关闭就不要再更新文本, 否侧会出现逻辑错误,如若在播放完毕后更新文本一定要在下方显示关闭后, 字幕回滚的时候不能更新文本.private void OnFinish() {isUpdateText = false;// 完成之后下方显示 延迟关闭, 位置回调// StartCoroutine(IE_TextCloseDelayTime(textCloseDelayTime));// 延迟文本重置位置StartCoroutine(IE_OnTextReset(textCloseDelayTime));text.rectTransform.DOLocalMove(saveTextLocatePostion + new Vector3(0, offsetY, 0), textCloseDelayTime);}// 文本更新, 一旦更新就是确定要开始播放(╯‵□′)╯︵┻━┻(你更新不是为了播放?)private void OnTextUpdate(string newtext) {text ??= GameObject.Find("字幕文字").gameObject.GetComponent<Text>();OnTextReset();word = newtext;// StartCoroutine(IE_OnTextReset(0.5f));BottomShow.SetActive(true);isUpdateText = true;}// 文本恢復默认: 索引为0, 换行符统计为0, LocalPostion恢复, 文本置空private void OnTextReset() {if (saveTextLocatePostion == Vector3.zero) {saveTextLocatePostion = text.rectTransform.localPosition;}text.rectTransform.localPosition = saveTextLocatePostion;text.text = "";LineBreakCount = 0;currentPos = 0;}// 初始化public void Init() {Debug.Log("文本更新初始化完成");}public void UnInit() {Debug.Log("文本控制结束");}private void OnDestroy() {UnInit();}}
}

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

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

相关文章

真我V3 5G(RMX2200 RMX2201)解锁刷机全过程

安卓系统新Rom包为GSI&#xff0c;更具有通用性&#xff0c;可以比较放心刷。 原厂系统垃圾多、广告多&#xff0c;甚至热点功能不支持ipv6&#xff0c;严重偏离热点机的定位。 主要参考 https://www.bilibili.com/read/cv20730877/https://www.bilibili.com/read/cv2073087…

Oracle-expdp报错ORA-39077、06502(Bug-16928674)

问题: 用户在使用expdp进程导出时&#xff0c;出现队列报错ORA-39077、ORA-06502 ORA-31626: job does not exist ORA-31638: cannot attach to job SYS_EXPORT_SCHEMA_01 for user SYS ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95 ORA-06512: at "SYS.KUPV$…

uni-app离线打包高德地图导入android studio不能正常显示

本人使用的uni-app SDK版本&#xff1a;Android-SDK3.8.7.81902_20230704 1.导入以上文件&#xff0c;依赖已经自动添加了 2.确保这个正常引入 3.修改AndroidMainifest.xml,添加自己的密钥

MyBatis关联查询

文章目录 前言多对一关联 association一对多关联 collectionresultMap元素 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 关联查询是指在一个查询中同时获取多个表中的数据&#xff0c;将它们结合在一起进行展示。 关联表需要两个及以上的表 数据库代…

Stable Diffusion教程(7) - PS安装AI绘画插件教程

配套教程视频&#xff1a;https://v.douyin.com/Uyux9F6/ 1. 前置条件 安装了stable diffusion 还没安装的从知识库安装 阿超的AI绘画知识库 语雀 安装了ps2023 还没安装的从网盘下载Win版 PS 2023【必须win10、11】.rar官方版下载丨最新版下载丨绿色版下载丨APP下载-12…

Docker极速安装Jenkins

安装 Jenkins 是一个常见的任务&#xff0c;使用 Docker 进行安装可以简化该过程并确保环境一致性。以下是在 Docker 中安装 Jenkins 的详细步骤&#xff1a; 安装 Docker: 首先&#xff0c;请确保您已在目标机器上安装了 Docker。根据您的操作系统&#xff0c;可以在 Docker 官…

revit建模理解

关于Revit族的理解 Revit 和族术语实心和空心形状几何图形类型 Revit 和族术语 图元 - Revit Architecture 项目中的任何内容。&#xff08;斜体图元可在族编辑器中创建和编辑。&#xff09; 模型图元 - 代表建筑的实际几何图形的内容。 主体图元 - 可以接收/支持其他模型图元…

通话降噪算法在手机和IOT设备上的应用和挑战

随着电子产品的升级换代&#xff0c;用户对通话质量的要求也越来越高。通话降噪算法对通话质量起到了关键核心的作用。计算资源的提升使得深度学习模型在便携式的低功耗芯片上面跑起来了&#xff0c;器件成本降低让IoT设备开始使用骨导传感器&#xff0c;&#xff0c;那怎么样才…

【博客690】监控进程的major page faults和minor page faults

监控进程的major page faults和minor page faults 场景 有时候遇到机器没有性能瓶颈&#xff0c;但是进程出现性能瓶颈&#xff0c;这时候往往需要进程级别的监控 监控手段&#xff1a;process_exporter https://github.com/ncabatoff/process-exporter 监控相关指标&#xff…

HTTP——九、基于HTTP的功能追加协议

HTTP 一、基于HTTP的协议二、消除HTTP瓶颈的SPDY1、HTTP的瓶颈Ajax 的解决方法Comet 的解决方法SPDY的目标 2、SPDY的设计与功能3、SPDY消除 Web 瓶颈了吗 三、使用浏览器进行全双工通信的WebSocket1、WebSocket 的设计与功能2、WebSocket协议 四、期盼已久的 HTTP/2.01、HTTP/…

Maven发布项目到Nexus私服

项目pom配置 在项目pom.xml中文件中的仓库配置&#xff0c;Nexus私服如何搭建在这里不介绍了可自行百度。 <distributionManagement><repository><id>releases</id><name>Nexus Release Repository</name><url>http://私服地址:34…

CS61B Spring 2021 proj2 gitlet

Gitlet 项目简介整体结构对象概念&#xff08;object concept&#xff09;追踪文件&#xff08;track file&#xff09;分支管理&#xff08;branch management&#xff09;持久化目录结构&#xff08;folder structure&#xff09; 命令功能与具体实现initaddcommitrmloggloba…

深入探索Python数据容器:绚丽字符串、神奇序列切片与魔幻集合奇遇

一 数据容器&#xff1a;str(字符串) 1.1 字符串初识 字符串也是数据容器的一员&#xff0c;字符串是一种数据容器&#xff0c;用于存储和处理文本数据。字符串是字符的容器&#xff0c;一个字符串可以存放任意数量的字符&#xff0c;可以包含字母、数字、标点符号、空格等字…

微信小程序开发【从0到1~入门篇】2023.08

一个小程序主体部分由三个文件组成&#xff0c;必须放在项目的根目录&#xff0c;如下&#xff1a; 文件必须作用app.js是小程序逻辑app.json是小程序公告配置app.wxss否小程序公告样式表 3. 小程序项目结构 一个小程序页面由四个文件组成&#xff0c;分别是&#xff1a; 文…

Swintransformer模型的优化

SwinTransformer模型优化 文章目录 SwinTransformer模型优化1.SwinTransformer概述2.性能瓶颈分析3.模型优化3.1.transpose消除3.2.更好的layergroup3.1.1.SliceOp3.1.2.SqueezeOp3.1.3.weight切分 4.优化效果 1.SwinTransformer概述 自从Transformer在NLP任务上取得突破性的进…

20天突破英语四级高频词汇——第②天

2&#xfeff;0天突破英语四级高频词汇~第2天加油(ง •_•)ง&#x1f4aa; &#x1f433;博主&#xff1a;命运之光 &#x1f308;专栏&#xff1a;英语四级高频词汇速记 &#x1f30c;博主的其他文章&#xff1a;点击进入博主的主页 目录 2&#xfeff;0天突破英语四级高…

Bert详细学习及代码实现详解

BERT概述 BERT的全称是Bidirectional Encoder Representation from Transformers&#xff0c;即双向Transformer的Encoder&#xff0c;因为decoder是不能获要预测的信息的。在大型语料库&#xff08;Wikipedia BookCorpus&#xff09;上训练一个大型模型&#xff08;12 层到 …

【基础IO】文件系统 {磁盘的物理结构,存储结构,逻辑结构;CHS 和 LBA 寻址方式;磁盘分区和块组;文件inode;软硬链接}

文件系统 文件分为&#xff1a; 内存文件&#xff1a;被进程打开的文件&#xff0c;文件被加载到内存中供进程快速读写。磁盘文件&#xff1a;没有被打开的文件&#xff0c;保存在磁盘上。磁盘文件被分门别类的存储和管理&#xff0c;用于支持更好的存取。 提示&#xff1a; …

华为发布数字资产继承功能

在华为开发者大会2023&#xff08;HDC.Together&#xff09;上&#xff0c;华为常务董事、终端BG CEO、智能汽车解决方案BU CEO余承东正式发布了数字资产继承功能&#xff0c;HarmonyOS提供了安全便捷的数字资产继承路径。 在鸿蒙世界中&#xff0c;我们每个人在每台设备、应用…

复原 IP 地址——力扣93

文章目录 题目描述回溯题目描述 回溯 class Solution{public:static constexpr int seg_count=4<