Unity游戏开发:对话系统的实现

在解谜类游戏中,与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创建一个空的数据集
创建数据
在所创建的数据集中输入对话内容,如下:
Empty
Finish

二、逻辑

利用栈来存储对话数据,每次在需要进行对话时首先将当前状态设置为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;}    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/62050.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

王小川大模型25天再升级!13B版本开源免费可商用,3090即可部署

衡宇 金磊 发自 凹非寺量子位 | 公众号 QbitAI 就在刚刚&#xff0c;王小川的开源大模型又有了新动作—— 百川智能&#xff0c;正式发布130亿参数通用大语言模型&#xff08;Baichuan-13B-Base&#xff09;。 并且官方对此的评价是&#xff1a; 性能最强的中英文百亿参数量开源…

苹果手机免越狱群控电脑端控制手机

据小编了解 &#xff0c;手机群控这个词一直受网上争议&#xff0c;那么今天小编也在这讨论一下&#xff0c;其实群控系统分很多&#xff0c;市面上有主板机群控&#xff0c;所谓的主板机群控系统是指把手机的主板全部集中到一个机箱控制&#xff0c;但这个就会留下很多弊端&am…

人工智能是否会取代人类的工作岗位?

跨国投资银行高盛预测&#xff0c;人工智能将取代3亿个全职工作岗位。依据是人工智能可以创造出与人类创建的内容无法区分的高水准内容。同一时期&#xff0c;IBM首席执行官阿文德克里希纳以人工智能聊天机器人可以取代7,800名员工为由停止了招聘。IBM并不是唯一一家“毫不犹豫…

第一位计算机科学博士诞生 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 2 月 9 日&#xff0c;在中国&#xff0c;今天是道家学派创始人老子的诞辰和清代著名女词人顾太清的生日&#xff1b;在日本&#xff0c;写出《我是猫》的知名作…

用 100 行代码揭开 LLM 集成工具 LangChain 的神秘之处!

整理 | 王子彧 责编 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; LangChain 是一个强大的程序框架&#xff0c;它允许用户围绕大型语言模型快速构建应用程序和管道。它直接与 OpenAI 的 GPT-3 和 GPT-3.5 模型以及 Hugging Face 的开源替代品&…

The missing quarter of a million 消失的25万 | 经济学人20230311版社论高质量双语精翻

文 / 柳下婴&#xff08;微信公众号&#xff1a;王不留&#xff09; 本期我们选择的是3月11日《经济学人》周报封面文章&#xff0c;即社论区&#xff08;Leaders&#xff09;的首篇文章&#xff1a;《25万英国人消失之谜》&#xff08;“The missing quarter of a million”&a…

哈佛计算机系王牌项目,要请AI来当导师了

克雷西 发自 凹非寺量子位 | 公众号 QbitAI 近日&#xff0c;哈佛宣布了一个重磅决定&#xff1a;AI导师将进入课程。 负责的还是计算机系的旗舰项目——计算机科学导论&#xff0c;也就是著名的CS50。 借助机器人导师&#xff0c;哈佛的CS50项目将拥有1:1的师生比。 这一消息是…

哈佛计算机系王牌项目,要请AI来当导师了!

来源 | 量子位 作者 | 克雷西 近日&#xff0c;哈佛宣布了一个重磅决定&#xff1a;AI导师将进入课程。负责的还是计算机系的旗舰项目——计算机科学导论&#xff0c;也就是著名的CS50。借助机器人导师&#xff0c;哈佛的CS50项目将拥有1:1的师生比。 这一消息是CS50项目导师Da…

机器学习吴恩达课程总结(一)

文章目录 1. 第一章 简介1.1 机器学习&#xff08;Machine Learning&#xff09;1.2 有监督学习&#xff08;Supervised Learning&#xff09;1.3 无监督学习&#xff08;Unsupervised Learning&#xff09; 2. 第二章 线性回归&#xff08;Linear Regression&#xff09;2.1 假…

吴恩达NLP课程资料

NLP_wuenda 1.简介 吴恩达老师在2020年6月份推出了NLP课程&#xff0c;Natural Language Processing Specialization  本人忙里偷闲将老师的视频和作业都完成了&#xff0c;后续会持续更新课程的资料和作业。目前NLP课程一共分为四门&#xff0c;每门课程会分为三&#xff08…

吴恩达新课程:ChatGPT提示工程,ChatGPT Prompt Engineering for Developers

来源&#xff1a;专知 本文为课程介绍&#xff0c;建议阅读5分钟 您将学习如何使用大型语言模型(LLM)快速构建新的和强大的应用程序。 https://learn.deeplearning.ai/chatgpt-prompt-eng/lesson/1/introduction 在ChatGPT Prompt Engineering for Developers中&#xff0c;您将…

python 用户登录,密码错误3次则锁定该用户

需求&#xff1a; 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 实现思路&#xff1a; 判断用户是否在黑名单&#xff0c;如果在黑名单提示账号锁定&#xff0c;然后退出操作。 判断账号密码是否正确&#xff0c;如果正确则正常登录。如果不正确有三次输入密码机会…

Git 密码输入错误解决方案

前言&#xff1a;有时候我们不小心输入了密码&#xff0c;想要重新输入一次&#xff0c;但是始终找不到重新输入的提示框&#xff0c;这是因为 Windows缓存了我们的Git账号密码作为凭证&#xff0c;帮助我们下次自动登录 修改Git凭证 总结&#xff1a;控制面板 -> 用户账户…

使用git时输错密码解决办法

在使用git在clone项目的时候出现了让输入用户名和密码,然而密码输入错误导致项目clone不下来.. 解决办法:找到在控制面板\用户帐户\凭据管理器\windows凭据\ 里面删除原来的密码&#xff0c;删除后就可以重新输入密码了 输入正确的密码就可以clone了

Linux中标麒麟操作系统下,多次密码输入错误后账户被锁定的解决方法

错误描述 账户在登陆时&#xff0c;输入密码错误次数超过限制&#xff0c;账户就会被锁定。此后&#xff0c;即使密码输入正确&#xff0c;也不能正常登陆。 解决方法 1、使用root账号登陆系统 root账号需要点击“未列出”&#xff0c;在出现的提示框中输入root&#xff0c;…

关于密码输错三次后锁定登录

前言 用户登录输错密码三次将自动锁定该用户&#xff0c;本章用mybatisplus 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、数据库展示 数据库字段展示 erroeNum为错误次数&#xff0c;isLock&#xff1a;0未锁定&#xff0c;1&#xff1a;锁定…

linux(ubuntu)用户连续N次输入错误密码进行登陆时,自动锁定X分钟

1、编辑PAM的配置文件 sudo vim /etc/pam.d/login在第二行添加 auth required pam_tally2.so deny3 unlock_time5 even_deny_root root_unlock_time10参数介绍 even_deny_root 也限制root用户&#xff1b; deny 设置普通用户和root用户连续错误登陆的最大次…

用户正确输入密码会累计错误次数,累计5次后用户锁定

问题描述 提示&#xff1a;遇到的问题&#xff1a; 安全要求用户密码输入错误5次&#xff0c;锁定用户600秒 &#xff0c;安全加固后&#xff0c;反馈openssh后登录pam_tally2.so计数不清零问题&#xff0c;用户输入正确密码pam_tall2依旧会增加错误次数 解决方案&#xff1a; …

Ubuntu用户连续N次输入错误密码进行登陆时自动锁定X分钟

1、编辑PAM的配置文件 sudo vim /etc/pam.d/login在第二行添加 auth required pam_tally2.so deny=3 unlock_time=5 even_deny_root root_unlock_time=10参数介绍 even_deny_root 也限制root用户; deny 设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁…

Git Bash输错账号密码如何重新输入

很多时候我们容易在Git Bash操作的时候&#xff0c;不慎输入错误的用户名或密码&#xff0c;此时一直提示: remote: Incorrect username or password ( access token ) 解决办法&#xff1a; 1.打开控制面板&#xff08;快捷打开winR&#xff0c;输入control&#xff09; 2.…