Bootstrap

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会根据这条回复,再去查找下一次的对话内容

;