Unity功能模块一对话系统(5)-完善对话流程及功能
现在我们的文本仍然是单句显示的,这还不是我们想要的效果,本期让我们完善对话流程,并使用SO(ScriptableObject)来进行一段对话序列的配置和动态加载。
最终效果功能展示
功能一:场景内可根据资源序号ID来动态加载对话数据
功能二:按空格进行下一句,如果当前对话未打印完毕,按下空格则快进直接显示全部文本。
功能三:支持对话中可委托触发
这里碍于篇幅我会分析几个类中的部分关键点,关键的功能源码在后文。
一.功能分析
1.DialogueDataSequence
对话数据SO类
职能
创建SO文件,易于配置对话数据。
注意类前需要使用特性[CreateAssetMenu()]
示例代码
[CreateAssetMenu(menuName = "编辑器界面的创建目录", fileName = "创建出的文件的名称")]
using System;
using System.Collections.Generic;
using UnityEngine;[CreateAssetMenu(menuName = "Data/DialogueDataLine", fileName = "DialogueDataLine")]
public class DialogueDataSequence : ScriptableObject
{[Header("对话线ID")]public int ID;[Header("自动下一句")]public bool canAutonNext;[Header("可以快进")]public bool canQuickShow;[Header("打字机效果")]public bool needTyping;[Header("当前话语序号")]public int currentIndex;[Header("淡入时间")]public float fadeDuration;[Header("对话线")]public List<DialogueData> dialogueLine = new List<DialogueData>();
}[Serializable]
public class DialogueData
{[Header("讲述者")]public string speaker;[Multiline][Header("内容文本")]public string content;
}
2.DialoguePanel
对话框面板
对话框面板无需考虑当前是哪个对话序列,只接收显示的必要信息。
职能
显示一句对话文本信息
关键字段
[Header("高级文本")]public AdvancedText displayText;[Header("文本讲述者")]public TMP_Text speakerNameText;//可以快速显示bool _canQuickShow;//自动显示下一句bool _canAutonNext;
关键函数
/// <summary>/// 显示对话框/// </summary>/// <param name="speaker">讲述者</param>/// <param name="content">内容</param>/// <param name="needTyping">使用打字机效果</param>/// <param name="fadeDuration">打印间隔</param>/// <param name="canQickShow">快速显示</param>/// <param name="canAutonNext">自动下一句</param>public void ShowDialogue(string speaker, string content, bool needTyping = true, float fadeDuration = 0.2f, bool canQickShow = true, bool canAutonNext = false) {speakerNameText.text = speaker;speakerNameText.GetComponent<Animator>().SetTrigger("Show");if (displayText.text != "") {displayText.TextDisAppear();}_canQuickShow = canQickShow;_canAutonNext = canAutonNext;if (needTyping)StartCoroutine(displayText.ShowText(content,E_DisplayType.Typing,fadeDuration));elseStartCoroutine(displayText.ShowText(content,E_DisplayType.Fading,fadeDuration));}
3.DialogueManager
对话管理器
职能
1.持有对当前对话序列SO文件的引用。通过外部传入的序列号加载目标对话序列。
2.开启和关闭对话框面板。
3.操作当前的对话序列(如添加对话委托)
关键字段
[Header("当前进行的对话序列")]public DialogueDataSequence currentDialogueSq;DialoguePanel D_Panel;//对话面板
功能函数
1.BeginDialogueSequence()
暴露开始对话及开始下一句对话接口,若下一句已经是最后一句,则关闭对话框。
/// <summary>/// 根据对话线的ID开启一段对话/// </summary>/// <param name="ID">对话线序号</param>/// <param name="action">对话委托</param>public void BeginDialogueSequence(int ID, Action action = null){//加载目标对话序列,获得其引用currentDialogueSq = Resources.Load<DialogueDataSequence>("StaticData/DialogueLine/" + ID);currentDialogueSq.currentIndex = 0;action?.Invoke();//接收对话委托UIManager.Instance.ShowPanel<DialoguePanel>(panel =>{
//开启对话框,从对话序列的开始显示对话文本内容panel.ShowDialogue(currentDialogueSq.dialogueLine[currentDialogueSq.currentIndex].speaker, currentDialogueSq.dialogueLine[currentDialogueSq.currentIndex].content,currentDialogueSq.needTyping, currentDialogueSq.fadeDuration,currentDialogueSq.canQuickShow, currentDialogueSq.canAutonNext);D_Panel = panel;});Debug.Log(currentDialogueSq.currentIndex);ActionCheck();}/// <summary>/// 每结束一句对话时检查是否有委托需要执行/// </summary>void ActionCheck(){for (int i = 0; i < currentDialogueSq.eventList.Count; i++){if (currentDialogueSq.eventList[i].eventIndex == currentDialogueSq.currentIndex){currentDialogueSq.eventList[i].MyEvent?.Invoke();Debug.Log("检测到对话事件触发!");}}}
2.NextDialogue()
当前对话序列内索引自增,显示下一句对话
/// <summary>/// 用于隐藏当前文本并显示下一句文本,用于外部调用(如面板或按钮)/// </summary>public IEnumerator NextDialogue(){if (currentDialogueSq.currentIndex + 1 < currentDialogueSq.dialogueLine.Count){currentDialogueSq.currentIndex++;D_Panel.ShowDialogue(currentDialogueSq.dialogueLine[currentDialogueSq.currentIndex].speaker,currentDialogueSq.dialogueLine[currentDialogueSq.currentIndex].content,currentDialogueSq.needTyping, currentDialogueSq.fadeDuration,currentDialogueSq.canQuickShow, currentDialogueSq.canAutonNext);Debug.Log(currentDialogueSq.currentIndex);ActionCheck();}else{EndDialogueSquence();//结束对话}yield return null;}/// <summary>/// 结束一段对话序列/// </summary>void EndDialogueSquence(){currentDialogueSq?.eventList.Clear();currentDialogueSq = null;UIManager.Instance.HidePanel<DialoguePanel>();}//退出游戏重置对话状态
private void OnApplicationQuit()
{currentDialogueSq?.eventList.Clear();currentDialogueSq = null;
}
由于我个人框架的实现与UI部分联系密切的问题,考虑给出完整源码文章会过于冗余且侧重点失衡,上面分享的是我实现过程中的关键功能片段,需要朋友们结合实际应用适配到自己的项目中,原理的大致通用的,当然上述代码某些地方肯定是能够进一步优化拓展的,也欢迎大佬不吝赐教。
二.实验结果测试
1.测试脚本
using UnityEngine;
public class TMPTest : MonoBehaviour
{[Header("对话序号")]public int dialogueID;private void Update(){if (Input.GetKeyDown(KeyCode.E)){DialogueManager.Instance.BeginDialogueSequence(dialogueID, () =>{DialogueManager.Instance.AddDialogueEvent(1, 2, T1);DialogueManager.Instance.AddDialogueEvent(1, 4, T2);});}}void T1(){Debug.Log("对话内事件1触发");}void T2(){Debug.Log("对话内事件2触发");}
}
2.数据配置
这里我挂载了测试脚本,并配置了一段对话数据,序号为1
三.实验结果展示
打印效果:
对话中事件触发效果:
三.后文
由于我个人框架的实现与UI部分联系密切的问题,考虑给出完整源码文章会过于冗余且侧重点失衡,上面分享的是我实现过程中的关键功能片段,需要朋友们结合实际应用适配到自己的项目中,原理的大致通用的,当然上述代码某些地方肯定是能够进一步优化拓展的,也欢迎大佬不吝赐教。
本篇完!
相关文章:
Unity功能模块一对话系统(5)-完善对话流程及功能
现在我们的文本仍然是单句显示的,这还不是我们想要的效果,本期让我们完善对话流程,并使用SO(ScriptableObject)来进行一段对话序列的配置和动态加载。 最终效果功能展示 功能一:场景内可根据资源序号ID来…...
Ubuntu 系统中安装 Nginx
步骤 1:更新软件包列表 在安装前,先更新系统软件包列表: sudo apt update步骤 2:安装 Nginx 通过 apt 直接安装 Nginx: sudo apt install nginx -y步骤 3:验证安装 安装完成后,检查 Nginx …...
Elasticsearch:使用 Azure AI 文档智能解析 PDF 文本和表格数据
作者:来自 Elastic James Williams 了解如何使用 Azure AI 文档智能解析包含文本和表格数据的 PDF 文档。 Azure AI 文档智能是一个强大的工具,用于从 PDF 中提取结构化数据。它可以有效地提取文本和表格数据。提取的数据可以索引到 Elastic Cloud Serve…...
如何 编译 px4
DeepSeek-R1满血版 回答完成 深度思考完成 用时27秒,搜索全网29篇资料 以下是详细的PX4固件编译教程,综合多平台及常见问题解决方案: 一、环境准备 系统要求 Ubuntu 20.04/22.04(推荐)或 MacOS 12 Windo…...
pycharm2024.1.1版本_jihuo
目录 前置: 步骤: step one 下载软件 step two 卸载旧版本 1 卸载软件 2 清除残余 step three 下载补丁 step four 安装2024.1.1版本软件 step five 安装补丁 1 找位置放补丁 2 自动设置环境变量 step six 输入jihuo码 前置: 之…...
LLaMA Factory微调后的大模型在vLLM框架中对齐对话模版
LLaMA Factory微调后的大模型Chat对话效果,与该模型使用vLLM推理架构中的对话效果,可能会出现不一致的情况。 下图是LLaMA Factory中的Chat的对话 下图是vLLM中的对话效果。 模型回答不稳定:有一半是对的,有一半是无关的。 1、未…...
Vulnhub:Digitalword.local: FALL靶机渗透
将靶机按照图中连接方式打开,fall在virtualBox中打开 信息收集 扫描得ip arp-scan -l 扫描端口 nmap -A -T4 -sV -p- 扫描目录 gobuster dir -u http://192.168.117.160 -x php,txt,html -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt 一个一个…...
androidstudio安装完成后创建新的示例项目编译报错解决
项目场景: 提示:这里简述项目相关背景: 安装完成android studio想要编译一个自带的demo项目,没想到一直有编译报错,最后终于搞好了,记录下避免再踩坑。 androidstudio安装完成后创建新的示例项目编译报错…...
C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿、推荐…...
QT 跨平台发布指南
一、Windows 平台发布 1. 使用 windeployqt 工具 windeployqt --release --no-compiler-runtime your_app.exe 2. 需要包含的文件 应用程序 .exe 文件 Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll 等 Qt 库 platforms/qwindows.dll 插件 styles/qwindowsvistastyle.dll (如果使…...
数制——FPGA
1、定点数 定点数的三种表示方式: 原码:符号位 绝对值 表示方法 反码:正数的反码表示 与原码表示一致,负数的反码表示 除符号位,其他位全都取反 补码:正数的补码表示 与原码表示一致,负数的补码…...
车载以太网网络测试 -25【SOME/IP-报文格式-1】
1 摘要 本专题接着上一专题对SOME/IP进行介绍,主要对SOME/IP报文格式以及定义的字段进行详细介绍,有助于在实际项目过程中对SOME/IP报文的理解。 上文回顾: 车载以太网网络测试 -24【SOME/IP概述】 2 SOME/IP-报文格式 通过上个专题介绍&a…...
Kubernetes》》k8s》》Replication Controller
RC(Replication Controller) 应用托管在kubernetes之后,kubernetes需要保证应用能够持续运行,这是RC的工作内容,它会确保任何时间kubernetes中都有指定数量的Pod在运行。在此基础上,RC还提供了一些更高级的特性,比如滚…...
力扣HOT100之矩阵:73. 矩阵置零
这道题我没有想到什么好的办法,直接暴力AC了,直接遍历两次矩阵,第一次遍历用两个向量分别记录出现0的行数和列数,第二次遍历就判断当前的元素的行数或者列数是否出现在之前的两个向量中,若出现了就直接置零,…...
天锐蓝盾终端安全防护——企业终端设备安全管控
从办公室的台式电脑到员工手中的移动终端,这些设备不仅是工作的得力助手,更是企业数据的重要载体。然而,随着终端设备的广泛使用,安全风险也如影随形。硬件设备使用不当、数据随意传输等问题频发,使得企业数据面临着泄…...
【博客】使用GithubAction自动同步obisidian和hexo仓库
使用Github Action自动同步obisidian和hexo仓库,避免手动操作。 本文首发于❄慕雪的寒舍 1. 烦恼 先来说说慕雪现在的笔记和博客是怎么管理的吧,我正在使用两套笔记软件 思源笔记:私密性高一些,不是博客的笔记都在这里面。由于思…...
UE5学习笔记 FPS游戏制作23 区分敌我,寻找敌对角色
文章目录 方法1 tag方法2 变量添加变量和函数防止队友伤害 修改Task使用球形检测查找敌人场景面板直接编辑属性 方法1 tag 角色蓝图身上有一个tag标签,可以通过标签内容区分队伍 通过ActorHasTag判断一个Actor是否有对应的标签 方法2 变量 添加变量和函数 在s…...
ECharts各类炫酷图表/3D柱形图
一、前言 最近鸡米花实现了各类的炫酷的图表,有3D柱形图、双边柱形图以及异形柱形图,好了,直接上图: 二、效果图 一个个来吧,下面就是代码啦,注意,一下图表展示的宽高均为800px*300px 三、异形横…...
AI基础03-视频数据采集
上篇文章我们学习了图片的数据采集,今天主要了解一下视频数据采集的方法。视频是由一系列图像构成的,其中每一张图片就是一帧。视频数据采集方法通常有自动图像采集和基于处理器的图像采集两种。我们学习一下如何利用python 工具和笔记本计算机摄像头进行…...
docker-compose部署prometheus+grafana+node_exporter+alertmanager规则+邮件告警
目录 一.docker-compose文件 二.配置文件 三.文件层级关系,docker-compose和配置文件位于同级目录 四.node_exporter页面json文件 五.效果展示 prometheusalertmanager邮件告警 grafana面板效果 六.涉及离线包 一.docker-compose文件 [rootsulibao prometh…...
CPM:大规模生成式中文预训练语言模型
摘要 预训练语言模型(PLMs)已被证明对各种下游自然语言处理(NLP)任务有益。最近,GPT-3 以 1750 亿参数和 570GB 训练数据引起了广泛关注,因为它具备少样本(甚至零样本)学习的能力。…...
k8s scheduler几种扩展方式的关系及区别
网上关于scheduler扩展介绍的文章很多,但都是东说一句西说一嘴,完全没有逻辑性,对于逻辑建构者看着很痛苦,这篇文章不会深入教你怎么扩展,而是教你几种扩展方式的关系和逻辑结构: 目前Kubernetes支持五种方…...
Spring Boot 3.4.3 基于 SpringDoc 2 和 Swagger 3 实现项目接口文档管理
在现代企业级应用开发中,前后端分离已成为主流模式,前端负责界面呈现,后端专注提供 RESTful API 接口。然而,接口文档的编写和维护往往是开发过程中的痛点。Spring Boot 3.4.3 结合 SpringDoc 2 和 Swagger 3,为开发者…...
前端D3.js面试题及参考答案
目录 解释 D3.js 中 enter ()、update ()、exit () 的作用及典型应用场景 描述数据连接(Data Join)的原理,如何通过 data () 方法实现数据集与 DOM 元素的动态绑定? 如何利用 datum () 实现单个元素的数据绑定?与 data () 有何区别? 在动态数据更新时,如何通过 merge…...
Docker实现MySQL主从复制配置【简易版】
Docker实现MySQL主从复制配置 环境准备 安装docker 拉取MySQL 8.0镜像 docker pull mysql:8.0#检查 docker images | grep mysql代码流程 由于Mysql8.0的ssl验证十分繁琐,在创建容器的时候一定要禁掉 创建自定义网络 docker network create mysql-replication-ne…...
IDEA中打开项目Vue+Vue基本语法
一、IDEA中打开项目 1.IDEA中安装Vue基本插件 2.项目结构 项目根目录 node_modules : npm 加载的项目依赖模块 public : 存放静态资源,如图片、视频等。 src : 项目源码目录,包含主要的开发文件。 index.html : 首页入口文件,可以添…...
【深度学习新浪潮】图像修复(Image Inpainting)技术综述:定义、进展与应用展望
本文为精简版,完整技术细节与参考文献可与作者讨论。 1. 图像修复的定义与核心目标 图像修复(Image Inpainting)是一种通过算法手段填补图像中缺失区域或移除不需要对象的技术,其核心目标是利用图像上下文信息生成与周围像素一致且视觉自然的内容。该技术通过计算机视觉和…...
【实战】解决图片 Hover 抖动问题的完整指南
在开发网站时,很多人都会遇到一个常见问题:鼠标移动到图片上,图片放大,结果发生抖动或闪烁。这个问题往往伴随着后端接口请求、JS 动态追加 DOM 等复杂行为。 本文将深入剖析这个问题的成因,并提供一套彻底的解决方案…...
java容器
一、List 接口实现类 1. ArrayList 特性:基于动态数组实现,支持快速随机访问(时间复杂度 O(1)),但插入/删除元素时需移动后续元素(时间复杂度 O(n)) 一、核心方法分类 添加元素 add(E e):尾部追加元素,均摊时间复杂度O(1)add(int index, E element):指定位置插入…...
arthas之jvm相关命令
文章目录 1. dashboard2. thread线程相关3. jvmTHREAD相关文件描述符相关 4. sysprop5. 小结6. sysenv7. vmoption8. getstatic9. ognl10. 小结 1. dashboard 作用:显示当前系统的实时数据面板,按q或ctrlc退出 数据说明 ID: Java级别的线程IDÿ…...
UDP视频传输中的丢包和播放花屏处理方法
在处理UDP视频传输中的丢包和花屏问题时,需要结合编码优化、网络传输策略和接收端纠错技术。以下是分步骤的解决方案: 1. 前向纠错(FEC,Forward Error Correction) 原理:在发送数据时附加冗余包,接收方通过冗余信息恢复丢失的数据包。 实现方法: 使用Reed-Solomon、XO…...
蓝桥杯 班级活动
问题描述 小明的老师准备组织一次班级活动。班上一共有 n 名同学(n 为偶数),老师想把所有同学进行分组,每两名同学一组。 为了公平,老师给每名同学随机分配了一个 n 以内的正整数作为 id,第 i 名同学的 i…...
Open webui的使用
问题 之前本地量化模型管理器ollama的文章,我们知道可以通过ollama来管理本地量化模型,也能够在命令行中与相关模型进行对话。现在我们想要在有个web页面通过浏览器来与本地模型对话。这里我们就使用Open webui作为界面来与本地模型对话。 安装启动 这…...
页面重构过程中如何保证良好的跨浏览器一致性?
在页面重构的过程中,为了确保网页能够在不同的浏览器中呈现一致的效果,我们需要采取一系列措施来提高跨浏览器的一致性。以下是几个关键步骤和技术要点: 使用标准化的HTML和CSS:始终遵循最新的Web标准编写代码,例如采用…...
Python库与Excel
目录 一、库 1、Python自带的库 2、第三方库 3、第三方库的安装 二、import的用法 三、datetime库 1、处理日期 2、处理时刻 3、局限性 四、random库 1、函数 2、随机种子 3、发牌模拟器 五、jieba库 六、openpyxl库 1、表格读取 2、表格元素遍历 3、工作表的…...
记录一下最近参与实习 外包 社招流程里的一些感悟
记录一下最近参与实习 外包 社招流程里的一些感悟 1.简历门面要重视 1.简历非常重要,它是你的门面 初步了解到你的一个实习/工作经历,然后掌握的技术栈,是否与当前项目匹配,哪些模块上的设计是我们想要重点关注的,可…...
流动的梦境:GPT-4o 的自回归图像生成深度解析
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
HarmonyOS NEXT开发进阶(十四):HarmonyOS应用开发者基础认证试题集汇总及答案解析
文章目录 一、前言二、判断题(134道)三、单选题(210道)四、多选题(123道)五、拓展阅读 一、前言 鸿蒙原生技能学习阶段,通过官方认证的资格十分有必要,在项目实战前掌握基础开发理论…...
Visual Studio Code(简称 VS Code)下载与使用教程1(新建文件,语法高亮,快捷键,主题,快捷指令)
简介 由 微软(Microsoft) 开发的 免费、开源、跨平台 的 代码编辑器,广泛用于编程开发、文本编辑和调试。 主要功能 代码编辑:支持几乎所有编程语言(Python、JavaScript、Java、C、Go 等),提供…...
3.28前端模拟面试
针对你 1.5 年的前端经验,结合 Vue 3、TypeScript、微前端(qiankun)等背景,我准备了一套模拟面试题,偏向场景化问题,考察你的实战经验和思维能力。 一、工程化 & 架构 你们的前端项目使用 qiankun 做微…...
pip 安装某个包之后,Jupyter Lab仍旧显示包冲突;例如:Numba needs NumPy 2.1 or less. Got NumPy 2.2.
异常提示 Numba needs NumPy 2.1 or less. Got NumPy 2.2. --------------------------------------------------------------------------- ImportError Traceback (most recent call last) Cell In[8], line 53 import pywt4 import matplot…...
Python:爬虫概念与分类
网络请求: https://www.baidu.com url——统一资源定位符 请求过程: 客户端,指web浏览器向服务器发送请求 请求:请求网址(request url);请求方法(request methods);请求头(request header)&…...
flask开发中设置Flask SQLAlchemy 的 db.Column 只存储非负整数(即 0 或正整数)
如果你想控制一个 Flask SQLAlchemy 的 db.Column 只存储非负整数(即 0 或正整数),你可以在模型中使用验证来确保这一点。一种常见的方法是使用模型的 validate 方法或者在执行插入或更新操作时进行检查。 以下是实现这一目标的几种方法&…...
从0到1解决项目问题经验-Vue3前端
问题1: 我有文件里面这么一段代码,但是现在有个问题,就是在设备信息详情的抽屉页面中,当我首次点击查看的时候,显示的物流中心名称现在是跟"deviceInfo.logisticsCenterName"做的绑定,于是现在显…...
Vue.js的CSS过渡与动画:常用案例解析
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...
【论文阅读】Co2l: Contrastive continual learning
原文链接:[2106.14413] Co$^2$L: Contrastive Continual Learning 阅读本文前,需要对持续学习的基本概念以及面临的问题有大致了解,可参考综述: Wang L, Zhang X, Su H, et al. A comprehensive survey of continual learning: …...
Python给对象数组排序
文章目录 1. 使用sorted()函数(返回新的排序后的列表)2. 使用list.sort()方法(原地排序,不返回新列表)3. 如果数据结构是集合(set),集合本身是无序的,无法直接排序&#…...
Docker-清理容器空间prune
docker system prune -a 是一个非常有用的命令,用于清理 Docker 系统中未使用的资源,包括停止的容器、未使用的网络、卷以及未被任何容器引用的镜像(悬空镜像和所有未使用的镜像)。以下是关于该命令的详细说明: 命令…...
Kubernetes》》K8S》》Deployment 、Pod、Rs 、部署 nginx
Deployment deployment文档说明 kubectl get rs,deployment,pods 删除pod 、deployment 、service # 如果只删除pod,deployment会自动重建,所以应该先删除deployment。 # 下面演示的是删除所有deployment,可以指定只删除某个 # 删除所有…...
【Zookeeper搭建】Zookeeper分布式集群搭建完整指南
Zookeeper分布式集群搭建 (一)克隆前准备工作 一、时钟同步 步骤: 1、输入date命令可以查看当前系统时间,可以看到此时系统时间为PDT(部分机器或许为EST),并非中国标准时间。我们在中国地区…...