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

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

相关文章

springboot(1)

精要&#xff1a; 自动配置&#xff1a;针对很多Spring应用程序常见的应用功能&#xff0c;Spring Boot能自动提供相关配置。 起步依赖&#xff1a;告诉Spring Boot需要什么功能&#xff0c;它就能引入需要的库。 命令行界面&#xff1a;这是Spring Boot的可选特性&#xff0…

嵌入式开发学习(STC51-18-LCD液晶显示)

内容 在LCD1602液晶上显示字符信息&#xff1b; LCD1602介绍 简介 1602液晶也叫1602字符型液晶&#xff0c;它能显示2行字符信息&#xff0c;每行又能显示16个字符&#xff1b; 它是一种专门用来显示字母、数字、符号的点阵型液晶模块&#xff1b; 它是由若干个5x7或者5x…

座舱开发的“道”与“术”

前言&#xff1a; 近年来&#xff0c;随着汽车“新四化”浪潮的兴起&#xff0c;软件定义已成为产业共识&#xff0c;将深度参与到整个汽车的定义、开发验证销售以及服务全过程。一方面确保软件可升级&#xff0c;跨车型、软件甚至跨车企软件重用。另一方面对于硬来讲&#xf…

任务 13、MidJourney种子激发极致创作,绘制震撼连贯画作

13.1 任务概述 通过本次实验任务&#xff0c;学员将深入了解Midjourney种子的概念和重要性&#xff0c;以及种子对生成图像的影响。他们将学会在Midjourney平台中设置种子值并调整其参数&#xff0c;以达到所需的效果。此外&#xff0c;任务还详细介绍了Midjourney V4.0版本中…

UNIX网络编程——UDP协议,CS架构

目录 一.socket创建通信的套接字 二.IPv4地址结构 三.通用地址结构 四. 两种地址结构的使用场合 五.sendto发送数据 六.bind固定地址信息​编辑 七.recvfrom接受UDP的消息​编辑 一.socket创建通信的套接字 二.IPv4地址结构 三.通用地址结构 四. 两种地址结构的使用场合…

【Linux】结合Python 简易实现监控公司网站,邮件发送异常

目录 背景 实现思路 邮件4小时内只会发送一次&#xff0c;如果执行了发送邮件的脚本&#xff0c;就使用sed命令将对应的调用代码置为无效 请求脚本 Python邮件发送脚本 定时任务设置 恢复邮件发送能力脚本 资料获取方法 背景 由于一些原因&#xff0c;博主负责测试的网…

入门Echarts数据可视化:从基础到实践

目录 引言数据可视化的重要性Echarts资源与拓展 Echarts简介及开发准备什么是EchartsEcharts的特点与优势安装Echarts引入Echarts库 第一个图表使用Echarts绘制一个简单的柱状图数据准备与图表配置数据格式要求图表标题与标签设置 实践与性能优化提升图表渲染性能的技巧响应式设…

多态总结

什么是多态&#xff1f; 所谓多态&#xff0c;就是同一个操作&#xff0c;作用在了不同的对象上&#xff0c;就会有不同的解释&#xff0c;进而产生不同的执行结果。使用时&#xff0c;是采用父类指针指向子类对象的方法。其中&#xff0c;重载和重写是常见的实现多态的手段。…

深入理解机器学习与极大似然之间的联系

似然函数&#xff1a;事件A的发生含着有许多其它事件的发生。所以我就把这些其它事件发生的联合概率来作为事件A的概率&#xff0c;也就是似然函数。数据类型的不同&#xff08;离散型和连续性&#xff09;就有不同的似然函数 极大似然极大似然估计方法&#xff08;Maximum Li…

sql server 删除指定字符串

replace方法 update #test set FIVCODEreplace(FIVCODE,440,) WHERE SOURCEFENTRYID140728

无数资深果粉称之为 Mac 装机必备软件的 ——CleanMyMac X

它就是被无数资深果粉称之为 Mac 装机必备软件的 ——CleanMyMac X。或许你没用过它&#xff0c;但是大概率你身边一定有它的资深用户&#xff0c;作为 MacPaw 旗下的老牌清理软件&#xff0c;在全球已经拥有超过 2500 万次的下载量。 它有着五大强悍的功能&#xff0c;可以帮…

浅谈智慧消防助力现代社会火灾防控

安科瑞 华楠 摘 要&#xff1a;随着我国经济水平的不断提高&#xff0c;科学技术取得了长足进步。科学技术的进步推动着社会不断前进&#xff0c;改变了各行各业的人们的生活。随着各种新型的技术尤其是人工智能技术的出现&#xff0c;社会进入了智能化时代。消防作为维护我们…

淘宝整店商品如何批量获取?获取淘宝店铺所有商品接口item_search_shop

在竞争日益激烈的电商行业&#xff0c;不少商家出于以下的考虑&#xff0c;想要实现一键批量获取淘宝店铺的所有商品。 竞争分析&#xff1a;通过获取某个店铺内的所有商品信息&#xff0c;可以对竞争对手的产品进行全面的了解和分析。可以了解到对手的产品种类、价格、销量等情…

【福建事业单位-资料分析】01 速算技巧-基期与现期

【福建事业单位-资料分析】01 速算技巧-基期与现期 一、速算技巧&#xff08;基于选项的速算&#xff09;1.1 计算类别——截位直除练习总结 二、速算技巧-比较类-分数比较2.1 一大一小&#xff08;一大/一小&#xff09;2.2 同大同小①分子分母都变大&#xff0c;保留两位直接…

LVS工作环境配置

一、LVS-DR工作模式配置 模拟环境如下&#xff1a; 1台客户机 1台LVS负载调度器 2台web服务器 1、环境部署 &#xff08;1&#xff09;LVS负载调度器 yum install -y ipvsadm # 在LVS负载调度器上进行环境安装 ifconfig ens33:200 192.168.134.200/24 # 配置LVS的VIP…

Idea配置Scala开发环境

1.首先安装scala插件&#xff1a; File--->Setting---->plugins,在输入框中输入scala&#xff0c;然后点击“Install”即可安装scala&#xff0c;需要稍微等待几分钟。 2 创建项目&#xff1a; File ---->new---->project-----Maven--->Next----输入名称(test…

力扣62.不同路径(动态规划)

/*** 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。* 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。* 问总共有多少条不同的路径&#xff1f; *…

Vue2源码分析-环境搭建

安装rollup 项目初始化 npm init -y安装pnpm npm i -g pnpm安装rollup以及相关插件 pnpm i rollup rollup/plugin-babel babel/core babel/preset-env --save-dev在根目录创建rollup.config.js文件&#xff0c;并且配置如下 import babel from "rollup/plugin-babel…

web前端之CSS操作

文章目录 一、CSS操作1.1 html元素的style属性1.2 元素节点的style属性1.3 cssText属性 二、事件2.1 事件处理程序2.1.1 html事件2.1.2 DOM0事件&#xff08;适合单个事件&#xff09;2.1.3 DOM2事件&#xff08;适合多个事件&#xff09; 2.2 事件之鼠标事件2.3 事件之Event事…

Dubbo+Zookeeper使用

说明&#xff1a;Apache Dubbo 是一款 RPC 服务开发框架&#xff0c;用于解决微服务架构下的服务治理与通信问题&#xff0c;官方提供了 Java、Golang 等多语言 SDK 实现。 本文介绍Dubbo的简单使用及一些Dubbo功能特性&#xff0c;注册中心使用的是ZooKeeper&#xff0c;可在…