在众多RPG等游戏中,对话框系统显然属于不可或缺的一部分。玩家通过对话了解剧情以及接下来的主线。可以说,对话系统就是RPG游戏的灵魂(bushi,而这个文章介绍的对话系统可以在无需插件并且完成对话系统基本功能的同时完成以下三点内容:
1.剧情内容只用按照规律写在txt文件里
2.可以选择跳过,自动播放或者手动播放
3.文字会一个一个显示,而不是整句话蹦出来
撒,那我们开始把(
搭建对话框
按照以往经验,对话框肯定要包括对话信息框,角色的头像和名字。然后我在此基础上还要实现自动播放,跳过,所以加了两个按钮。如果还要其它功能可以自己再加。。。我直接简单搭了一个:
其中对话框主体直接在canvas的最下面加了panel,角色名称,对话内容分开来各用一个text(因为到时候要随着角色的改变而改变),并且以panel为父物体。(这个没什么难度,直接简写了)
注意!:
无论要怎么改,对话框物体一定要设置锚点卡在屏幕的各个角落,否则会因为屏幕尺寸发生变化而偏移!
锚点设置方法:点击红箭头指的按钮,按住alt键,选择要固定在屏幕的哪个地点。
构建基础功能
要实现基础功能,就要通过三个流程:
1.将txt文本文件导入列表
2.将列表内的台词依次播放,同时根据角色的转变而变换头像
3.判断结束对话并且把所有对话框组件setactive改为false
先是声明的各种物体代码:
1 | [Header("UI组件")] |
接着进unity把每个组件都挂载一下(具体是啥我在注释都写了,所以就不贴图了)
将txt文本文件导入列表
在说明代码前先把txt的格式说明一下(为什么这样之后再说):
1 | A |
先贴上代码:
1 | void GetTextFromFile(TextAsset file) |
总而言之就是:重置之前用过的台词和数据,处理文本文件,用回车键分割一句句台词,然后把台词录入列表以供对话系统使用。
注意:
在调用时要放在Awake函数里,因为Awake函数是一启用脚本就开始运行,而这个工序也要一经使用就开始运行。我的脚本调用是这样:
1 | void Awake() |
将列表内台词播放
注意:看懂这段代码需要学习unity协程函数的知识,如果之前没有听过建议百度学习一下或者等我的文章更新(算了我天天鸽还是别等了)
单个句子的播放
还是贴代码(这个代码实现的只是单个句子的播放,而不是整个对话):
1 | IEnumerator SetTextUI() //协程函数的标准形式 |
其中yield return
的意思就是,在这一帧return,并且在下一帧继续开始。如果看不懂的话还是建议百度一下unity协程函数。这样的话不用放进update函数里面也可以实现延时等效果。(暴论)
常见问答(bushi):
为什么判断是角色名字后不直接跳出函数,而是继续打出呢?
因为txt里面角色名字后面一定是角色说的话而不是另一个角色的名字,所以可以直接不需要判断而进入循环。同时在写txt剧情时也要注意:哪有一个角色还没讲话就出现另外一个角色的道理哼哼啊啊啊啊啊
为什么角色名字后面要加/r?
因为在windows的txt文本中,每次回车都会有\r的存在。如果要判断是不是角色名就一定要加上\r,除非你不是拿windows做游戏。
整个对话文本的播放
还是先贴代码:
1 | void Update(){ |
常见问答(bushi):
为什么要设置一个textFinished的布尔值?
因为如果不设置的话前面一句还没有看完下一句的台词直接来了,这样会严重影响读者的阅读体验,所以我决定直接卡死不让玩家快进。
结束播放对话文本
依旧是先贴上代码:
1 | public void EndDialogue() |
这样一个完整的对话就结束了。
但是如何实现对话的自动手动播放,以及跳过播放呢?
完成增值功能:
实现跳过对话的功能
这活儿很简单,只要把脚本放进空物体,然后把按钮按下的脚本挂载进并选择EndDailogue函数里就可以了。
实现自动手动播放的功能
这个功能其实比较简陋,因为我目前还没有尝试在每句话结束后调节时间的功能,只是把每个字播放的顺序调慢而已。(请大神轻喷)
还是代码:
1 | void Update() |
说起来这个功能还是比较简陋,它的是否是自动手动的判定机制仅仅是判断点击按钮的次数是奇数还是偶数,按钮每次点击也只是计算点击次数的变量+1,但是它就是这么实现了?就很怪
再次提醒一下,AutoPlay函数要挂载进按钮里面,挂载方式和之前跳过对话的按钮一样,否则无法实现功能。
就这样差不多就完成了,虽然小编也很惊奇,但是对话框系统就是这样完成了。有疑惑的小伙伴欢迎在评论区留下点赞评论吧!我们下期再见!(你是营销号吗??)
友情链接:
大多数代码以及思想借鉴的视频:https://www.bilibili.com/video/BV1WJ411Y71J
(Michael真的很强,建议初学者都去康康他的视频嗷)
若没有本文 Issue,您可以使用 Comment 模版新建。