Unity TMP文字移動效果

前言

看見很多游戲有很特殊的波浪形文字效果,于是來嘗試一下控制TMP文字頂點的方式達到類似效果。

原理

掛載tmp text,在里面隨便放入非空格字符。

tmp text組件開放了textInfo接口,也就是GetComponent<TextMeshProUGUI>().textInfo可以獲取text字符串信息:

?characterInfo[i].vertexIndex用于找到這個字符起始index;meshInfo[TMP_CharacterInfo.materialReferenceIndex]用于獲取mesh信息,再進一層meshInfo.vertices即可拿到頂點信息。

我們就是強行修改vertices信息,然后調用TextMeshProUGUI.UpdateVertexData()即可完成text不同字符間的修改。

保存原始字符頂點vertices信息

//tmp組件
TextMeshProUGUI m_txtSelf = null;
//移動周期
float m_moveTotalTime = 1f;
//上下浮動幅度
float m_amplitude = 100;
Vector3[] m_rawVertex;public void Awake()
{m_txtSelf = transform.GetComponent<TextMeshProUGUI>();
}private void GetRawVertex()
{m_txtSelf.ForceMeshUpdate();if (m_txtSelf.textInfo.characterCount > 0){TMP_CharacterInfo charInfo = m_txtSelf.textInfo.characterInfo[0];TMP_MeshInfo meshInfo = m_txtSelf.textInfo.meshInfo[charInfo.materialReferenceIndex];//創建對象來保存初始值m_rawVertex = new Vector3[meshInfo.vertices.Length];for (int i = 0; i < meshInfo.vertices.Length; i++){m_rawVertex[i] = new Vector3(meshInfo.vertices[i].x, meshInfo.vertices[i].y, meshInfo.vertices[i].z);}}
}public void Start()
{GetRawVertex();
}

所有字符一起移動

用協程每隔一段時間做一次循環運動,用dotween.to附加lamda表達式來完成字符串移動:

public void Start()
{GetRawVertex();StartCoroutine(Shake());
}
public IEnumerator Shake()
{while(true){Tweener tweener = DOTween.To(() => 0f, y =>{for (int i = 0; i < m_txtSelf.textInfo.characterCount; i++){// 獲取字符信息和MeshInfoTMP_CharacterInfo currentCharInfo = m_txtSelf.textInfo.characterInfo[i];TMP_MeshInfo meshInfo = m_txtSelf.textInfo.meshInfo[currentCharInfo.materialReferenceIndex];int nextVertexIndex = meshInfo.vertices.Length;if (i < m_txtSelf.textInfo.characterCount - 1){TMP_CharacterInfo nextCharInfo = m_txtSelf.textInfo.characterInfo[i + 1];nextVertexIndex = nextCharInfo.vertexIndex;}// 獲取起始頂點索引int vertexIndex = currentCharInfo.vertexIndex;// 頂點偏移for (int j = vertexIndex; j < nextVertexIndex; j++){float yOffset = y;if (yOffset >= 0 && yOffset <= 1){meshInfo.vertices[j] = m_rawVertex[j] + Mathf.Sin(yOffset * Mathf.PI) * Vector3.up * m_amplitude;}}}m_txtSelf.UpdateVertexData();}, 2, m_moveTotalTime);yield return new WaitForSeconds(m_moveTotalTime);}
}

?效果如下顯示:

?每個字符規律跳動

就需要在y->yOffset中加入位置參數變量,用以形成類波浪效果:

float yOffset = y - (float)i / m_txtSelf.textInfo.characterCount;

?至此即可完成。

全部代碼

using System.Collections;
using UnityEngine;
using TMPro;
using DG.Tweening;public class test : MonoBehaviour
{//tmp組件TextMeshProUGUI m_txtSelf = null;//移動周期float m_moveTotalTime = 1f;//上下浮動幅度float m_amplitude = 100;Vector3[] m_rawVertex;public void Awake(){m_txtSelf = transform.GetComponent<TextMeshProUGUI>();}private void GetRawVertex(){m_txtSelf.ForceMeshUpdate();if (m_txtSelf.textInfo.characterCount > 0){TMP_CharacterInfo charInfo = m_txtSelf.textInfo.characterInfo[0];TMP_MeshInfo meshInfo = m_txtSelf.textInfo.meshInfo[charInfo.materialReferenceIndex];//創建對象來保存初始值m_rawVertex = new Vector3[meshInfo.vertices.Length];for (int i = 0; i < meshInfo.vertices.Length; i++){m_rawVertex[i] = new Vector3(meshInfo.vertices[i].x, meshInfo.vertices[i].y, meshInfo.vertices[i].z);}}}public void Start(){GetRawVertex();StartCoroutine(Shake());}public IEnumerator Shake(){yield return new WaitForSeconds(1);while (true){Tweener tweener = DOTween.To(() => 0f, y =>{for (int i = 0; i < m_txtSelf.textInfo.characterCount; i++){// 獲取字符信息和MeshInfoTMP_CharacterInfo currentCharInfo = m_txtSelf.textInfo.characterInfo[i];TMP_MeshInfo meshInfo = m_txtSelf.textInfo.meshInfo[currentCharInfo.materialReferenceIndex];int nextVertexIndex = meshInfo.vertices.Length;if (i < m_txtSelf.textInfo.characterCount - 1){TMP_CharacterInfo nextCharInfo = m_txtSelf.textInfo.characterInfo[i + 1];nextVertexIndex = nextCharInfo.vertexIndex;}// 獲取起始頂點索引int vertexIndex = currentCharInfo.vertexIndex;// 頂點偏移for (int j = vertexIndex; j < nextVertexIndex; j++){float yOffset = y - (float)i / m_txtSelf.textInfo.characterCount;if (yOffset >= 0 && yOffset <= 1){meshInfo.vertices[j] = m_rawVertex[j] + Mathf.Sin(yOffset * Mathf.PI) * Vector3.up * m_amplitude;}}}m_txtSelf.UpdateVertexData();}, 2, m_moveTotalTime);yield return new WaitForSeconds(m_moveTotalTime);}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717321.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717321.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717321.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

兩天學會微服務網關Gateway-Gateway簡介

鋒哥原創的微服務網關Gateway視頻教程&#xff1a; Gateway微服務網關視頻教程&#xff08;無廢話版&#xff09;_嗶哩嗶哩_bilibiliGateway微服務網關視頻教程&#xff08;無廢話版&#xff09;共計17條視頻&#xff0c;包括&#xff1a;1_Gateway簡介、2_Gateway工作原理、3…

使用.NET開發VSTO工具快速將PPT導出為圖片

本文主要介紹如何使用.NET開發 PowerPoint VSTO 外接程序&#xff0c;并實現快速的將當前頁PPT導出為圖片的功能。可以幫助你了解如何使用 VSTO 開發 Office 外接程序&#xff0c;以及如何操作 PowerPoint 的對象模型。 1. 背景 在日常的文章寫作中&#xff0c;我經常使用 PPT…

Vue 3 中的 watchEffect 和 watch 有什么區別?

Vue 3 中的 watchEffect 和 watch 有什么區別&#xff1f; Vue 3 引入了 Composition API&#xff0c;為開發者提供了更加靈活和組織化的方式來組合和復用代碼邏輯。在響應式系統中&#xff0c;watch 和 watchEffect 是兩個重要的函數&#xff0c;用于觀察和響應 Vue 組件中狀…

JUC并發編程 深入學習Java并發編程【上】

JUC并發編程&#xff0c;深入學習Java并發編程&#xff0c;與視頻每一P對應&#xff0c;全系列6w字。 P1-5 為什么學特色預備知識 進程線程概念 進程&#xff1a; 一個程序被運行&#xff0c;從磁盤加載這個程序的代碼到內存&#xff0c;就開起了一個進程。 進程可以視為程…

JVM相關問題

JVM相關問題 一、Java繼承時父子類的初始化順序是怎樣的&#xff1f;二、JVM類加載的雙親委派模型&#xff1f;三、JDK為什么要設計雙親委派模型&#xff0c;有什么好處&#xff1f;四、可以打破JVM雙親委派模型嗎&#xff1f;如何打破JVM雙親委派模型&#xff1f;五、什么是內…

Spring Cloud Gateway-系統保護Sentinel集成

文章目錄 Sentinel介紹Spring Cloud Gateway集成Sentinelpom依賴Sentinel配置Sentinel集成Nacos作為數據源自定義降級響應 Sentinel介紹 ? 隨著微服務的流行&#xff0c;服務和服務之間的穩定性變得越來越重要。Sentinel 是面向分布式、多語言異構化服務架構的流量治理組件&a…

HTML5:七天學會基礎動畫網頁6

CSS3自定義字體 ①&#xff1a;首先需要下載所需字體 ②&#xff1a;把下載字體文件放入 font文件夾里&#xff0c;建議font文件夾與 css 和 image文件夾平級 ③&#xff1a;引入字體&#xff0c;可直接在html文件里用font-face引入字體&#xff0c;分別是字體名字和路徑 例…

Django官網項目

項目準備 使用VSCODE做IDE。 檢查Python版本。 sudo apt install sudo apt update python3 --version創建項目路徑&#xff0c;創建虛擬環境&#xff0c;創建項目 路徑 \mysite 進入路徑&#xff0c;運行VSCODE 運行 "code ." 創建虛擬環境。 選擇 >python: c…

【推薦算法系列十七】:GBDT+LR 排序算法

排序算法經典中的經典 參考 推薦系統之GBDTLR 極客時間 手把手帶你搭建推薦系統 課程 邏輯回歸&#xff08;LR&#xff09;模型 邏輯回歸&#xff08;LR,Logistic Regression&#xff09;是一種傳統機器學習分類模型&#xff0c;也是一種比較重要的非線性回歸模型&#xff…

AAAI2024-分享若干篇有代碼的優秀論文-圖神經網絡、時間序列預測、知識圖譜、大模型等

圖神經網絡、大模型優化方向系列文章目錄 為了方便大家根據自己的興趣查看自己的研究方向論文&#xff0c;在這里進行了細分。如果有對其中的論文感興趣的&#xff0c;可以查看對應的文章在論文相應的代碼&#xff0c;方便快速上手學習&#xff0c;也可以借助這些代碼的學習快…

16 Educational Codeforces Round 142 (Rated for Div. 2)C. Min Max Sort(遞歸、思維、dp)

C. Min Max Sort 很不錯的一道題目&#xff0c;不過腦電波和出題人每對上&#xff0c; q w q 。 qwq。 qwq。 正難則反。 我們考慮最后一步是怎么操作的。 最后一步一定是對 1 1 1和 n n n進行操作 那么上一步呢&#xff1f; 上一步應該是對 2 2 2和 n ? 1 n-1 n?1 以此類推…

AMD“高級洞察”系列揭示Epyc Naples和Rome原型CPU早期無法啟動問題

AMD在其新的YouTube視頻系列《高級洞察》第一集中&#xff0c;由AMD首席技術官Mark Papermaster擔任主持人&#xff0c;討論了AMD在數據中心領域的突破性進展及其持續增長。然而&#xff0c;AMD在服務器業務的發展并非一帆風順&#xff0c;兩位高管公開討論了早期Epyc Naples和…

【Python】環境管理怎么選擇【virtualenv】【pipenv】【 poetry】【 conda】

前言 剛入門Python&#xff0c;看到PyCharm的環境管理選擇有好幾個選擇&#xff0c;分別是virtualenv、pipenv、venv、conda&#xff0c;只知道這些都可以用來管理Python環境的&#xff0c;但不知道這些環境有什么區別&#xff0c;所以&#xff0c;本文將對這些環境管理進行總…

Avalonia學習(二十九)-儀表

Avalonia制作儀表盤&#xff0c;把控件給大家演示一下&#xff0c;Avalonia有三類自定義控件&#xff0c;分別是用戶控件、模版控件、自主控件。前面已經很多用戶控件了&#xff0c;這個是演示模版控件&#xff0c;另外一種不知道哪種情況下使用。 前端代碼&#xff1a; <…

想從事數據方向職場小白看過來, 數據方面的一些英文解釋

想從事數據方向職場小白看過來&#xff0c;一些英文名詞解釋 文章目錄 想從事數據方向職場小白看過來&#xff0c;一些英文名詞解釋 英文類解釋NoSQL&#xff1a;ESB&#xff1a;ACID &#xff1a;Data Vault&#xff1a;MDM&#xff1a;OLAP&#xff1a;SCD:SBA&#xff1a;MP…

【Django】執行查詢——比較、刪除、復制、批量修改對象

以下述模型為基礎&#xff0c;討論檢索對象的方式方法&#xff1a; from datetime import datefrom django.db import modelsclass Blog(models.Model):name models.CharField(max_length100)tagline models.TextField()def __str__(self):return self.nameclass Author(mod…

【vue】v-if、v-show、v-for 相關所有面試題總結

v-if 和 v-show 的區別 兩個重點【dom】和【生命周期】 v-if 惰性指令&#xff0c;false 不會被編譯、渲染不會存在 DOM 中切換開銷大&#xff0c;需要重新創建元素值變化&#xff0c;使用 v-if 的組件生命周期執行順序 true 變為 false【組件的銷毀】 beforeDestroy / befor…

[Flutter]shared_preferences基本用法以及可視化管理存儲的key和value類型

shared_preferences 是一個Flutter插件&#xff0c;它提供了一種簡單的方式來在應用程序中存儲和獲取持久化的鍵值對數據。它可以用于存儲應用程序的配置信息、用戶偏好設置、登錄狀態等。 使用 shared_preferences 插件&#xff0c;你可以在應用程序中輕松地保存和讀取數據&a…

Java中線程相關的知識

創建子線程的三種方式: 1.自定義線程任務類繼承線程類&#xff0c;以便繼承其功能,重寫其run方法(里面寫自己需要實現的功能)&#xff0c;在main方法調用時創建其任務類實例化對象&#xff0c;然后調用對象的start方法(繼承自父類)&#xff0c;即成功創建線程 優點:創建方式簡…

Pandas DataFrame 基本操作實例100個

Pandas 是一個基于NumPy的數據分析模塊&#xff0c;最初由AQR Capital Management于2008年4月開發&#xff0c;并于2009年底開源。Pandas的名稱來源于“Panel Data”&#xff08;面板數據&#xff09;和“Python數據分析”&#xff08;data analysis&#xff09;。這個庫現在由…