老的的Text可以使用DoTween使用dotext实现打字机效果,这个只需要一句代码,很简单。
但是因为我们使用了TextMeshPro(后面简称tmp),没有dotext接口。
只能使用其他办法。
但是后面发现Tmp有俩种,**
3DObject/Tmp
是3d下面的Tmp:
点击这个tmp,能看到
这里的是通过MeshRender渲染来实现的,
UI下面的Tmp
他是没有MeshRender的,他是在Canvas下面渲染出来的。
然后针对这俩种要不同的处理。
因为UI下面的会比较简单点,能直接使用DoTweenPro,这个通过DoTween.To来实现,但是他只支持UI下面的Tmp,可以在DoTween官网看到对应的文档
这个的话主要也是一句代码,但是获取的控件得注意:
注意是TextMeshProUGUI
核心逻辑如下
主要用的是Dotween.to
前面的俩个参数是get,set,第三个参数是要输出的完整文字,第四个是所需要耗费的时间,因为每句话花费的时间不一样,最后是在每帧执行的时候更新控件里面的内容就能形成打字机效果了。
如果是只用到UI下面的Tmp,只需要看到这里就可以了。
但是如果我们要使用3DObject下面的Tmp,这样的是不行的,因为那个是tmp_text,不支持这个api。
那就只能另想办法,后面参考官方的例子和网上的资料,发现可以获取文字的内容,针对每个字符做处理,可以修改他们的顶点的动画、颜色等等,可以实现很多定制的效果,大家可以自己研究,先说打字机的效果。
我直接贴出来了,这个不仅可以3d物体下的tmp用,Canvas下的tmp也能使用,这个是b站看到的,大家可以参考下,下面我直接给出大佬的链接,希望对大家有帮助。
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
public enum EffectType
{
typewritter = 0
}
public class TMP3DObjectAni : MonoBehaviour
{
public TMP_Text m_text;
public string Show_Text = "";
public float TotalTime = 1;
private void Awake()
{
gameObject.TryGetComponent<TMP_Text>(out m_text);
}
// Start is called before the first frame update
void Start()
{
}
private IEnumerator TypeWritter()
{
m_text.ForceMeshUpdate();
TMP_TextInfo textInfo = m_text.textInfo;
int total = textInfo.characterCount;
bool complete = false;
int current = 0;
while (!complete)
{
if (current > total)
{
current = total;
yield return new WaitForSecondsRealtime(0.1f);
complete = true;
}
m_text.maxVisibleCharacters = current;
current += 1;
yield return new WaitForSecondsRealtime(TotalTime / total);
}
yield return null;
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
m_text.text = Show_Text;
StartCoroutine(TypeWritter());
}
}
}