一、简介
使用TextMeshProUGUI,实现打字效果,伴随着富文本也可以打印。
二、代码展示
using System;
using System.Collections;
using System.Text;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class TypeEffect : MonoBehaviour
{
public TextMeshProUGUI displayTipText;
public float typingSpeed = 0.05f;
[SerializeField]
private Button startBtn;
private bool isNext = false;
private void Awake()
{
if (startBtn != null)
startBtn.onClick.AddListener(() =>
{
startBtn.gameObject.SetActive(false);
displayTipText.transform.parent.gameObject.SetActive(true);
var str = displayTipText.text;
displayTipText.text = "";
// 启动打字效果
StartCoroutine(TypeTextWithTags(str));
});
}
private void Update()
{
if (isNext && Input.GetMouseButtonDown(0))
{
//下一句打字
StartCoroutine(TypeTextWithTags("下一句话"));
}
}
public IEnumerator TypeTextWithTags(string input)
{
isNext = false;
StringBuilder sb = new StringBuilder();
int i = 0;
while (i < input.Length)
{
if (input[i] == '<')
{
// 一次性处理整个标签
int tagEnd = input.IndexOf('>', i);
if (tagEnd == -1) tagEnd = input.Length;
string tag = input.Substring(i, tagEnd - i + 1);
sb.Append(tag);
displayTipText.text = sb.ToString();
i = tagEnd + 1;
yield return null; // 下一帧继续,但仅等待一次
}
else if (input[i] == ' ')
{
// 批量处理连续空格
int spaceCount = 0;
while (i < input.Length && input[i] == ' ')
{
spaceCount++;
i++;
}
sb.Append(' ', spaceCount);
displayTipText.text = sb.ToString();
yield return null; // 空格不等待
}
else
{
// 逐字显示普通字符
sb.Append(input[i]);
displayTipText.text = sb.ToString();
i++;
yield return new WaitForSeconds(typingSpeed);
}
}
isNext = true;
}
}
三、成品展示
开启战!开启战!
<b><size=50>开战!开战!</size></b>