斯坦福UE4 + C++课程学习记录 9:蓝图-简易开关

目录

1. 前言

2. 创建蓝图类

3. 改变把手角度

4. 打开宝箱


        UE中的蓝图是一种基于C++的可视化编程系统,它将大量常用的底层代码接口暴露出来,方便开发者在UE中快速调用,其可视化的呈现方式让那些不专攻编程的人员(如设计、美工、策划等)也能快速上手使用。从程序开发的角度,学习蓝图可以方便开发中的很多环节;从业务的角度,掌握蓝图也有利于开发和其他环节的同事进行交流。

        本部分的第一个示例,是使用操纵杆开关控制宝箱的开合。

1. 前言

        课程中提到了两个有趣的点可以记录一下:1. 蓝图运行效率比C++慢,但在通常情况下蓝图的速度已经足够;2. 在UE3中,蓝图系统的名字叫“Kismet”,这个名字在相关代码接口中被一直沿用下来。另外,课程中也提到虚幻商场中的“内容示例(Content Examples)”项目,除开包含大量蓝图内容外,在光照、阴影、粒子、声效、数学等等都有大量的应用示例,是个值得下载学习的内容。

图9-1 内容示例项目

         本节将从一个通过操纵杆控制宝箱开合的例子开始,着手学习UE中的蓝图系统。


2. 创建蓝图类

        创建一个基于Actor的蓝图类,命名为“LeverBP”(BP表示Blue Prints),作为示例所需的操作杆。然后打开其蓝图编辑器,利用界面左上角绿色的“添加组件”按钮为它添加两个静态网格体。通过鼠标拖拽,将一个网格体变为根组件,这个操作对应C++中的RootComponent = XXX;语句。

图9-2 改变根控件

然后将父子网格体依次设置为底座和把手,如图9-3所示。这两个模型可通过搜索“switch”得到,其文件包含在ExampleContent文件夹里,该文件夹内容可在第0篇文章中的github链接中找到。进一步,为了后续开发方便,我们可以分别将根控件和子控件重命名为“BaseMesh”和“HandleMesh”。

图9-3 设置静态网格体

        然后调整把手的Pitch值将它从水平变为朝上(把向上定义成操纵杆的关闭状态),并将其拖拽到世界中,为了方便观察效果就放在宝箱旁边。要是觉得悬空违和,也可以放一堵墙在后面。

图9-4 放置操纵杆

        随后,我们开始实现开关的控制功能。实现的思路很简单,在操作杆前按下E键后将把手朝下,然后打开宝箱即可。在上节实现打开箱子这个功能时,我们通过实现SurGamePlayInterface中的Interact函数来实现宝箱打开,因此对于操纵杆这个交互我们同样需要实现这个接口。所以,接下来的操作就是把上一节课中C++代码换成了蓝图操作的版本,大家可以自行将相应步骤进行对照比较。

        在LeverBP的蓝图编辑器 -> 最上方的“类设置” -> “已实现的接口” -> 添加SurGamePlayInterface类,此时在界面左侧“我的蓝图”中就会出现Interact接口。右键Interact接口 -> 实现事件,就会在事件图表中创建相应的节点。

图9-5 添加接口

3. 改变把手角度

        将HandMesh拖拽进事件图表中创建节点,如图9-6从该节点中拖拽以调用Set Relative Rotation函数,从而改变把手的角度。而要改变的角度就用Make Rotator节点来设置,其值取HandleMesh的Pitch值的相反数既可以,如图9-7:

图9-6 添加函数
图9-7 设置角度

        在UE的蓝图系统中,白线是执行线,表示从头到尾依次执行节点;而其他的黄色、蓝色、紫色等都是数据线,表示数据的流向、函数输入输出。于是对上述节点进行连接,如图9-8所示:

图9-8 节点连线

        连接完成后编译运行,查看运行效果,发现把手已经改变角度了:

图9-9 运行测试

        究其原理,是我们在绑定E键的PrimaryInteract中写了判断射线检测对象是否实现Interact的语句:if (HitActor->Implements<USurGameplayInterface>())。我们通过在蓝图中实现Interact,使得代码往下运行,并且传入了操纵杆的HitActor以调用蓝图中实现的内容(更改把手角度)。


4. 打开宝箱

        在左侧“我的蓝图” -> 变量中新建“SelectedActor”,用于存放需要打开的宝箱对象。在其右侧的细节面板中,将“变量类型”从布尔值更改为Actor(蓝色图标),然后勾选“可编辑实例”,编译保存。这样就可以点击世界中的操纵杆模型,并在其右侧的细节面板中更加方便地设置该变量,如图9-11所示。

图9-10 新建变量
图9-11 设置SelectedActor

        将该变量拖入事件图表中,选择获取,如图9-12:

图9-12 创建SelectedActor节点

        回到SurGameplayInterface.h中,将void Interact(APawn* InstigatorPawn);的宏变为UFUNCTION(BlueprintCallable, BlueprintNativeEvent),保存编译,使该接口可以在蓝图中被调用。

        再次回到蓝图中,调用SelectedActor的Interact(消息),连线如图9-13所示。为了调整线条的弯曲程度,可在线条任意位置上双击创建节点,然后就可以通过拖拽来调整线条的弧度。编译保存运行测试:

图9-13 节点连线
图9-14 运行测试

猜你喜欢

转载自blog.csdn.net/surkea/article/details/127167972