Unity各种功能实现之一:对话系统
最近根据网上的教程学习了一下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等。
最基础的对话系统需要实现:
- 将textAsset中的内容按人物分段显示,同时根据说话人切换头像
- 文字内容快速逐字显现
- 玩家可通过按键跳过前面第二条,立刻显示当前人物要说出的完整句子
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各种功能实现之一:对话系统的更多相关文章
- Unity——计时器功能实现
Unity计时器 Demo展示 介绍 游戏中有非常多的计时功能,比如:各种cd,以及需要延时调用的方法: 一般实现有一下几种方式: 1.手动计时 float persistTime = 10f flo ...
- Unity基础功能:粒子特效(Shuriken)
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- Unity新功能|全息模拟器
http://forum.china.unity3d.com/thread-21539-1-1.html
- 通过反射调用Unity编辑器提供的各种功能
Unity编辑器功能丰富易上手,其实编辑器提供的大多数菜单操作,在代码里面都是能够找到对应接口的,但是这些接口都没有对我们开放,怎么办? 很简单,直接使用反射调用即可. 首先使用Reflector或I ...
- C# Unity依赖注入利用Attribute实现AOP功能
使用场景? 很多时候, 我们定义一个功能, 当我们要对这个功能进行扩展的时候, 按照常规的思路, 我们一般都是利用OOP的思想, 在原有的功能上进行扩展. 那么有没有一种东西, 可以实现当我们需要扩展 ...
- Unity在Android和iOS中如何调用Native API
本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调 ...
- mvc4 web-api 与unity搭建接口
对于接口重要的应该是 功能实现,合法性验证,性能监控,日志等模块 通过unity aop功能可以实现统一的日志模块和性能监控. 1.新建mvc4 webapi项目 nuget添加 unity 3.0+ ...
- Unity起步-1.1下载和安装Unity
1.1.下载和安装Unity 1.1.1 选取版本 首先找到Unity官方网站https://store.unity.com/cn,如果要下载最新版本,可以选择"立即下载".不过我 ...
- 【Unity3D技术文档翻译】第1.9篇 使用 Unity AssetBundle Browser tool (AssetBundle系列完结)
上一章:[Unity3D技术文档翻译]第1.8篇 AssetBundles 问题及解决方法 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced D ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- CustomYieldInstruction 自定义中断指令
ActionScript3脚本引擎为了方便热更新逻辑开发,提供的从脚本继承Unity类库功能在一些情况下可以提供开发的便利. 这次来建立一个示例,演示一下如何在脚本中自定义协程中断指令 Unity中的 ...
随机推荐
- css如何将content、background、background-image生成的背景进行翻转
方法 transform: scaleX(-1); 本例是水平翻转180度,方向可修改X为Y/Z. 注意如果是content,需要设置display: inline-block/block;
- LaTex【五】latex导入中文包,支持中文显示
\documentclass{article} \usepackage{CJKutf8} \begin{document} \begin{CJK}{UTF8}{gbsn} 中文样例,UTF-8编码,字 ...
- Git ignore 失效 忽略已经提交推送远程的文件不生效
因为这个文件已经被纳入版本管理中了 所以需要删掉. 1.先把需要忽略的文件暂存下来.再到.gitignore 添加要忽略的文件的路径 2.再删除本地的缓存 在 git bash 执行 git rm - ...
- navicat 远程连接不上mysql
1 查看是否开启远程连接(拿root用户举例) use mysql; select host, user from user; 以上便是开启远程连接,如果依旧不能连接,参考如下: grant all ...
- 【ADB命令】安装app
在电脑上安装以下指令 adb install app的文件位置
- 在CentOS7中安装Redis
一.检查操作系统中是否安装gcc依赖 [root@192 bin]# yum list installed gcc 如果出现上面图片内容则是已经安装.(由于我是安装了的,所以会存在) 二.安装gcc- ...
- jmeter dubbo测试
一.环境准备 1.安装jmeter 2.安装dubbo插件,下载地址jmeter-plugins-dubbo, 将jar包放入${JMETER_HOME}\lib\ext路径下,重启即可 二.添加一个 ...
- github秒变vscode
方法一:github.sth -> github1s.sth 方法二:github保持登录状态,然后是英文输入法,点击'.'就行
- Hadoop高可用集群存在的一些共性问题
Hadoop高可用集群存在的一些共性问题 1.NameNode 偶然性挂掉 问题原因: 用群启脚本启动HA集群,启动过程中NameNode要依赖于JournalNode,所以在启动过程中, Nam ...
- netty库包冲突问题
参考 http://www.yayihouse.com/yayishuwu/chapter/1603 报错信息:Caused by: java.lang.NoSuchFieldError: netty ...