这一篇记录制作简单的对话界面和交互
下篇:
NPC actor蓝图组件
- 创建一个actor蓝图
- 添加一个骨骼网格体组件,设置为npc模型的骨骼网格体
- 添加一个胶囊碰撞体,调整大小为和模型差不多大,作为NPC的碰撞体
- 在胶囊碰撞体的细节面板中找到碰撞,碰撞预设改成BlockAll,角色可迈上去改成否
- 再添加一个胶囊碰撞体,范围大一些,这个区域作为玩家可以进行对话交互的范围
- 碰撞预设改成OverlapAllDynamic(默认)
蓝图接口
创建两个蓝图接口,两个蓝图接口的内容都保持默认,只需要修改默认节点的命名
- dialogue,用于传递对话开始
- movement,用于传递对话结束
玩家character蓝图
- 打开玩家的角色蓝图,选择类设置,在细节面板中找到接口,添加movement接口蓝图
- 选择事件图表,编写下图中的节点。
当按下F键时,如果此时玩家和npc蓝图中设置的范围有重叠(filter指定了只判断npc的actor蓝图),并且该对象实现了dialogue接口的节点,那么将move设为false(禁止移动),然后调用dialogue接口触发对话。- Get Overlapping Actors: Class Filter选择NPC的蓝图
- Does Implement Interface: Interface选择dialogue接口蓝图
- Move: 新建一个bool变量(用于控制玩家是否能移动,在对话中禁止移动)
- Event Movement: movement接口中的函数名
- Talk: dialogue接口中的函数名
- 在玩家有关移动和跳跃的节点中添加branch,当移动被允许时才会触发
用户控件蓝图
创建两个用户控件蓝图(用户组件-控件蓝图)
-
对话框
添加一个panel,在其中加入两个text作为名字和说话内容分,两个image作为黑色的背景和橙色的分割线。
image的图像设置为材质,材质按下图方式创建,其中材质域设置为用户界面,混合模式为半透明。对于对话框背景,我使用从上到下逐渐透明的材质。
两个text需要在细节面板中勾选isVariable选项。
位置和大小通过锚点、偏移和尺寸进行调整。
-
对话提示
按照相似的方法创建一个用户控件蓝图作为可对话提示,text勾选isVariable。
NPC动画蓝图
- 添加一个状态机节点连接到output pose
- 状态机包括待机和对话两个动画
- 将待机和对话的动画分别连接到两个状态
- 添加一个bool变量IsInDialogue,用于状态切换,默认值为false
- 将变量和not处理的变量分别连接到两个状态切换条件上
NPC actor蓝图
打开NPC的actor蓝图
- 类设置中添加dialogue接口
- 创建变量
- name: string
- talkIndex: int
- dialogue: string数组
- 当玩家进入对话范围时在屏幕上显示对话提示
- Create WBP Interact Widget: 在Return Value上右键点击提升为变量,将新的变量设置为对话提示的接口蓝图(对象引用)
- prompt: 对话提示的接口蓝图(对象引用)变量
- 对话部分
- 当进入对话时切换角色动画
Event talk: dialogue接口中的函数,触发对话
IsInDialogue: 在NPC动画蓝图中定义的bool变量,用于动画切换
- 每次点击F键触发talk事件,切换到下一句对话,通过index和对话文本数组的长度判断对话是否结束
- branch的true分支连接
如果对话界面没有显示则创建Widget并显示,同时移除对话提示界面的显示。
将对话文本和名字显示到对应变量位置。
- branch的false分支连接
对话结束后将对话文本的索引设置为初始值-1,重新显示对话提示界面,并且将用于切换NPC对话动画的bool变量设为false。
参考链接:
https://www.youtube.com/watch?v=hbs0xaNOeA0