28.UE5实现对话系统

ops/2024/11/30 5:09:27/

目录

1.对话结构的设计(重点)

2.NPC对话接口的实现

2.1创建类型为pawn的蓝图

2.2创建对话接口

3.对话组件的创建

4.对话的UI设计

4.1UI_对话内容

4.2UI_对话选项

 4.3UI_对话选项框

5.对话组件的逻辑实现


通过组件蓝图,也就是下图中的那个东西,实现对话系统

对话系统的实现思想:在角色面前判断一个球形中所有实现了对话接口的Pawn,如果该Pawn实现了对话接口,则显示该Pawn的姓名(走到一个角色面前会显示他叫什么),然后点击他的姓名会开始后续的对话。

首先创建一个第三人称游戏项目

1.对话结构的设计(重点)

难点(对话结构的理解)

定义我们的对话的结构(使用结构体定义)

一个是文本类型的回答选项,一个是命名类型的回复

 并且为其创建对话表。

定义:对话行,一个对话行包括,回答选项(数组)和回复(数组),但是一个回答选项,对应一个回复(索引对应)。一个回复即是NPC需要回复的内容,又是下一轮对话的索引。

 整体的对话的逻辑如下:

1.走到角色面前,显示NPC姓名

当角色走到甘雨面前时,会弹出第一行的回答选项(甘雨),

2.点击姓名开始对话

点击甘雨后,NPC回复(怎么了?旅行者。)

3.显示能选择的对话选项,并产生后续对话

并同时将(怎么了?旅行者。)作为命名搜索这个表,找到行命名为(怎么了?旅行者。)的哪一行同时创建回答选项(风魔龙怎么打?深渊怎么走?可以和我出去逛逛吗?)三个选项,三个选项对应三个回复,三个回复作为命名,再去寻找后续的对话行

2.NPC对话接口的实现

2.1创建类型为pawn的蓝图

2.2创建对话接口

创建对话功能的,接口蓝图

返回NPC总类,并将自身返回出去

然后生成NPC总类的子蓝图,

并为子蓝图,绑定对话数据表格,和NPC的姓名

3.对话组件的创建

创建对话组件

4.对话的UI设计

对话中的UI主要包含三种,NPC显示回复内容的(UI_对话内容),生成对话选项的(UI_D对话选项框),还有每一个选项对应的按钮(UI_对话选项)

4.1UI_对话内容

选中对话文本,提升为变量

该UI控件只有一个方法,就是更新对话内容,并显示

4.2UI_对话选项

添加三个公开,变量,

对话组件:构造这个对话选项的时候,拿到对话控件,告诉对话控件,本次回复的对话索引是多少。

对话选项:显示这个按钮中的对话文本

该对话索引的索引:这条对话选项,对应的索引(一个对话选项对应一个回复)

在构造时,显示该选项的对话文本

点击按钮时,告诉对话组件,该条回复的索引是什么

打开对话组件,实现一下,设置当前回复索引

 4.3UI_对话选项框

选中覆层的(大小到内容),当有对话选项的时候,就可以自适应选择框的大小了

样式如下:

将对话选项框提升为变量

在图表中添加一个变量

 

该UI控件也只有一个自定义事件,事件的输入是文本类型的数组,就是(对话选项),拿到对话选项的数组后,更新我们的对话框中的选项

5.对话组件的逻辑实现(重点)

打开对话组件

在开始事件时,创建一个定时器事件,每一秒获取一下前面的可交互的对象,以及初始化一下对话的内容框,和选项框UI

初始化内容框和选项框中的图表

接下来实现,每一秒获取前面的对象信息

获取对话对象中的图表

获取组件的拥有者,对其前面75像素为球心,75像素为半径的范围,进行多球体判断,将所有的pawn找出来。

将查找失败的支线,输出,方便后面使用

将所有命中结果遍历,并将实现了对话功能的对象取出,执行接口中的函数,获取对话对象,将获取的对象提升为变量

获取对象陈工后,后续的对话情景和显示对话对象都是针对这个对象的,所以使用do once只执行一次

获取对话情景

如果没有检测到对象,则不显示UI

显示对话对象,(这个时候当前这句话,对应甘雨对话表的第一句,回复选项只对象名称(甘雨)),这个时候靠近我们的可对话对象,就会显示对象的名称

如4.2所讲,点击回答按钮后,执行会将按钮的索引传递过来,按钮的索引对应这当前回复的索引

然后调用更新对话内容,对整个对话内容进行更新

根据索引,更新NPC的对话内容

整体逻辑大致的差不多如下图所示

难点在于,回答的选择,对应了一条NPC的回复,NPC会根据这条回复,再去查找下一次的对话内容


http://www.ppmy.cn/ops/137834.html

相关文章

node.js.抓取代理ip(提供参考)

我们示范来使用node.js结合axios库(用于发起HTTP请求)来抓取某代理IP网站上的代理IP列表的示例代码(示例仅供参考,实际中不同网站结构不同需相应调整解析逻辑),这里只是简单示意抓取过程,真实使…

扫雷-完整源码(C语言实现)

云边有个稻草人-CSDN博客 在学完C语言函数之后,我们就有能力去实现简易版扫雷游戏了(成就感满满),下面是扫雷游戏的源码,快试一试效果如何吧! 在test.c里面进行扫雷游戏的测试,game.h和game.c…

Redis开发03:常见的Redis命令

1.输入以下命令,启动redis。 sudo service redis-server start 如果你是直接安装在WSL的,搜索栏搜索Ubuntu或者点击左下角Windows图表找到U那一栏,直接打开Ubentu,输入账密后,输入“sudo service redis-server start”…

【MySQL】MySQL中的函数之JSON_ARRAY_APPEND

在 MySQL 8.0 及更高版本中,JSON_ARRAY_APPEND() 函数用于在 JSON 数组的指定位置追加一个或多个值。这个函数非常有用,特别是在你需要在 JSON 数组的末尾或特定位置添加新的元素时。 基本语法 JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ..…

Java高级教程:数据结构、集合框架、ArrayList与LinkedList深度解析

🚀 作者 :“码上有前” 🚀 文章简介 :Java 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 标题 Java高级教程:数据结构、集合框架、ArrayList与LinkedList深度解析 摘要 Java作为一种…

Java基础面试题08:Java中Exception和Error有什么区别?

在Java中,Exception 和 Error 是异常处理体系的两大核心概念。要理解它们的区别和应用,咱们可以逐步剖析。 Exception和Error的基础区别 共同点: 两者都继承自 Throwable 类,只有 Throwable 类型的实例才能被 throw 或 catch。 区…

基于Python的飞机大战复现

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

sd webui整合包怎么安装comfyui

环境: sd webui整合包 comfyui 问题描述: sd webui整合包怎么安装comfyui 扩展安装不成功 解决方案: 1.直接下载 ,解压到SD文件夹里(或者git拉一下) 2.ComfyUI模型共享:如果本机部署过Webui,那么ComfyUI可以与WebUI公用一套模型,防止复制大量模型浪费空间 将…