当前位置: 首页 > news >正文

28.UE5实现对话系统

目录

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.lryc.cn/news/495587.html

相关文章:

  • Redis中的分布式锁(步步为营)
  • CentOS 7安装mysql+JDK+Tomcat完成流程
  • C++笔记之不同框架中事件循环的核心函数:io_run()、ros_spin()、app_exec()
  • C++异常处理
  • 【数据结构】哈希 ---万字详解
  • 4399大数据面试题及参考答案(数据分析和数据开发)
  • 快速理解倒排索引在ElasticSearch中的作用
  • C++趣味编程玩转物联网:基于树莓派Pico控制无源蜂鸣器-实现音符与旋律的结合
  • 《RuoYi基于SpringBoot+Vue前后端分离的Java快速开发框架学习》系列博客_Part4_三模态融合
  • springboot365高校疫情防控web系统(论文+源码)_kaic
  • STM32 USART串口数据包
  • 【LC】3232. 判断是否可以赢得数字游戏
  • Linux基础学习--vi与vim
  • JavaScript 高级教程:异步编程、面向对象与性能优化
  • qt QToolBox详解
  • 翁知宜荣获“易学名师”与“国学文化传承人”称号
  • 20241128解决Ubuntu20.04安装libwxgtk3.0-dev异常的问题
  • sql分类
  • stm32里一个定时器可以提供多路信号吗?
  • Java安全—原生反序列化重写方法链条分析触发类
  • 2023考研王道计算机408数据结构+操作系统+计算机组成原理+计算机网络
  • YOLOv8-ultralytics-8.2.103部分代码阅读笔记-files.py
  • 「Mac畅玩鸿蒙与硬件34」UI互动应用篇11 - 颜色选择器
  • ELK(Elasticsearch + logstash + kibana + Filebeat + Kafka + Zookeeper)日志分析系统
  • 07.ES11 08.ES12
  • linux一键部署apache脚本
  • 2022 年 6 月青少年软编等考 C 语言三级真题解析
  • MySQL - Why Do We Need a Thread Pool? - mysql8.0
  • Linux互斥量读写锁
  • 网络安全之IP伪造