在解谜类游戏中,与npc的对话是一个基础且常用的功能。通常来说,在与npc的对话中玩家可以获取一些有价值的信息并对之后的游戏有一定的导向作用。此外,在玩家获取对应物品前后,与npc的对话内容也会发生相应改变。因此,我们需要将对话系统进行封装,以便于在不同的npc身上进行使用,同时要预留接口,后期可以增加或修改对话内容。
这里我们以Cotton Puzzle为例,将对话系统拆分为数据、逻辑和UI三部分来实现。在游戏中,获取物品前后与老太太的对话显示如下:

一、数据

首先,添加数据创建目录

//DialogData.cs
[CreateAssetMenu(fileName = "DailogData", menuName = "Dialog/DailogData")]

创建列表用于存储对话内容

//DialogData.cs
public class DialogData : ScriptableObject
{public List<string> dialogList;
}

之后,单机右键依次选择Create -> Dialog -> DialogData创建一个空的数据集

在所创建的数据集中输入对话内容,如下:

二、逻辑

利用栈来存储对话数据,每次在需要进行对话时首先将当前状态设置为isTalking并禁用场景切换的操作,之后每一次点击老奶奶便从栈中弹出一条对话内容进行显示。在完成对话之后将isTalking设置为false并重新将数据压入栈中。

1.定义数据存储和状态变量

//DialogController.cspublic DialogData dialogEmpty;public DialogData dialogFinish;private Stack<string> dialogEmptyStack = new Stack<string>();private Stack<string> dialogFinishStack = new Stack<string>();public bool isTalking;

2.在游戏一开始时将数据压入栈中

//DialogController.csprivate void Awake(){FillDialogStack();}public void FillDialogStack(){for(int i=dialogEmpty.dialogList.Count-1;i>=0;i--){dialogEmptyStack.Push(dialogEmpty.dialogList[i]);}for (int i = dialogFinish.dialogList.Count - 1; i >= 0; i--){dialogFinishStack.Push(dialogFinish.dialogList[i]);}}

3.定义协程,根据不同状态显示不同对话内容

    public void ShowDialogEmpty(){if (!isTalking)StartCoroutine(DialogRoutine(dialogEmptyStack));}public void ShowDialogFinish(){if (!isTalking)StartCoroutine(DialogRoutine(dialogFinishStack));}private IEnumerator DialogRoutine(Stack<string> data){isTalking = true;//Debug.Log("DialogRoutine协程开始");if (data.TryPop(out string result)){//Debug.Log("开始对话");EventHandler.CallShowDialogEvent(result);yield return null;EventHandler.CallGameStateChangedEvent(GameState.Pause);//暂停游戏}else{EventHandler.CallShowDialogEvent(string.Empty);FillDialogStack();EventHandler.CallGameStateChangedEvent(GameState.GamePlay);//暂停游戏}isTalking = false;}

三、UI

在DialogUI 中注册ShowDialogEvent ,当对话未完成时(即dialog 不为空)将panel设置为active,当对话结束以后便关闭panel。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class DialogUI : MonoBehaviour
{public GameObject panel;public Text dialogText;private void OnEnable(){EventHandler.ShowDialogEvent += ShowDialog;}private void OnDisable(){EventHandler.ShowDialogEvent -= ShowDialog;}private void ShowDialog(string dialog){if (dialog != string.Empty)panel.SetActive(true);elsepanel.SetActive(false);dialogText.text = dialog;}
}

Unity游戏开发:对话系统的实现相关推荐

  1. Unity游戏开发大师班

    大小解压后:8.63G 持续时间19h 包含项目文件 1280X720 MP4 语言:英语+中英文字幕(根据原英文字幕机译更准确) Unity游戏开发大师班 信息: 要求 –没有课程要求,展示了开发过 ...

  2. 最全面的Unity游戏开发指南视频教程 第2卷

    最全面的Unity游戏开发指南视频教程 第2卷 流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小 ...

  3. Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动

    Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动 使用cookie类型的纹理模拟云层的移动 现实生活中,当阳光直射大地,而天空中又有很多云时,云层的影子总是会投射在大地上,风吹着 ...

  4. Unity 游戏开发技巧集锦之创建透明的材质

    Unity 游戏开发技巧集锦之创建透明的材质 Unity创建透明的材质 生活中不乏透明或者半透明的事物.例如,擦的十分干净的玻璃,看起来就是透明的:一些塑料卡片,看起来就是半透明的,如图3-23所示. ...

  5. Unity 游戏开发技巧集锦之创建部分光滑部分粗糙的材质

    Unity 游戏开发技巧集锦之创建部分光滑部分粗糙的材质 创建部分光滑部分粗糙的材质 生活中,有类物体的表面既有光滑的部分,又有粗糙的部分,例如丽江的石板路,如图3-17所示,石板的表面本来是粗糙的, ...

  6. Unity 游戏开发技巧集锦之创建自发光材质

    Unity 游戏开发技巧集锦之创建自发光材质 创建自发光材质 自发光材质(self-illuminated material)是指自己会发光的材质.生活中与之相似的例子,就是液晶显示屏上显示的信息,文 ...

  7. ​Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机

    ​Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机 Unity中制作一个望远镜 本节制作的望远镜,在鼠标左键按下时,看到的视图会变大:当不再按下的时候,会慢慢缩小成原来的视图.游戏中时常出现 ...

  8. Unity游戏开发技巧集锦2.1.3实现效果

    Unity游戏开发技巧集锦2.1.3实现效果 将此脚本加到Camera对象上,选中此对象,即可查看对象上此脚本组件中的各项属性,如图2-4所示. 图2-4  对象脚本组件里的各项属性          ...

  9. 删除 jar 的 asset_【unity游戏开发】SDK学习(1)-C#与jar交互

    引言 通常一款游戏开发到后期,一般都会涉及到第三方SDK的接入与集成 对于不熟悉SDK接入的同学来说,接SDK每次都是云里雾里, 而熟悉SDK接入的同学又觉得不断地重复做接入SDK工作这样没有成就感, ...

  10. 关于Unity游戏开发方向找工作方面的一些个人看法

     这是个老生常谈,却又是谁绕不过去的话题,而对于每个人来说,所遇到的情况又不尽相同,别人的求职方式和路线不一定适合你,即使是背景很相似的两个人,有时候机遇也很重要. 我本人的工作经验只有一年,就业方式 ...

最新文章

  1. 两圆重叠问题你会求解吗?这个问题的准确答案,德国数学家最近才找到
  2. python画散点图类型-python画时间序列散点图
  3. python基础知识面试题-基础篇--【python】面试题汇总
  4. Android新闻类导航栏
  5. 【个人成长】数据分析——证书
  6. mysql标准时间,MySQL时间设置
  7. 【qduoj - 夏季学期创新题】C语言课程设计-阶梯问题(dp,高精度大数)
  8. 源码编译安装gcc-5.3.0
  9. Java简单高精度合集
  10. 前端三大框架 Vue.js、AngularJS、React 的区别
  11. Python类常用的魔术方法
  12. sqlyog 注册码
  13. 计算机通信的应用,计算机技术在通信中的应用
  14. Windows基础篇学习(上)
  15. android 373dpi对应的布局,[荣耀6X BLN-AL10] EMUI5.0 B373 自定义DPI 来电闪光 接听 录音 核心控制 性能调节 游戏模式 稳定精简顺畅等...
  16. 关于定点数、原码、反码、补码的理解
  17. 《机器学习基础》学习笔记-1
  18. M1安装gradle查看版本后失败的解决办法
  19. JS实现百度地图搜索悬浮窗功能
  20. Rails sanitize

热门文章

  1. python练习-word操作(word字体替换)
  2. 3.3 神策数据分析平台
  3. 计算机专业英语词汇pdf,计算机专业英语词汇大全(完美打印版).pdf
  4. 论文阅读_ICD编码_MSMN
  5. ansible部署管理k8s
  6. vue调用企业微信API详细过程
  7. 16QAM的理论误码率仿真
  8. java分页及返回数据封装实例
  9. Web 全栈工程师的自我修养
  10. 关闭绿联硬盘盒子自动休眠的方法!