最近根据网上的教程学习了一下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. ssh_remote_without_password

    2 machines, 1 called client , 1 called server , server need static ip address. client connects serve ...

  2. idea var 总是有final

    转自:https://blog.csdn.net/Grantr/article/details/119184963 解决idea中快捷键ctrl+alt+v多生成的final ctrl+alt+v快捷 ...

  3. php 虚拟化 linux 入侵检测交作业 不要太nice

    #inclide<iostream> using namespace std; int main() { cout<<"暂时自闭一会er"; }

  4. C++实现单链表相关操作

    #include<iostream>#include<cstdlib>//C++动态分配存储空间using namespace std;#define OK 1#define ...

  5. TypeScript 合并以及删除数组数据

    1.添加 concat() 2.删除(替换) splice() array.splice(index,int,any) index 是 array数组起始位置的index(从0开始) int是操作从i ...

  6. Thread 的run方法和start方法的区别

    start()方法是用来启动线程,实现了多线程运行 点进去查看源码,发现start方法创建一个线程 并让线程处于就绪状态,并且在start方法内会调用start0()方法,而start0作为本地方法  ...

  7. noi 1.1 2 输出第二个整数

    描述 输入三个整数,把第二个输入的整数输出. 输入 只有一行,共三个整数,整数之间由一个空格分隔.整数是32位有符号整数. 输出 只有一行,一个整数,即输入的第二个整数. 样例输入 123 456 7 ...

  8. <鸳鸯刀>&<白马啸西风>随笔

    这两部作品比较小众,也不如之前的作品优秀,因此简单写一下好了. <鸳鸯刀> 陕西西安府威信镖局的总镖头."铁鞭镇八方"周威信,带领一支七十多人的镖队正前往京城.路途之上 ...

  9. 解决vuex“状态管理调用报错”报错为:"Uncaught ReferenceError: mapactions is not defined"

    报错: 源码: <script> import Vuex from 'vuex'; import {mapActions,mapGetters} from 'vuex'; // conso ...

  10. ZSTUOJ平台刷题③:Problem A.--打印金字塔

    Problem A: 打印金字塔 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 10011  Solved: 6227 Description 请编写程序 ...