草庐IT

Unity打字机 三种方式教会你

_橙子先生 2024-04-10 原文

Unity打字机教程

预读

大家好,我是橙子,今天为大家带来的是Unity场景切换进度条的教程。
为什么突然搞这个Unity打字机呢,是我的一位老师,给我了一个题,题目主要涉及的一部分内容就是打字机的这个效果,看了看网上的教程,层次不齐,所以我今天给大家来写一期这个打字机的效果。

★,♫◦★,♫◦★,♫◦★,--------------------华丽的分割线--------------------♫◦★,♫◦★,♫◦★,♫◦★,♫◦

成品

先来看下成品是什么样

我将分成三个案例,深度解析Unity打字机到底是如何做成的!授人与渔不如授人与渔。

第一步 创建UGUI布局 并 修改自适应


在Hierarchy面板中的空白处,右击直接选择Image创建。

在Inspector窗口中 找到这个 点击后 按住AIt键 点击右下角的按钮

让图片铺满全屏。
然后选中Hierarchy窗口中的Canvas

把渲染模式,改为中间的Screen Space-Camera
如果这里不懂为什么要改成中间的 可以看我之前的文章(点击此处跳转)

随后把摄像机拖拽过去

把这里改成中间选项 并修改Refrernce Resolution(引用解析)

到这里 自适应就做好了,咱们继续设计UI层面


把创建的Image重新命名为bg,然后你可以在他的Color属性里 更改背景的颜色。

再用刚才的方法,在bg上右击 UI—> Image 创建两个Image 如下图

然后把人物素材 添加到Image上

添加完成以后 感觉有点小… 没关系 点击这里让图片显示原始大小即可

如果感觉还是太小,选中第一个Image 在Inspector里更改他的Scale

为什么不选最后的Z 因为它是一个2D图片 不需要Z

我把他们大小设置为了3 看起来不错

第二步 添加文本框

还是在bg上添加 Image 作为文本框的背景 并移动到合适的位置
添加完背景 以后 再从它的身上新建Text组件

大概就像这样

到这里 我们的UGUI层面就设计的差不多了

第三步 写代码

之第一种:常规写法

下面这种写法,比较传统 在FixedUpdate里每帧执行,这里可能有小伙伴疑惑?为什么不用Update?
因为Update不是每帧固定执行的,如果你电脑性能好,执行的就快一些,如果电脑性能差,就会卡顿一点,做不到完美丝滑的赶脚,所以这里用FixedUpdate Unity不管你电脑好与坏,都是每帧固定执行。

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

public class TypeWriterDemo1 : MonoBehaviour
{
    [Header("打字间隔时间")]
    public float speedTime = 0.1f;//打字间隔时间

    float timer;//计时器时间
    Text TextCompnt;//Text文字组件
    int wordNumber;//文字数量
    bool isStart;//是否开始打字

    string wordContent;//----文字内容

    void Awake( )
    {
        TextCompnt = this.GetComponent<Text>();//从当前物体获取到Text组件
        isStart = true;//bool值的默认值是false  所以这里要重置为true
        wordContent = "你好!我是橙子~\n来自中国的一名Unity开发者,喜欢编程!\nHello! I am Orange ~, a Unity developer from China. I like programming!";
    }

    void FixedUpdate( )
    {
        StartTyping();
    }
    void StartTyping( )
    {
        if (isStart)
        {
            timer += Time.deltaTime;//简单的计时器
            if (timer >= speedTime)//如果计时器时间>打字间隔时间
            {
                timer = 0;//重置
                wordNumber++;//文字数量+1

                //Substring() 官方文档解释:从此实例检索子字符串。 子字符串从指定的字符位置开始且具有指定的长度。
                TextCompnt.text = wordContent.Substring((0), wordNumber);//数字数量的起始字符位置(从零开始)
                if (wordNumber >= wordContent.Length)//数字数量=文字的长度
                {
                    isStart = false;//停止打字
                }
            }
        }
    }
}

之第二种:协程+for循环

这一种呢 比上一种间接了很多,并用上了协程,实现方法相对简单

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

public class TypeWriterDemo2 : MonoBehaviour
{
    public float delay = 0.1f;
    string fullText = "你好!我是橙子~\n来自中国的一名Unity开发者,喜欢编程!\nHello! I am Orange ~, a Unity developer from China. I like programming!";
    string currentText;
    void Start()
    {
        StartCoroutine(ShowText());
    }
    IEnumerator ShowText( )
    {
        for (int i = 0; i < fullText.Length; i++)//遍历插入字符串的长度
        {
            currentText = fullText.Substring(0, i);//看demo1的代码注释
            this.GetComponent<Text>().text = currentText;
            yield return new WaitForSeconds(delay);//每次延迟的时间 数值越小 延迟越少
        }
    }
}

之第三种:while循环 + 协程

这种使用了方法传递的模式,此种相当于封装了方法。
如果一个项目种频繁使用打字机,即可把此代码设置为单例,然后直接向Run方法进行传值。

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

public class TypeWriterDemo3 : MonoBehaviour
{
    [Header("打字速度")]
    public float Speed = 15;

    Text text;

    void Start( )
    {
        text = this.GetComponent<Text>();
        Run("你好!我是橙子~\n来自中国的一名Unity开发者,喜欢编程!\nHello! I am Orange ~, a Unity developer from China. I like programming!", text);
    }
    public void Run(string textToType, Text textLabel)
    {
        StartCoroutine(TypeText(textToType, textLabel));
    }
    IEnumerator TypeText(string textToType, Text textLabel)
    {
        float t = 0;//经过的时间
        int charIndex = 0;//字符串索引值
        while (charIndex < textToType.Length)
        {
            t += Time.deltaTime * Speed;//简单计时器赋值给t
            charIndex = Mathf.FloorToInt(t);//把t转为int类型赋值给charIndex
            charIndex = Mathf.Clamp(charIndex, 0, textToType.Length);
            textLabel.text = textToType.Substring(0, charIndex);

            yield return null;
        }
        textLabel.text = textToType;
    }
}

挂载脚本

在三种选择一种你认为写的最好的,然后把他保存下来,挂载到这个Text上

这个时候 点击运行 即可完美实现打字机效果!~

总结

总体来说,打字机的效果实现不难,主要就是用到了Substring,官方文档解释:从此实例检索子字符串。 子字符串从指定的字符位置开始且具有指定的长度。
其实大白话就是 数字数量的起始字符位置是从零开始的。然后就是去比对字符串的长度。

结束语

不及硅步,无以至千里。
不积小流,无以成江海。
每天进步一点点 谢谢您的观看。

觉得对自己有帮助,欢迎关注、收藏、转发!我们下期再见

有关Unity打字机 三种方式教会你的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  4. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  5. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  6. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  7. unity---接入Admob - 2

    目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里​编辑 3.解析依赖到项目中

  8. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  9. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

  10. ruby - 如何更优雅地记下这三种情况? - 2

    是否可以让这段代码更紧凑?我在这里错过了什么吗?ifvaluemax_ratemax_rateelsevalueend 最佳答案 这里有一些完全不同的东西:[min_rate,value,max_rate].sort[1] 关于ruby-如何更优雅地记下这三种情况?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/13309740/

随机推荐