UE5 - NPC对话系统实现教程(附:实现字幕UI)
作者:hangge | 2025-11-10 09:54
本文将使用父类、子类与自定义事件、数组、数据表、结构体等多个知识点制作一个简单的 NPC 对话系统。通过使用继承功能创建不同的 NPC 蓝图,有继承关系的 NPC 蓝图只需要在父类中规定好对话框架,再在子类中修改对话内容,就可以快速让不同的 NPC 有不同的对话,不需要为每一个 NPC 都写一个对话系统。










(7)使用同样的方法新建一个“输出行”变量。














1,准备工作
首先我们需要创建一个可操作角色,命名为“BP_ControlledCharacter”,具体实现过程参考我之前写的文章:
2,准备对话数据
(1)在“内容浏览器”面板中新建一个结构体并命名为“STASide”,需要以这个结构体作为数据表的行结构。

(2)双击打开“STASide”结构体,需要用两个变量分别代表对话内容与对话时间。因为无法确定对话的数量,所以数组变量是较好的选择。新建两个数组变量,一个是“文本”型的“Text”另一个是“浮点”型的“Delay”。

(3)在“内容浏览器”面板中新建一个以“STASide”结构体为行结构的数据表格,将其命名为“Data_STASide”。

(4)这里我准备两个 NPC 的对话内容。双击打开数据表,新建 2 行数据并分别设置“行命名”为“A”“B”在“Text”与“Delay”数组变量中添加对话内容和对话时间,序列与序列对应。

3,实现字幕 UI
(1)新建一个控件蓝图并命名为“UI_Subtitle”。双击打开控件蓝图,在“控制板”面板中找到“画布面板”子控件并将其拖曳到“层级”面板,然后再添加“文本”子控件到“层级”面板中。

(2)选中“文本”子控件,在“细节”面板中设置“锚点”在正下方。

(3)设置“对齐”为“对齐到中间”,打开“文本”右侧的“绑定”下拉列表,单击“创建绑定”按钮新建一个函数绑定。

(4)拖曳“Return Value”引脚到空白处,执行“提升为变量”菜单命令新建一个变量,将变量命名为“CurrentText”。

(5)回到“UI_Subtitle” 控件蓝图的“事件图表”面板,在“事件构造”节点后连接“获得数据表行”节点,设置“Data Table”为“Data_STASide”

(6)拖曳“Row Name”引脚到空白处并执行“提升为变量”菜单命令新建一个变量。
- 选择变量后在“细节”面板中勾选“可编辑实例”与“生成时公开”选项。

- 最后结果如下:

(8)接着新建一个“整数”型变量并命名为“CurrentIndex”,完成后编译并保存蓝图。

(9)最后添加如下完整逻辑:
- 拖曳“输出行”变量到“事件图表”面板中,使用“中断 STASide”节点拆开“STASide”结构体。
- 添加“GET”节点,连接其“数组”引脚到“中断 STASide”节点的“Text”引脚,连接“整型”引脚到新建的“Current Index”变量,用输出引脚连接“Current Text” 引脚。
- 再次添加“GET”节点,并连接“Delay”引脚和“Curent Index”变量,将输出引脚连接到“延迟”节点。
- 使用“LENGTH”节点连接“Text”引脚,将得到的值减去 1 后使用“Compare Int”节点与“Current Index”节点做比较,如果当前播放的索引等于最大索引,就结束此控件的运行。
- 如果小于,则说明还没有播放完毕,此时可以在“<”引脚处连接“++”节点,将“Current Index”变量连接到“++”节点后,连接输出引脚至“SET”节点,完成循环。
- 播放结束后删除此控件,在“SET”节点后添加“从父项中移除”节点。

5,创建 NPC 父类
(1)建一个“角色”类蓝图并命名为“ASide_Master”,这个蓝图是所有 NPC 蓝图的父类。

(2)双击打开“ASide_Master”蓝图,单击“变量”按钮回新建一个“文本”型变量并命名为“TitleName”。

(3)创建一个“自定义事件”节点并命名为“Chat”。添加“创建控件”节点,设置“Class”为“UI Subtitle”,连接“Title Name”变量到“Row Name”引脚。因为文本不能直接转换为行名称,所以可以使用“转换为字符串”节点连接变量到“Row Name”

(4)进入“ASide Master”蓝图的“组件”面板,选择网格体组件后在“细节”面板中设置“骨骼网格体”为“SK_Mannequin”。同时设置组件的“变换”参数,使角色朝着箭头指向的方向。

(5)在“组件”面板中选择胶囊体组件,在“细节”面板中设置“碰撞预设”为“Custom”,设置“Visibility”为“阻挡”。

6,创建 NPC 子类
(1)使用鼠标右键单击“ASide_Master” 蓝图,执行“创建子蓝图类”菜单命令,新建两个子类蓝图并分别命名为“ASideA”和“ASideB”

(2)打开“ASideA”“ASideB”蓝图,分别设置 2 个蓝图的自我组件的“Title Name”为“A”“B”,与数据表中的名称对应。


(3)完成后编译并保存蓝图,拖曳“ASideA”“ASideB”这 2 个蓝图到关卡中。

7,添加对话触发逻辑
(1)首先我们需要有一个可以移动的人物,具体可以参考我前面写的文章:
(2)然后打开前文创建的“BP_ControlledCharacter”这个角色控制蓝图类,添加如下逻辑:
- 在蓝图中使用“E" 节点连接“按通道进行球体追踪”节点,使用“获取 Actor 位置”节点得到角色的当前位置并连接该节点的“Return Value”引脚到“Start”引脚;同时使用“获取 Actor 向前向量” 节点得到向前向量,将向前向量乘以 400.0 的结果与当前位置相加,最后将结果连接到“End”引脚。
- 使用“中断命中结果”节点连接“Out Hit”引脚,设置“Radius”为 50.0,从“中断命中结果”引脚转换到“ASide_Master”蓝图,这样就可以直接调用“ASide_Master”蓝图中的“Chat”函数了。

8,运行测试
(1)编译并保存后进入 PIE 运行模式,对着 NPC 按下 E 键就会显示该 NPC 对应的字幕。

(2)并且在等待预设的时间后,会自动显示下一句内容。

全部评论(0)