目的:创建一个能控制对话框出现以及对话内容的脚本,在角色与npc下相距较近时,可以通过按下e键,进行下一步对话。

附加内容:如果加入了任务系统,在接任务时玩家多次点击e跳过了对话,而没有明白任务要求,因此再次接近npc按e时,应该能重复说明任务要求,即重复文本的最后一句话,另外,一个npc可能有多套文本内容,要能够在各内容间切换

演示视频

方案:

1.储存对话内容

采取xml文件储存,原因:方便,一个角色对应的文本内容属于其子元素,引用c#提供的库即可对内容进行读取。另外,已有采取xml的教程,便于实现,在此感谢知乎用户5hT89p

的教程用Unity创建一个对话系统 - 知乎 (zhihu.com)

<?xml version="1.0" encoding="UTF-8"?>
<Root>
<girl>
<suit>
<line>hello</line>
<line>come here</line>
<line>go to fight a monster</line>
</suit>
<suit>
<line>you win!</line>
<line>go to open the box</line>
<line>just continue to adventure,bye</line>
</suit>
</girl>
</Root>

上述文本中有两套对话内容,一套是接取任务时:

hello

comehere

go to fight a monster

另一套是完成任务后:

you win!

go to open the box

just continue to adventure,bye

感谢菜鸟教程,让我了解xml并能够写出上述代码

XML 元素 | 菜鸟教程 (runoob.com)

2.对话内容的控制

首先,要从xml读出来文本,并存入二维数组content,二维的原因是一个npc有多套对话内容,一套对话占一行,多套就要多行了。

private List<List<string>> content=new List<List<string>>();
void Start(){XmlDocument xml = new XmlDocument();xml.Load(Application.dataPath + "/dialog/content.xml");        XmlNode xmlNode = xml.SelectSingleNode("Root" + "/" + transform.name);       foreach (XmlNode x1 in xmlNode.ChildNodes){List<string> my = new List<string>();foreach (XmlNode x2 in x1.ChildNodes){my.Add(x2.InnerText);}content.Add(my);                }        }

其次,切换文本内容,并显示到对话框

需要考虑两点,一是只有当角色靠近时,才会显示对话框,因此需要在代码中加入距离判断。二是有的npc可能一直可以对话,但有的npc只能对话一次,就不再能交互,因此需要设置一个public的flag,便于区分这两类npc。

IEnumerator nextWord(){if (Input.GetKeyDown(KeyCode.F)){nextOrNot = true;}if (Input.GetButtonDown("Submit") && Mathf.Abs(player.transform.position.x - transform.position.x)<effectDist){         if(nextOrNot){                whichSuit++;whichString = 0;nextOrNot = false;}if (whichSuit < content.Count){if (whichString < content[whichSuit].Count){panel.SetActive(true);words.enabled = true;words.text = content[whichSuit][whichString];whichString++;}else{panel.SetActive(false);words.enabled = false;if (alwaysHasWord){                        whichString--;}else{this.enabled = false;                      }                    }}else{panel.SetActive(false);words.enabled = false;}yield return new WaitForSeconds(.2f);}else if(Mathf.Abs(player.transform.position.x - transform.position.x) > effectDist){panel.SetActive(false);words.enabled = false;}yield return null;}

为了能找到具体要说哪句话,设置int型whichSuit,和whichString作为二维数组的索引,定位到要说的话,alwaysHasWord就是决定角色是否重复最后一句话的标志位,为了能重复最后一句话,因此判断,如果alwaysHasWord为真,那么将索引减去1,仍在在二位数组有效范围内(实际是该行的最后一列对应的字符串,即最后一句话)。

为什么使用协程?

因为在写脚本中,总能发现因为getButtonDown执行了不止一个帧,这样就会导致文本的连续跳过,因此使用协程,在按下e后,总要等待0.2s,才能再次执行nextWord(),跳转到下一句话

unity实现对话控制相关推荐

  1. 集合语音识别、音频蓝牙、对话控制多功能一体的WTK6900H-32N眼部按摩器应用设计方案

    现代社会,生活形态多样化,工作节奏紧张化,因长时间低头追剧.玩游戏.伏案工作等不健康生活习惯,导致眼睛长期处于一种高负荷的状态,处于亚健康的人群也越来越多,严重影响生活质量.如何在忙碌的作息中保证生活 ...

  2. 语音对话控制智能家居系统

    语音对话控制智能家居系统 介绍 后端使用到了onenet.讯飞语音.图灵接口 实物图 演示链接(提取码:xszp) 项目源码 转载于:https://my.oschina.net/OneNb/blog ...

  3. Unity全局音量控制以及音量信息存储在本地

    Unity全局音量控制以及音量信息存储在本地 一个简单的全局音量控制功能,主要实现进入游戏音量同步以前的设置,点击设置弹出设置窗口,点击小喇叭禁用\开启音量,移动滑动条调节音量大小. 一.进入游戏时设 ...

  4. 详解Unity的移动控制实现

    前言 上一篇写了数种Unity中的移动方式,有物理移动,有非物理移动等,这篇我们来谈谈Unity中的移动控制方式,来结合上一篇所说的方法,用起来.一般控制是通过获取用户输入来处理角色移动逻辑的,而用户 ...

  5. unity 机械臂控制(一)

    unity 机械臂控制 基本原理 机械臂的控制主要是通过控制父节点的旋转,带动子节点移动,子节点的旋转再带动自己的子节点移动以此类推.每个节点的旋转单一,通常是水平方向和垂直方向,即x轴旋转和y轴旋转 ...

  6. unity玩家血量控制,定时掉血,道具加血

    unity玩家血量控制,定时掉血,道具加血 首先将玩家,加血道具,掉血道具添加进场景中 为玩家挂接碰撞体和刚体 而两种道具只需要挂接碰撞体 下面是玩家的挂接脚本 using System.Collec ...

  7. unity 2D动画控制一些小技巧

    一.以下是直接获取动画控制器中的某个动画状态的长度. 使用代码: AnimatorExt.GetClipLength(m_Animator, "Run") public stati ...

  8. unity学习:控制人物的移动

    目录 一.导入 代码 代码使用分析 二.使用Input.GetKey来获取键盘中按下的键 代码 代码使用分析 三.获取水平输入与竖直输入 代码 代码使用分析 四.帧为参照改为秒为参照 代码 代码使用分 ...

  9. Unity第三人称控制实现方式

    第三人称移动,主要两个部分,一是人物,二是相机. 先说人物,unity其实提供了一个CharacteController组件可以方便地用于控制人物移动,但是这个组件会与刚体冲突.如果使用Charact ...

最新文章

  1. JavaScript 语法基础
  2. php获取分辨率赋值,php如何获取客户端分辨率?实例教程
  3. drupal 6.0 入门教程
  4. 史上最全站点降权原因解析
  5. 在myeclipse中建立maven项目
  6. c语言不安全库_C语言中不安全的库函数及解决方案
  7. [暴力]JZOJ 5842 a
  8. @RequestBody 接收数组、List 参数、@Deprecated 标记废弃方法
  9. 《HTML CSS JavaScript 网页制作从入门到精通 第3版》—— 2.8 其他标记
  10. mysql之家_MySQL
  11. Java使用iText PDF导出PDF文档
  12. MarkDown 编辑器字体改颜色大小等常用操作
  13. 45岁了社保交了25年不交了行吗?
  14. 2020.9.20深圳湾-莫安迪摄影原创作品
  15. 6 cocos2dx粒子效果,类图关系,系统原生粒子和自定义粒子效果,粒子编译器软件,爆炸粒子效果,烟花效果,火焰效果,流星效果,漩涡粒子效果,雪花效果,烟雾效果,太阳效果,下雨效果
  16. 网络协议之socket协议详解之Unix domain Socket
  17. Adobe Illustrator Mac使用教程
  18. pl sql迁移oracle,Oracle数据库安装及使用PLSQL数据迁移
  19. 红帽linux安装docker,在CentOS7.6、红帽7.6系统中安装Docker:只需3条命令
  20. epub与txt的区别是什么?有什么好用的epub阅读器

热门文章

  1. php微信转发无法显示标题图片,解决微信公众号分享朋友圈不显示标题图片描述的方法...
  2. 安徽省2019c语言二级答案,安徽省计算机等级二级考试真题C语言.doc
  3. c语言syslog日志记录
  4. python手机号码标记_python 判断号码是否可用(号码过滤)
  5. html+css+js 简易笔记
  6. 非安全系列教程 NPM、PYPI、DockerHub 备份
  7. php项目部署在腾讯云服务器,腾讯云服务器部署
  8. 笔记本电脑wifi连接网络不能上网有感叹号
  9. cosx绝对值的积分
  10. 郑州轻工业大学OJ python 1060: 逆序数字