最近根据网上的教程学习了一下Unity中的对话系统,将其中一些关键点记录下来作为参考,以后可在此基础上添加更多功能。

1.UI部分的设置。

  对话框由一个panel下面的text和image组成。canvas的render mode推荐设置为World Space,因为这样可以方便使对话框随意设定位置

2.TextAsset

  TextAsset是Unity用来导入文本文件的一个格式。当你拖入一个文本文件到你的项目时,他会被转换为文本资源。支持的文本格式有:    

·    .txt、.html、.htm、.xml、.bytes、.json、.csv

  TextAsset中有用的属性是TextAsset.Text。这个属性是string类型,用来访问TextAsset中的全部文本。

3.DialogueSystem脚本构建

    public Text text;
public Image Image;
public TextAsset textAsset; List<string> textList = new List<string>();
int index = 0;
public float time;
bool textFinished;
bool cancelTyping; public Sprite face1, face2;

  简单来说,实现基础对话框需要以上几个要素,即需要显示的完整文本内容textAsset,每一次对话框能显示的内容textList,需要切换的人物头像face1,face2等。

  最基础的对话系统需要实现:

  1. 将textAsset中的内容按人物分段显示,同时根据说话人切换头像
  2. 文字内容快速逐字显现
  3. 玩家可通过按键跳过前面第二条,立刻显示当前人物要说出的完整句子

TextAsset中的内容一般按一下格式来编辑:    

    A
    XXX,XXXXXXXXX
    B
    XXXXXXXXXXXXXXXX!

  故在初始化时用如下方法分割文本内容并保存到textList中:

void GetTextFromFile(TextAsset file)
{
textList.Clear();
index = 0; var linedata = file.text.Split('\n'); for (int i = 0; i < linedata.Length; i++)
{
textList.Add(linedata[i]);
}
}

  上面第二点文字的逐字出现用协程实现,具体代码如下,其中的bool变量textFinished是用来控制同一时间只有一个相关协程在运行,float变量time控制文字显示的快慢:

IEnumerator SetTextUI(float time)
{
textFinished = false;
text.text = ""; switch (textList[index])
{
case "A":
Image.sprite = face1;
index++;
break;
case "B":
Image.sprite = face2;
index++;
break;
} int letter = 0;
while(!cancelTyping && letter <textList[index].Length -1){
text.text += textList[index][letter];
letter++;
yield return new WaitForSeconds(time);
} text.text = textList[index];
cancelTyping = false;
index++;
textFinished = true;
}

    第三点跳过逐字显示直接显示完整内容是通过bool变量cancelTyping来帮助实现

void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && index == textList.Count)
{
index = 0;
gameObject.SetActive(false);
return;
}
if (Input.GetKeyDown(KeyCode.Space))
{
if (textFinished && !cancelTyping)
{
StartCoroutine(SetTextUI(time));
}
else if (!textFinished)
{
cancelTyping = !cancelTyping;
} }
}

  cancelTyping默认为false,当textFinished为false,即协程正在进行时改变cancelTyping为true即可中断协程。

以上只是基础功能,后续还可以根据需要加上比如按键直接退出对话窗口等功能。

    

  

    

Unity各种功能实现之一:对话系统的更多相关文章

  1. Unity——计时器功能实现

    Unity计时器 Demo展示 介绍 游戏中有非常多的计时功能,比如:各种cd,以及需要延时调用的方法: 一般实现有一下几种方式: 1.手动计时 float persistTime = 10f flo ...

  2. Unity基础功能:粒子特效(Shuriken)

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  3. Unity新功能|全息模拟器

    http://forum.china.unity3d.com/thread-21539-1-1.html

  4. 通过反射调用Unity编辑器提供的各种功能

    Unity编辑器功能丰富易上手,其实编辑器提供的大多数菜单操作,在代码里面都是能够找到对应接口的,但是这些接口都没有对我们开放,怎么办? 很简单,直接使用反射调用即可. 首先使用Reflector或I ...

  5. C# Unity依赖注入利用Attribute实现AOP功能

    使用场景? 很多时候, 我们定义一个功能, 当我们要对这个功能进行扩展的时候, 按照常规的思路, 我们一般都是利用OOP的思想, 在原有的功能上进行扩展. 那么有没有一种东西, 可以实现当我们需要扩展 ...

  6. Unity在Android和iOS中如何调用Native API

    本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调 ...

  7. mvc4 web-api 与unity搭建接口

    对于接口重要的应该是 功能实现,合法性验证,性能监控,日志等模块 通过unity aop功能可以实现统一的日志模块和性能监控. 1.新建mvc4 webapi项目 nuget添加 unity 3.0+ ...

  8. Unity起步-1.1下载和安装Unity

    1.1.下载和安装Unity 1.1.1 选取版本 首先找到Unity官方网站https://store.unity.com/cn,如果要下载最新版本,可以选择"立即下载".不过我 ...

  9. 【Unity3D技术文档翻译】第1.9篇 使用 Unity AssetBundle Browser tool (AssetBundle系列完结)

    上一章:[Unity3D技术文档翻译]第1.8篇 AssetBundles 问题及解决方法 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced D ...

  10. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- CustomYieldInstruction 自定义中断指令

    ActionScript3脚本引擎为了方便热更新逻辑开发,提供的从脚本继承Unity类库功能在一些情况下可以提供开发的便利. 这次来建立一个示例,演示一下如何在脚本中自定义协程中断指令 Unity中的 ...

随机推荐

  1. gin面试题

    1.gin绑定前端提交的数据到结构体 json,shouldbindjson,postform,query拿到get方法或者路由拼接这些 2.gin框架中间件多个执行顺序 3.中间件实现原理 4.设计 ...

  2. 简单的python线程池实现线程安全demo

    from concurrent.futures import ThreadPoolExecutor import threading import time import sys sys.path.a ...

  3. python如何实现对word内段落文本及表格的读取

    在以下方法中用到的三方库是:python-docx from docx import Document 获取指定段落的文本 def get_paragraph_text(path, n): " ...

  4. 多个git账户ssh密钥配置

    假设两git网站:A.com和B.com,在这两个网站上使用的邮箱和用户名分别为a@mail, userA和b@mail, userB. 清除全局配置 git config --global --li ...

  5. Unity多线程使用(线程池)

    1.在C#中使用线程池需要以下这个类库using System.Threading 2.开单个线程(unity程序停止前 线程一定要关闭) private Thread tempThread; voi ...

  6. react对于setState的写法

    react对于setState的写法,改变state的数组里边的值也可以这样写 [1,2,3,4,5].forEach((item)=>{ let arr={} arr[`list${item} ...

  7. Python 用exec来获取字符串所对应的字典

    Python 用exec来获取字符串所对应的字典 Python exec 问题的提出 想要遍历两个结构相似的字典,但是不想采用字典内嵌套字典的方式,所以想要通过一个列表,该列表包含字典名称.也就是通过 ...

  8. win常用的dos命令

    常用的dos命令 开启dos终端的两种方式: win+r后输入cmd指令 在资源管理器上方的路径窗口直接输入cmd,即可开启指定路径下的cmd终端,省去了cd/d这一步 注:在dos终端里ctrl+v ...

  9. mysql-列拆分

    tableA id warehouse_id 1 1,2 想要的结果: id warehouse_id 1 1 2 2 select *(其他的字段), substring_index(substri ...

  10. bzoj 4176

    题意:求$\sum_{i=1}^{n}\sum_{j=1}^{n}d(ij)$ 首先推一发式子: $\sum_{i=1}^{n}\sum_{j=1}^{n}d(ij)$ 有一个结论:$d(nm)=\s ...