行业知识
Unity TMP文字移动效果
2026-11-08 13:38:52
来源:互联网转载
前言
���见很多游戏有很特殊的波浪形文字效果,于是来尝试一下控制TMP文字顶点的方式达到类似效果。
原理
挂载tmp text,在里面随便放入非空格字符。
tmp text组件开放了textInfo接口,也就是GetComponent().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();}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 所有字符一起移动
用协程每隔一段时间做一次循环运动,用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 = 0 && yOffset 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(); } 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 0f, y => { for (int i = 0; i = 0 && yOffset
上一篇:崩三怎么换服务器?