最近根据网上的教程学习了一下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. javaScript 获取对象数组的对象里面想要的属性,返回一个新的数组

    // obj 数组 或者 对象 // arr 要获取对象数组的对象的key数组 // addProperty 可以往对象数组的每一个对象添加一个新的属性 reducedFilter(obj, arr, ...

  2. JAVA笔记:double四舍五入并保留两位小数的方法

    1.只要输出结果 double x1 = 0.026; System.out.println(String.format("%.2f", x1)); 2.数据转换 //方案一: g ...

  3. js实现字符串得填充

    方法一: //填充截取法 function padding4(str, length) { //这里用slice和substr均可 return (Array(length).join("0 ...

  4. Java方法之命令行传递参数

    命令行传参 有时候希望运行一个程序时候再传递给它消息.这要靠传递命令行参数给main()函数实现. public class Demo05 { public static void main(Stri ...

  5. 2022-3-21内部群每日三题-清辉PMP

    1.Sprint的速度低于预期,敏捷团队成员应该怎么做? A.限制团队成员和客户之间的沟通,以防止不必要的焦虑. B.管理沟通,以重置相应团队成员和干系人的期望. C.管理几名团队成员和客户之间的沟通 ...

  6. warmup --攻防世界

    题目: (1)有一张图片和一个压缩包 发现压缩包里面有一张相同的图片,应该是已知明文攻击(相同的CRC) (2)使用软件爆破 虽然没能得到密码,手动中断后得到新的压缩包,发现里面的图片已经解密. (3 ...

  7. XSStrike-20220320

    Usage: xsstrike.py [-h] [-u TARGET] [--data PARAMDATA] [-e ENCODE] [--fuzzer] [--update] [--timeout ...

  8. holiday10

    holiday10 ssh配置别名 每次输入 ssh -p port user@remote 时间久了都会觉得麻烦, 而 配置别名 可以让我们进一步偷懒,比如用 ssh mac 来代替上面一长串,那么 ...

  9. 浏览器F12,Network中各按钮的作用

    Network下 preserve log:勾选,页面发生跳转,接口不丢失:(比如登录成功跳转到首页,登录的接口就没了,勾选Perserve log,会记录跳转前的接口): Disable cache ...

  10. Git系列 -> git commit 报错 “Invalid syntax in configuration ini file.”

    git commit 报错 提示信息为 "Invalid syntax in configuration ini file." 解决办法: 方法一:使用-n or --no-ver ...