在Unity中使用unsafe代码实现0GC的文本打字机效果

近日项目里需要实现一个对话文本的打字机效果,在网上看了一圈,居然一水的都是用SubString或者字符串+=拼接实现的,这样虽然方便,但是每次都会产生约30B的内存分配,最终只能自己动手写unsafe代码来实现文本打字机效果了。

demo代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

unsafe public class UnsafeTypewriter : MonoBehaviour
{
    public Text text;
    public string dialogue;
    public float delay;

    private float timer;
    private int index;

    private char* strPtr;


    void Start()
    {
        //主动触发新字符串创建 以防修改到原来的字符串
        text.text = dialogue + " ";

        fixed(char* strPtr = text.text)
        {
            this.strPtr = strPtr;

            //将新字符串置空
            for (int i = 0; i < text.text.Length; i++)
            {
                strPtr[i] = ' ';
            }

        }
    }

    void Update()
    {

        timer += Time.deltaTime;
        if (timer >= delay)
        {
            if (index < dialogue.Length)
            {
                timer -= delay;

                strPtr[index] = dialogue[index];

                //主动触发重建来刷新文本显示 手动调用SetAllDirty和Rebuid没用 只能这样了
                if ((index & 1) == 0)
                {
                    text.supportRichText = true;
                }
                else
                {
                    text.supportRichText = false;
                }


                index++;
            }
        }
    }
}

具体效果:

性能分析:

 

实现打字机效果需要使用TextMeshPro的Typewriter Effect功能,同时需要在脚本读取文本框内的文字。具体实现过程如下: 1. 在Unity创建一个UI文本框,使用TextMeshPro组件。在TextMeshPro组件的Inspector界面找到Typewriter Effect选项,勾选开启。 2. 在脚本获取文本的文字,可以通过如下代码实现: ```csharp using TMPro; public class TypeWriter : MonoBehaviour { public TextMeshProUGUI textMeshPro; private string text; void Start() { text = textMeshPro.text; textMeshPro.text = ""; } } ``` 在脚本声明一个TextMeshProUGUI类型的公共变量textMeshPro,并在Start里将文本的文字赋值给text,并将文本框清空。 3. 实现Typewriter Effect功能。使用TextMeshPro组件的Animate方法,在每一帧逐渐显示文字。同时需要保证每一帧显示的文字都是当前text的子字符串。代码实现如下: ```csharp void Update() { if (textMeshPro.text != text) { int length = textMeshPro.text.Length + 1; textMeshPro.text = text.Substring(0, length); textMeshPro.ForceMeshUpdate(); } } ``` 在Update方法判断当前文本的文字是否与text相同,如果不同则将text的子字符串逐渐显示,并调用ForceMeshUpdate方法立即更新UI。需要注意的是,字符串的长度需要每帧加一,实现逐字显示的效果。 4. 将脚本挂在UI文本框所在的GameObject上。在Inspector界面textMeshPro参数绑定到UI文本框的TextMeshPro组件上,即可实现打字机效果使用文本的文字。 以上是Unity TextMeshPro实现打字机效果并引用文本框内的文字的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值