Unity Text实现对话动画效果

  • 效果如下
  • 步骤如下
  • UI界面的设计
  • 对话文件的准备
  • 脚本
  • 总结


效果如下

优秀的Unity交互 unity交互效果_优秀的Unity交互

如果这是你想要实现的效果的话请好好观看这篇文章吧,一定有所收获

步骤如下

UI界面的设计

优秀的Unity交互 unity交互效果_优秀的Unity交互_02

一个Image和一个Text即可

你可以更改对话板的背景图片,可以调整text文字的字体和大小

我这里将text勾选了Best Fit

优秀的Unity交互 unity交互效果_unity_03

对话文件的准备

首先在你的桌面上创建一个Text文件,让后将该文件拖到Assets里

优秀的Unity交互 unity交互效果_Text_04

然后你打开该文件,你就可以编写你所需要的对话内容了

优秀的Unity交互 unity交互效果_优秀的Unity交互_05


以上就是准备工作了,下面开始脚本的书写

脚本

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

public class talk : MonoBehaviour
{
    /// <summary>
    /// texttAsset是Unity里的text文件的意思,其中有个.text的api可以将文件中转换成string字符串
    /// </summary>
    public TextAsset talkFile;
    
    /// <summary>
    /// 显示文本的text
    /// </summary>
    private Text talkText;

    /// <summary>
    /// 显示文字的速度
    /// </summary>
    public float talkSpeed;
    /// <summary>
    /// 文件中的内容
    /// </summary>
    private string word;
    /// <summary>
    /// 将每行内容存储到集合里面,然后依次读取赋值给text
    /// </summary>
    private List<string> readLine=new List<string>();

    /// <summary>
    /// 集合的下标,用于判断是否读取完,读取完后再关闭对话
    /// </summary>
    private int index;

    /// <summary>
    /// 判断一句话是否显示完,显示完才可以进行下一句显示。
    /// 主要来防止快速点击对话键来影响动画的混乱
    /// 当然你可以在加一个按下空格直接将这句话直接显示出来的功能
    /// </summary>
    private bool isFinishi = true;
    private void Awake()
    {
        talkText = GetComponent<Text>();
        talkText.text = "";
        word = talkFile.text;
        var line = word.Split('\n');//因为文件是以回车形式分割对话的
        foreach (var VARIABLE in line)
        {
            readLine.Add(VARIABLE);
        }
    }
    

    // Update is called once per frame
    void Update()
    {
        if (index == readLine.Count && Input.GetKeyDown(KeyCode.R))
        {
            talkText.text = "";
            index = 0;
        }

        if (Input.GetKeyDown(KeyCode.R) && isFinishi)
        {
            StartCoroutine(WaiteLine());
        }
    }

    IEnumerator WaiteLine()
    {
        talkText.text = "";//将上一句话清空
        isFinishi = false;
        for (int i = 0; i < readLine[index].Length; i++)//这里是将string一句话分成一个个的字来添加到talkText里面
        {
            talkText.text += readLine[index][i];
            yield return new WaitForSeconds(talkSpeed);
        }

        index++;//进行到下一句话
        isFinishi = true;
    }
}

该脚本在Text下挂载

优秀的Unity交互 unity交互效果_unity_06


效果就是上面的案例效果了。

总结

该功能我也顺带一些对话效果的功能,比如当你控制玩家到一个NPC下,可以按下R键产生对话框显示然后就是下面的对话内容。同时你也可以添加显示人物头像的功能,在Image下面添加一个HeadImage,通过在对话文件设置AB,当读到的是A时显示玩家的头像照片,B的话显示NPC的头像。其他功能待大家自主开发。
希望大家在学习的路上乘风破浪~~~~~