Skip to content

Files

Latest commit

676c1a1 · Dec 25, 2021

History

History
417 lines (227 loc) · 47.5 KB

File metadata and controls

417 lines (227 loc) · 47.5 KB

五、使用蓝图编写脚本

我们现在来看这个游戏最重要的一个方面:交互性。没有它,我们的游戏将只是一个玩家可以移动的环境。那些以前使用过 UDK 的人可能已经熟悉了可视化脚本的概念。UDK 有一个叫做的 Kismet,一个强大的可视化脚本工具。这个工具真正吸引人的一个特点是,任何人都可以在没有任何编程知识的情况下使用它。你只需要知道你想要实现的事件背后的逻辑。你甚至不用写一行代码就可以创建一个完整的游戏。

在虚幻 4 中,我们有蓝图,这是对 Kismet 的一种升级。基本设置是一样的:你有各种各样的节点和表达式,你可以用它们来编写游戏中的事件、动作等等。该界面简单易懂,易于使用,但功能极其强大。一旦掌握了窍门,就可以创建复杂的序列和事件。

然而,尽管蓝图是一个易于学习的伟大工具,但它在它能做什么方面仍然是有限的。在这方面,C++比蓝图更加通用和灵活。C++非常适合实现复杂的交互和机制,蓝图可能会也可能不会提供。bluetooth 和 C++的另一个区别是,bluetooth 的执行速度比 C++代码慢得多,但这只有在你的游戏中有很多 bluetooth 脚本的情况下才明显。蓝图和 C++还有其他几个区别;但这一切都归结于个人对游戏中你想要的特性、机制和功能的偏好。您可以选择使用其中一个或两个。

在本章中,我们将涵盖以下主题:

  • 蓝图是什么,它们是如何工作的
  • 什么是级别蓝图,以及如何使用级别蓝图编写脚本
  • 级别蓝图用户界面
  • 蓝图类是什么以及如何在游戏中使用它
  • 如何编写基本人工智能脚本

蓝图如何运作

蓝图中的脚本类似于创建流程图。由您支配的是各种节点,您可以连接这些节点来创建一个动作序列。为了在蓝图中正确编写脚本,您应该首先了解所需序列背后的逻辑。例如,假设您想实现一个灯,当您靠近它时打开,当您离开它时关闭。在这种情况下,您应该首先在灯周围放置一个触发器。那么,这背后的逻辑是:

  1. 如果玩家重叠扳机,灯就会打开。
  2. 如果玩家没有扣动扳机,灯就会熄灭。

既然我们已经知道如何执行这个动作,我们就可以开始设置我们的节点了。假设您的设置如下所示:

How Blueprint works

当角色走进触发框时,天花板灯(聚光灯)打开。打开/关闭灯光的蓝图如下所示:

How Blueprint works

有各种类型的节点你应该知道:

  • Event Nodes: The nodes with the red bar are event notes. These are activated when the corresponding event takes place. They usually have a rightward facing arrow at the top left corner.

    您还有输入事件节点,当玩家给出相应的输入时,它会触发(例如,当玩家按下鼠标左键时发射武器)。

  • Function Nodes: The nodes with the blue top are function nodes. They usually have a function symbol f at the top left corner, as you can see in the preceding screenshot. These nodes perform a specific action on an actor or player.

    有两种类型的函数节点:作用于演员的节点和返回特定值的节点。这些类型的节点有绿色的顶部(截图中未显示)。这包括返回演员在世界上的位置,返回演员的速度等等。

  • 引用或可变节点:截图中间的节点是一个变量节点(或引用)。当你想要一个功能节点作用于场景中的一个特定的演员,或者如果你想要“得到”它的一些属性,你需要在关卡蓝图中创建它的引用。可变节点也是如此。毫不奇怪,变量在编写脚本或编码时扮演着非常重要的角色。因此,当您使用蓝图时,自然需要创建变量。

使用蓝图编写脚本时,请记住节点越少,性能越好。它也让你的工作空间更有条理,更容易阅读。

当一个特定的事件发生时,相应的事件节点向它所连接的节点发射一个脉冲。在我们的情况下,当玩家重叠触发时,它将激活聚光灯的切换可见性功能(由于灯光默认关闭,它将将其切换打开)。当玩家停止叠扣扳机(走出扳机)时,将再次触发切换可见性功能(灯将关闭)。

How Blueprint works

前面的截图展示了当事件发生时蓝图是如何工作的。当玩家重叠触发(左上角)时,相应的事件向切换可见性功能发射一个脉冲,打开灯。当玩家移出触发器或停止重叠时,相应的事件再次向切换可见性功能节点发出脉冲,该功能节点将灯打开。

实际上,只要激活一个节点,就可以看到脉冲被触发。这使得调试变得非常容易,因为您可以看到是哪个节点导致了问题,并相应地进行修复。

除了知道逻辑,还应该知道哪些节点可用,可以用来做什么。这需要时间和练习。

虚幻 4 中有两种蓝图:等级蓝图和蓝图类。

等级蓝图对于 UE4 就像 Kismet 对于 UE3 一样。您在项目文件中创建的每个级别或地图都有自己独特的级别蓝图。您可以使用关卡蓝图控制与关卡相关的一切,例如播放过场动画、编辑关卡中演员的属性(可见性、位置等)等等。

另一方面,蓝图类是包含各种组件和脚本的特殊演员。这些组件包括静态或骨架网格、相机、碰撞组件、触发器和音频组件。通过使用脚本,您可以设置它们的属性,并确定它们如何与世界交互。蓝图类不是特定级别独有的;因此,您可以在项目中制作的任何地图或关卡中使用它们。您也可以将它们导出到其他项目。

让我们继续到水平蓝图的用户界面。

水平蓝图用户界面

以下截图展示了级蓝图的用户界面。继续我们的风格,将用户界面分成不同的部分,界面被分成几个部分,我们将分别进行。

The Level Blueprint user interface

选项卡和菜单栏

标签栏与所有其他窗口中看到的相同。就像在网络浏览器的情况下,你可以看到哪些窗口是打开的,在它们之间交换,并从那里关闭任何你想要的窗口。

The tab and menu bars

菜单栏是您可以访问所需的所有常规命令和操作的地方。

  • 文件:在这个菜单中,你可以保存你的级别,在你的内容浏览器中打开任何素材,编译你的蓝图,启用源代码控制等等。
  • 编辑:从这个菜单,可以执行撤销上一个动作、重做、搜索特定节点或表达式等动作。
  • 查看:在这里可以隐藏/取消隐藏未使用的管脚和未连接的管脚(通过它们连接节点),放大和缩小事件图。
  • 调试:如果在你的蓝图序列中有一个问题你不能弄清楚,你可以使用调试菜单中的可用选项来找到并解决它们。这些包括添加断点、在特定点观察特定变量的值等等。
  • 窗口:这里你可以设置哪些窗口你想看得见,哪些窗口你不想看得见。您可以自定义布局并从“窗口”菜单中保存它。
  • 帮助:从这里,你可以访问史诗关于蓝图的官方文档。您也可以从这里进入维基页面、论坛和答案中心。

工具栏

工具栏 有最常用的动作:

The toolbar

最常用的操作解释如下:

  • 编译:每当在事件图中添加、移除或编辑任何节点时,一定要点击编译 按钮。它编译所有节点和序列,如果有任何错误或警告,它会在编译器结果面板中通知您,然后您可以修复。同样,如果你有一个变量节点,为了设置它的默认值,你首先需要编译。
  • 搜索:当你有几个相连节点的大而复杂的序列时,试图找到一个特定的节点或变量可能是一项繁琐而耗时的任务。为了避免这种情况,您可以点击搜索按钮,输入您想要查找的任何名称。默认情况下,结果将显示在屏幕底部,编译器结果面板在那里(它将打开一个名为查找结果的新选项卡)。
  • 类设置:点击此处的会打开详细面板中的蓝图设置,可以设置添加描述、类别等选项。
  • 类默认值:这里可以设置蓝图类的默认值或初始值。
  • 播放:类似于视口工具栏中的播放按钮的,这将打开一个新窗口,您可以在其中测试您的游戏。游戏运行时,点击 Esc 按钮将关闭游戏并返回编辑器。你可能会注意到按钮旁边有一个向下的小箭头。这将打开一个菜单,您可以在其中设置选项,例如您希望如何预览您的游戏,玩家应该从哪里开始等等。

详细信息面板

详细信息 面板中,可以设置各种节点和变量的属性。它提供了诸如所需变量类型(布尔、浮点、整数等)、变量名称等设置。

The Details panel

编译器结果面板

任何有编程知识的人都会知道什么是编译。当您编写的代码从您编写代码的语言转换为计算机能够理解的机器语言时,就会发生这种情况,以便能够执行。这通常由编译器处理。(如果没有看到编译器结果面板,在级别蓝图中,转到窗口,点击编译器结果。)

The Compiler Results panel

编译器结果面板,可以看到编译器的输出日志。编译花了多长时间,编译过程中发现的任何错误,任何警告等等,都显示在这里。

我的蓝图面板

在该面板中,您可以查看您创建的所有事件、变量和事件调度器的列表。每当你创建一个事件节点,它就显示在这里,在事件图下。除此之外,您还可以创建各种函数、宏、变量等等。为此,您可以点击添加新项按钮并选择您想要创建的内容,或者点击名称前面的 + 按钮。

My Blueprint panel

事件图

位于屏幕中央的事件图(也称为图形编辑器)是您设置节点和序列的地方。默认情况下,已经设置了两个事件节点,即游戏开始时激活的事件开始播放,以及每帧激活的事件勾选。这两个事件不需要激活任何触发器。

The Event Graph

在顶部,你可以看到标签。标签下方的左上角有两个箭头。您可以使用它们在图形之间切换。在中心,您可以看到层次结构和蓝图结构。在最右边,你可以看到缩放比例——换句话说,你放大了多少我们缩小了。

下表列出了事件图中你应该知道和记忆的控件:

|

控制

|

行动

| | --- | --- | | 鼠标左键点击 | 选择节点 | | 左键单击+拖动 | 创建选择框 | | 右键单击 | 打开操作菜单 | | 右键单击+拖动 | 平移图形编辑器 | | 向上滚动滚轮 | 放大 | | 向下滚动滚轮 | 缩小 | | C | 在选定节点周围创建注释框 |

即使它是可视化脚本,当你使用蓝图编写脚本时,它仍然会变得非常混乱。因此,为了避免混乱并保持一切井然有序,建议在节点周围创建注释框。

在游戏中使用关卡蓝图

把所有的基础知识都抛开之后,我们就可以开始编写游戏脚本了。你应该知道的一件事是,我们可能会添加更多的触发器和演员。

关键立方体的拾取和放置

我们要脚本的第一件事是玩家拿起钥匙立方体。现在,当玩家离关键立方体足够近,并在屏幕上点击它时,他们将能够拿起立方体。在我们的例子中,为了给人一种玩家已经拿起了钥匙的错觉,我们打算在玩家在屏幕上轻敲的时候毁掉这个演员。此外,我们将在一开始就在基座上放置一个钥匙立方体的副本,并在游戏开始时将其隐藏起来。当玩家拿起立方体并离基座足够近时,轻敲屏幕会从游戏中取消隐藏立方体,给人一种角色已经把钥匙放在基座上的印象。那么,让我们开始吧。首先,选择关键立方体,按住 Alt 按钮,在变换工具的帮助下,拖出一个副本。把这个复制品放在底座上。

Key cube pickup and placement

在其细节 面板中的渲染 部分下,勾选隐藏在游戏中的演员选项。这样做将在运行时隐藏游戏。

Key cube pickup and placement

现在,让我们打开水平蓝图。为此,点击视口工具栏中的蓝图,选择打开关卡蓝图

现在,事件在这种情况下将是玩家轻敲屏幕,或者用专业术语来说,提供触摸输入。所以在事件图窗口中,右键点击打开动作菜单,输入Touch。这应该会找到并显示触摸事件节点。点击将其添加到事件图中。你可能会发现各种类型的触摸节点——你需要的是简单说触摸的节点。

Key cube pickup and placement

输入触摸事件节点,我们只关心按下的输出引脚。当玩家按下屏幕上的任意位置时,按下的按钮将被激活。

要从场景中移除盒子,我们将使用摧毁演员功能节点。因此,在图形编辑器中的任意位置单击鼠标右键,键入Destroy Actor,然后单击结果(您也可以在实用程序部分手动查找)。在两个节点都存在的情况下,将按下的输出引脚连接到破坏执行器输入引脚。现在,函数本身不知道它必须破坏哪个演员。我们必须向它说明我们想除掉哪个演员。用蓝图术语来说,我们必须创建一个引用,引用我们希望将函数应用于其中的演员。因此,在视口中,选择关键立方体。然后,在图形编辑器中,右键单击并选择创建对模板立方体 _ 圆角的引用。

如果你的对象有不同的名字,而不是 TemplateCube_Rounded ,你会看到演员的名字。

Key cube pickup and placement

这样做将创建一个引用节点,上面写着这个演员的名字。将此连接到摧毁行动者目标引脚。

另一种方法是拖动参考节点的输出引脚,并将其释放到事件图中的任何位置。这样做将打开一个菜单,您可以在其中选择摧毁演员节点。一旦创建,引用节点将自动连接到它。目前的设置应该如下所示:

Key cube pickup and placement

然而,这里有一个问题。如果你要测试你的游戏,你会注意到无论你在哪里,当你点击屏幕时,立方体都会被破坏。我们只希望当玩家离立方体足够近时,立方体被摧毁。

为了解决这个问题,我们要做的第一件事是在游戏开始时禁用输入。大家可能还记得,游戏开始时激活的事件节点事件开始播放已经出现在图形编辑器中。对此,我们将附加一个禁用输入节点。右键找到节点,连接到事件开始播放

Key cube pickup and placement

虽然现在不需要,但如果你的游戏有几个玩家或控制器,你必须指定你想禁用哪个玩家的控制器。这可以通过首先创建一个获取玩家控制器节点并将其附加到禁用输入节点中的玩家控制器来完成。默认情况下,你扮演的角色的玩家指数为 0。

如果你现在测试你的游戏,当你轻点屏幕时,键立方体不会被破坏(虽然角色会再次开始射弹)。现在,回到我们的序列,因为我们希望玩家只能在他们处于某个距离时拿起立方体,所以我们将在他们与我们在关键立方体周围放置的触发器重叠时启用他们的输入。

选择触发器后,创建一个 EventBeginOverlap 节点。创建后,创建一个使能输入节点,并将其连接到事件开始重叠节点的输出引脚。

Key cube pickup and placement

我们现在几乎完成了我们的设置。如果你现在去测试它,你会发现它的功能和我们预期的一样。然而,这仍未完成。首先,如果你的房间里有不止一个钥匙立方体,当你点击其中一个时,它们都会消失。我们不希望这样;我们只希望玩家拿起的钥匙方块消失。为此,我们将使用一个节点。一个节点用于根据您可以设置的特定条件控制通过该节点的脉冲。例如,当某个事件发生时,您可以将其设置为打开等等。例如,当玩家与触发器重叠时,它会打开门,让脉冲通过。

右键单击事件图中的任意位置,然后键入Gate。然后,点击它来放置它。您也可以在实用程序 | 流量控制 | 下找到它。

Key cube pickup and placement

您希望控制的事件连接到 节点的输入输入。其余的事件用于控制流程。当事件发生时,将关闭输入连接到事件将阻止任何东西通过。同样,将打开输入连接到事件或功能将允许脉冲通过该节点。切换节点将打开节点,如果它最初是关闭的,反之亦然。最后,您有一个启动关闭引脚,用于设置节点的初始状态。如果选中,它将最初关闭,如果未选中,它将最初打开。

首先,从输入触点节点断开按压的引脚,并将其连接到门节点的输入引脚。然后,将退出引脚连接到破坏行为体功能的输入引脚。一旦完成,我们需要一个事件来打开门节点。这个事件将是当玩家与触发器重叠时。因此,取使能输入节点的输出引脚,并将其连接到门节点的打开输入引脚(确保勾选了启动关闭)。您的设置应该如下所示:

Key cube pickup and placement

现在玩家步出触发器,也就是停止与触发器重叠的,我们又要禁用输入。因此,选择触发框,创建一个节点。您可以在搜索栏中键入或在添加事件下找到演员名称<|碰撞 | 添加演员结束重叠。另外,创建一个禁用输入节点。同样,您可以在输入** | 禁用输入下输入或查找。一切就绪后,我们应该结束了:**

Key cube pickup and placement

我们现在有一个简单的拾取动作。但是在我们完成之前,我们还有更多事情要做。我们只是编写了拾取立方体的脚本。我们仍然需要为玩家放置关键立方体的时间编写脚本。这很简单。

我们需要做的第一件事是添加一个重叠事件,使玩家能够输入。用你上一次触发的方法把它们连接起来。接下来,我们将添加另一个 Touch 事件节点。为此,我们将连接一个设置演员隐藏在游戏节点中。首先,选择另一个关键立方体(隐藏在游戏中的立方体),然后在图形编辑器中的任何地方右键单击,并在搜索栏中键入其名称来找到它。也可以在<上的调用函数中找到所选演员的名字> | 渲染 | 设定隐藏在游戏中的演员。你会注意到,当你创建这个节点时,会自动用它创建一个关键立方体的引用节点,并连接到目标输入端。接下来,将按下的输出引脚连接到设置演员隐藏在游戏节点的输入引脚。完成后,添加一个节点,其切换输入连接到使能输出节点的输出。

最后,创建一个on torendoverlap节点,并连接一个 Disable Input 节点,就像前面的触发器一样。

Key cube pickup and placement

如果你要测试它,你会发现它运行得非常好。然而,这里有一个问题:我们没有设置玩家何时可以在基座上放置或取消隐藏关键立方体的条件。换句话说,如果玩家只是走到基座上,而没有拿起第一个关键立方体,他们仍然能够取消隐藏另一个关键立方体,因为这将意味着玩家可以在房间中前进而不拿起关键立方体。

为了解决这个问题,我们首先要改变基座上触发器的一些属性。我们需要先关闭扳机的碰撞。我们必须对其进行设置,以便最初基座上的触发器忽略所有类型的重叠事件,换句话说,将其关闭。为此,选择基座上的触发器,并在“详细信息”面板中,转到碰撞部分。在该部分下,您将看到一个名为碰撞预设的选项。默认设置为触发。单击栏打开预设菜单。从这里选择自定义

Key cube pickup and placement

接下来,点击碰撞预设旁边的小三角形,以打开触发器对不同类型演员的碰撞响应列表。一般有三种反应:

  • 忽略:触发器不会记录对碰撞的任何响应。触发器设置为忽略的演员既不会被阻止,也不会被注册。
  • 重叠:触发被设置为重叠的行动者不会被其阻挡,但碰撞会被其登记。这种碰撞注册是我们能够编写脚本的方式,例如当玩家与触发器重叠时打开灯。
  • 阻挡:触发被设置为阻挡的行动者将无法通过。它会像一堵墙。

您可以单独设置每个演员的回应,也可以选择所有演员的一般回应。我们稍后再做。在最上面,有一个名为碰撞响应的选项。在此之前,您有三个框,每种类型的响应对应一个框。只需勾选忽略框,其下方的所有内容都将被设置为忽略。这就是我们想要的。我们希望触发器最初忽略所有演员的冲突。当玩家拿起钥匙方块后,我们会改变它的碰撞反应。

回到我们所做的拾取设置,我们将需要向其中添加一些节点。右键单击事件图中的任意位置,在流量控制部分,您会发现一个名为序列的东西。选择并创建它。一个序列节点取一个输入,有多个输出。如果你想要一个特定的节点激活或启动各种不同的事件或功能,你应该使用序列节点。

Key cube pickup and placement

默认情况下,一个 序列节点有一个输入引脚和两个输出引脚。首先激发第一个节点,然后激发下一个节点,依此类推。如果您想要更多的输出引脚,只需点击添加引脚,它将创建另一个输出引脚。现在,将节点的输出引脚连接到序列节点的输入引脚。然后,将然后 0 连接到销毁执行元节点。

Key cube pickup and placement

当玩家拿起魔方时,我们现在将触发器的碰撞响应更改为重叠。选择触发器后,右键单击它,首先取消选中位于菜单右上角的上下文相关框。当您在视口中选择了一个演员,并且在图形编辑器中右键单击时,您可以看到的事件节点和功能节点通常与所选演员相关联。它们只显示可以直接应用于演员的函数和表达式。否则,蓝图提供了相当多的节点,但是其中一些节点不能直接使用,或者根本不能在选定的演员上使用。

这里我们需要的节点可以应用于触发器,但不能直接应用。我们需要的是一个设置所有通道的冲突响应节点。此节点可用于在运行时更改演员的冲突响应。右键单击事件图,输入节点名称并创建它。

Key cube pickup and placement

在这里,你可以设置一个你想要改变其碰撞响应T3 的目标演员。点击下拉菜单,会看到三个设置:忽略重叠阻止。如果你还记得,这是触发器的碰撞部分的三种反应。我们已经将其设置为忽略,但是我们想在玩家拿起关键立方体后将其更改为重叠。因此,在下拉菜单中选择重叠。接下来,将the1引脚连接到该节点的输入端。最后,在视口中选择触发器,在图形编辑器中右键单击,勾选上下文相关框,选择创建引用为<演员名称>。将其连接到目标输入将碰撞响应设置到所有通道节点。当你这样做的时候,你会发现它并没有直接连接到目标输入。相反,会创建一个新节点,该节点将触发器的引用作为其输入,并将碰撞组件作为其输出。这是拿着触发盒,把它转换成一个叫做原始组件引用的东西。这是将它连接到此节点的唯一方法。

Key cube pickup and placement

如果我们现在测试游戏,我们会发现按照我们想要的方式工作。如果不先捡起来,我们就无法放置钥匙立方体。

我们这里的设置差不多完成了。还记得我们在钥匙立方体周围放置了一个后处理体积吗,它将作为玩家已经拿起钥匙立方体的视觉指示器?我们也需要把它写进剧本。我们最初将它设置为禁用。我们将通过蓝图启用它,然后在非常短暂的时刻后将其销毁。首先,给序列节点添加一个新的管脚。接下来,选择后处理体积,在图形编辑器中右键单击并为其创建一个参照。然后,单击它的输出引脚,将其拖出,并释放鼠标左键以打开菜单。在这里,您可以输入设置启用,这将创建一个布尔节点(布尔节点为红色)。一旦创建,您将看到一个勾号框,显示已启用。勾选该框,连接到序列节点的然后 2 输出引脚。

接下来,我们需要在短暂的片刻之后摧毁演员。为此,我们需要创建一个延迟节点。一个延迟节点接收一个输入,并在一定时间后(可以设置)触发一个脉冲。在图形编辑器中右键点击,输入延迟并创建。也可以在实用程序 | 流量控制 | 延时下找到。您可以在节点中看到一个名为持续时间的选项。在这里,你可以设置你需要多长时间触发脉冲。现在保持默认值(即0.2秒),连接到设置启用节点。最后,创建一个销毁 Actor 节点,将其连接到延迟节点,并将后处理卷设置为其目标。您只需点击 Ctrl + C 选择您为 Set Enabled 节点创建的后处理引用,然后 Ctrl + V 创建一个副本,并将该副本连接到销毁执行元节点的目标输入。

Key cube pickup and placement

这就是了!我们的钥匙立方体有一个拾取和放置系统。我们还有一个视觉指示器,表明我们已经拿起了立方体(我们将在下一章介绍如何编写门的打开和关闭脚本)。现在,虽然这是一个相当简单和小的设置,对每个关键立方体都这样做将是一个乏味的工作。想象一下,如果你的游戏有 10…20…50…100 个房间!你将不得不为游戏中的每个关键立方体编写脚本,浪费大量时间。值得庆幸的是,UE4 提供了一些东西来绕开这样的场景:一个蓝图类。

蓝图类

如前所述,为每个关键多维数据集编写脚本将是一项乏味且耗时的任务。有了蓝图类,你只需要做一次所有的脚本和其他事情。蓝图类是一个包含演员(静态网格、体积、摄像机类、触发盒等)和脚本功能的实体。再看一次我们的灯打开/关闭的例子,假设你想放置 10 个这样的灯。对于蓝图类,您只需要创建和编写一次脚本,保存它,然后复制它。这确实是 UE4 提供的一个惊人的功能。

创建蓝图类

要创建蓝图类,单击视口工具栏中的蓝图按钮,并在下拉菜单中选择**新建空蓝图类。**然后会打开一个窗口,要求你选择你的父类,指示你想要创建的蓝图类的种类。

Creating a Blueprint class

在顶部,您将看到最常见的类。这些措施如下:

  • 演员:一个演员,如前所述,是一个可以放置在世界上的物体(静态网格、触发器、相机、体积等等,都算演员)
  • 棋子 : A 棋子是一个可以被玩家或者电脑控制的演员
  • 人物:这个类似于一个棋子,但是有走动的能力
  • 玩家控制器:负责给游戏中的棋子或者角色输入,或者控制
  • 游戏模式:这个负责游戏的所有规则
  • 演员组件:你可以用这个创建一个组件,并添加到任何演员
  • 场景组件:可以创建可以附着到其他场景组件的组件

除了这些,还有其他的类可以选择。要查看它们,请点击所有类,这将打开一个菜单,列出您可以创建蓝图的所有类。对于我们的关键立方体,我们需要创建一个演员蓝图类。选择 Actor ,之后会打开另一个窗口,询问你希望保存在哪里,名字是什么。命名为 Key_Cube ,保存在Blueprint文件夹中。满意后,点击确定,将打开演员蓝图类窗口。

Creating a Blueprint class

蓝图类用户界面与 Level 蓝图相似,但有一些不同。它有一些额外的窗口和面板,描述如下:

  • 组件面板:组件面板是可以查看的地方,可以给蓝图类添加组件。空蓝图类中的默认组件是默认场景。它不能被重命名、复制或删除。但是,只要添加一个组件,它就会替换它。同样,如果您删除所有组件,它将会回来。要添加组件,点击添加组件按钮,将打开一个菜单,从中可以选择要添加的组件。或者,您可以将资源从内容浏览器中拖放到图形编辑器组件面板中,它将作为组件添加到蓝图类中。组件包括演员,如静态或骨骼网格,光演员,相机,音频演员,触发盒,体积,粒子系统,等等。当您放置一个组件时,可以在图形编辑器中看到它,您可以在细节面板中设置它的属性,如大小、位置、移动性、材质(如果是静态网格或骨骼网格)等。
  • 图形编辑器:图形编辑器也与 Level 蓝图略有不同,在一个蓝图类中有额外的窗口和编辑器。第一个窗口是视口,与编辑器中的相同。主要用于放置演员,设置演员的位置、属性等。你会在主视口(编辑器的视口工具栏)中找到的大多数工具也在这里。
  • 事件图:下一个窗口是事件图窗口,和关卡蓝图窗口一样。在这里,您可以编写您在视口中添加的组件及其功能的脚本(例如,编写当玩家靠近和离开时灯打开/关闭的脚本)。请记住,您可以编写只存在于蓝图类中的组件功能的脚本。您不能直接使用它来编写不是类组件的任何演员的功能脚本。
  • 施工脚本:最后还有 施工脚本窗口。这也类似于事件图,因为在中可以设置和连接节点,就像在事件图中一样。不同之处在于,这些节点是在您构建蓝图类时激活的。它们在运行时不工作,因为那是事件图脚本工作的时候。您可以使用构建脚本来设置属性,创建并添加您自己的属性,您希望在构建过程中更改的任何组件,等等。

让我们开始为我们的关键立方体创建蓝图类。

视口

我们首先需要的是组件。我们需要三个组件:一个立方体、一个触发盒和一个后处理体积。在视口中,点击添加组件按钮,在渲染下,选择静态网格。它将向类中添加一个静态网格组件。现在需要指定要添加到类中的静态网格。在组件面板中选择静态网格演员后,在演员的详细信息面板中的静态网格部分下,点击按钮并选择模板立方体 _ 圆角。一旦设置了网格,它就会出现在视口中。选中立方体后,沿所有三个轴将其比例(位于细节面板中)从1减小到0.2

接下来我们需要的是一个触发盒。点击添加组件按钮,在碰撞部分选择箱体碰撞。添加完成后,沿所有三个轴将其比例从1增加到9,并以其底部与立方体底部对齐的方式放置。

Viewport

建筑脚本

您可以通过点击渲染部分的覆盖材质按钮,并选择关键立方体材质,在细节面板中设置其材质。但是,我们将使用构造脚本来分配其材质。切换到构建脚本选项卡。您将看到一个名为构造脚本的节点,默认情况下是存在的。您不能删除此节点;这是脚本开始的地方。但是,在编写脚本之前,我们需要创建一个类型为Material的变量。在我的蓝图部分,点击新增,在下拉菜单中选择变量。命名该变量Key Cube Material,并在详细信息面板中将其类型从布尔(默认变量类型)更改为材质。另外,一定要选中可编辑框,这样我们就可以在蓝图类之外编辑它了。

The Construction Script

接下来,从我的蓝图面板中拖动 立方体材质变量,放到图形编辑器中,窗口打开后选择设置。将其连接到构造脚本节点的输出引脚。重复这个过程,只是这一次,选择获取并将其连接到键立方材质的输入引脚。

图形编辑器窗口中单击鼠标右键,在搜索栏中输入设置材质。你应该看到设置材质(静态网格)。点击它并将其添加到场景中。这个节点已经有了静态网格演员的引用( TemplateCube_Rounded ),所以我们不需要创建引用节点。将其连接到设置节点。最后,从我的蓝图中拖动键立方体材质,将其放入图形编辑器中,选择获取,并将其连接到材质输入引脚。完成后,点击编译。我们现在可以在蓝图类之外设置立方体的材质。

The Construction Script

我们来测试一下。将蓝图类添加到关卡中。你会看到一个模板立方体 _ 圆角演员添加到场景中。在其详细信息面板中,您将在默认部分下看到一个关键立方体材质选项。这是我们在构建脚本中创建的变量。我们在这里添加的任何材质都会被添加到立方体中。因此,点击并选择键轴 _ 材质。一旦你选择它,你会看到立方体上的材质。这是使用构建脚本可以做的很多事情之一。目前,只有这个可以。

事件图

我们现在需要编写关键立方体的功能。这或多或少与我们在第一个关键多维数据集的级别蓝图中所做的相同,只是有一些小的不同。在事件图面板中,我们要脚本化的第一件事是当玩家分别重叠和停止重叠触发框时启用和禁用输入。在组件部分,右键单击。这将打开一个菜单。鼠标悬停在添加事件上,选择添加组件开始重叠。这将为图形编辑器添加一个开始重叠节点。接下来,我们需要一个 Cast 节点。一个 Cast 节点用来指定你要使用哪个演员。在图形编辑器中右键单击,并在节点中添加一个造型。将其连接到组件上的节点,并将另一个角色引脚连接到转换为角色节点的对象引脚。最后,添加一个启用输入节点和一个获取玩家控制器节点,并像我们在关卡蓝图中所做的那样连接它们。****

接下来,我们将添加一个事件,当玩家停止重叠方块时。再次,右键单击,并在组件对话框上添加一个节点。执行与在组件开始重叠节点上的完全相同的操作;仅在此,不增加使能输入节点,增加禁用输入节点。设置应该如下所示:

The Event Graph

您可以将我们之前放置的键立方体移动到基座的顶部,将其设置为隐藏,并将键立方体蓝图类放置在其位置。此外,确保您将触发演员的碰撞响应设置为忽略

The Event Graph

下一步是在玩家触摸屏幕时编写破坏关键立方体的脚本。这也类似于我们在水平蓝图中所做的,只是有一些不同。首先,添加一个触摸节点和一个序列节点,并相互连接。接下来我们需要一个销毁组件节点,可以在组件 | 销毁组件(静态网格)下找到。此节点内部已经有了对关键多维数据集(静态网格)的引用,因此您不必创建外部引用并将其连接到节点。将其连接到然后 0 节点。

我们还需要在玩家拿起钥匙立方体后激活触发器。现在,由于我们不能直接在蓝图类之外的演员上调用函数(就像我们在 Level bluetooth 中可以做的那样),我们需要创建一个变量。该变量将属于触发框类型。其工作方式是,当您创建了一个触发器框变量时,您可以将其分配给级别中的任何触发器,并且它会将该函数调用到该特定触发器。考虑到这一点,在我的蓝图面板中,点击添加新的并创建一个变量。将此变量命名为激活触发盒,并将其类型设置为触发盒。最后,确保在可编辑框中打勾;否则,您将无法为其分配任何触发器。完成后,创建一个将冲突响应设置为所有通道节点(取消选中上下文相关框),并将新响应选项设置为重叠。对于目标,拖动激活触发框变量,将其放入图形编辑器,选择获取,并将其连接到目标输入。

最后,对于后处理体积,我们需要创建另一个类型为后处理体积的变量。您可以再次命名该变量视觉指示器,同时确保勾选了可编辑框。将该变量添加到图形编辑器中。接下来,点击它的大头针,把它拖出来,释放它,这将打开动作菜单。这里输入启用,选择设置启用,勾选启用。最后,添加一个延迟节点和一个破坏行为体节点,并将它们依次连接到设置启用节点。您的设置应该如下所示:

The Event Graph

回到视口,你会发现在蓝图类演员的默认部分下,又出现了两个选项:激活触发框视觉指示器(我们已经创建的变量)。使用它,您可以指定要更改哪个特定触发盒的碰撞响应,以及要激活和销毁哪个确切的后处理卷。在这两个变量的前面,你会看到一个滴管形状的小图标。您可以使用它来选择要分配给相应变量的外部演员。使用这些变量编写的任何脚本都会对场景中指定的演员生效。这是蓝图类提供的众多惊人功能之一。对于剩余的关键多维数据集,我们现在需要做的就是:

  • 将它们放在水平位置
  • 使用位于变量名称旁边的滴管图标,选择玩家拿起关键立方体后要激活的触发器,以及要激活和销毁的后期处理卷。

在第二个房间,我们有两个钥匙立方体:一个激活大门,另一个激活通向第三个房间的门。第一个钥匙立方体将被放置在大门附近的基座上。因此,在选择第一个关键立方体的情况下,使用滴管,为激活的触发盒变量选择靠近大门的基座上的触发盒。然后,为视觉指示器变量选择放置关键立方体的后处理体积。

接下来我们需要做的就是打开关卡蓝图并脚本化玩家将钥匙立方体放在大门附近的基座上时会发生什么。像上一个房间一样,我们设置节点,将隐藏的钥匙立方体取消隐藏在底座上,并将大门口周围触发盒的碰撞响应更改为重叠,确保最初设置为忽略

The Event Graph

测试一下!你会发现一切都在按预期进行。现在,对剩余的关键立方体进行同样的操作。触摸屏幕时,选择要激活的触发框和后处理音量。然后,在 Level bluetooth 中,编写要取消隐藏哪个键立方体的脚本,以此类推(将我们之前放置的键立方体放置在基座上,并将其设置为隐藏,然后将 bluetooth 类键立方体放置在其位置上。

这是您可以使用蓝图类的许多方法之一。你可以看到这需要大量的工作和麻烦。现在让我们继续讨论人工智能。

编写基本 AI 脚本

回到第三个房间,我们现在要在我们的游戏中实现 AI。我们在第三个房间有一个人工智能角色,当它被激活时,会移动。主要目的是在开关的帮助下为它开辟一条道路,防止它坠落。当人工智能角色到达目的地时,它会解锁钥匙立方体,然后玩家可以拿起并放在基座上。我们首先需要创建另一个类型为角色的蓝图类,并将其命名为AI_Character。创建后,双击它将其打开。您将看到一些组件已经在视口中设置好了。分别是封装组件(主要用于碰撞)箭头组件(指定哪一面是角色正面,哪一面是背面)网格(用于角色动画)角色移动。默认情况下,这四个都在那里,不能删除。这里我们唯一需要做的就是为我们的角色添加一个静态网格,它将是 TemplateCube_Rounded

点击添加组件,添加一个静态网格,并为其分配模板立方体 _ 圆角(在其细节面板中)。接下来,沿着所有三个轴将这个立方体缩放到0.2,并将其向封装组件的底部移动,这样它就不会漂浮在半空中。

Scripting basic AI

这是我们对人工智能角色的全部要求。剩下的我们将在关卡蓝图中处理。接下来,将 AI_Character 放置到坑的玩家一侧的场景中,所有的开关。将它直接放在目标点演员的上方。

Scripting basic AI

接下来,打开级蓝图,让我们开始编写脚本。最左边的开关将用于激活人工智能角色,其余三个开关将用于绘制它将在其上行走以到达另一侧的路径部分。

要移动人工智能角色,我们需要一个人工智能移动到节点。我们首先需要的是触发器在第一个开关上的重叠事件,这将启用输入,否则每当玩家触摸屏幕时,AI 角色就会开始移动,这是我们不希望的。设置重叠事件、使能输入节点和事件。将重叠事件连接到使能输入事件,然后连接到节点的打开输入。

接下来就是创建触摸节点。对此,我们将附加一个人工智能移动到节点。你可以输入或者在人工智能部分找到它。创建后,将其连接到节点的出口引脚。

Scripting basic AI

我们现在需要指定我们想要移动到哪个角色的节点,以及它应该移动到哪里。要指定我们要移动哪个角色,请在视口中选择人工智能角色,并在关卡蓝图的图形编辑器中右键单击并为其创建一个引用。将其连接到典当输入引脚。接下来,对于位置,我们希望 AI 角色移向第二个目标点演员,位于坑的另一侧。但首先,我们需要知道它在世界上的位置。选中后,在图形编辑器中右击,输入Get Actor Location。该节点返回一个演员在世界上的位置(坐标)(连接到它的那个)。这将创建一个获取演员位置,其中目标点演员连接到其输入引脚。

最后,将其返回值连接到 AI 移动到节点的目的地输入。

Scripting basic AI

如果你要测试一下的话,你会发现它工作得很好,除了一点:AI 角色在到达坑边时会停止。如果没有路,我们希望它从坑里掉下来。为此,我们需要一个导航代理链接演员。如前一章所述,当人工智能角色必须暂时离开导航网格时(例如,在壁架之间跳跃),会使用导航代理链接演员。如果我们想让我们的人工智能角色从壁架上掉下来,我们就需要这个。您可以在模式面板的所有类别部分找到它。把它放在水平位置。

Scripting basic AI

演员被描绘成两个圆柱体,中间有一个弯曲的箭头。我们希望第一个圆柱体在坑的一侧,另一个圆柱体在另一侧。使用缩放工具,增加导航代理链接演员的大小。

Scripting basic AI

当放置 导航代理链接演员时,记住两件事:

  • 确保两个圆柱体在绿色区域相交;否则,演员将无法工作
  • 确保两个气缸都符合 AI 字符;否则,它不会直线移动,而是移动到圆柱体所在的位置

一旦放置,你会看到 AI 角色在到达坑边时会脱落。我们还没有完成。我们需要把 AI 角色带回它的起始位置,这样玩家才能重新开始(否则玩家将无法进步)。为此,我们需要首先在坑的底部放置一个触发器,确保如果人工智能角色确实落入其中,它会与触发器重叠。这个触发器会执行两个动作:第一,将 AI 角色瞬移到初始位置(借助第一个目标点);第二,它会停止 AI 移动到节点,或者它会继续移动,即使它已经被传送了。

Scripting basic AI

放置触发器后,打开级别蓝图,为触发器框创建一个重叠事件。对此,我们将添加一个序列节点,因为当玩家与触发器重叠时,我们将调用两个独立的函数。我们要创建的第一个节点是传送节点。在这里,我们可以指定传送哪个演员,以及传送到哪里。我们要传送的演员是 AI 角色,所以为其创建一个引用,并将其连接到 Target 输入引脚。对于目的地,首先使用获取演员位置功能获取第一个目标点演员的位置(AI 角色最初放置在其上),并将其连接到目标位置输入。

Scripting basic AI

要停止人工智能角色的移动,右键单击图形编辑器中的任意位置,并首先取消选中上下文敏感框,因为我们不能在人工智能角色上直接使用该功能。我们需要的是一个停止主动运动节点。在搜索栏中键入并创建它。将其连接到然后 1 输出节点,并在其上附加一个人工智能字符的引用。它会自动从字符参照转换为字符移动组件参照。

Scripting basic AI

这就是我们在第三个房间为人工智能编写脚本所需的全部内容。还有一件事:如何解锁钥匙立方体。但是我们将在下一章讨论这个问题,因为它涉及日场。

在第四个房间,我们将使用相同的原理。在这里,我们将制作一个人工智能移动到节点的链,每个节点连接到前一个节点的成功输出引脚。这意味着当人工智能角色成功到达目的地(目标点演员)时,它应该移动到下一个,以此类推。利用这一点,以及我们刚才讨论的人工智能,编写人工智能将遵循的路径(回想上一章,我们在第四个房间中排列了人工智能角色将遵循的路径)。

Scripting basic AI

总结

在本章中,我们介绍了蓝图,并讨论了它们的工作原理。我们还讨论了等级蓝图和蓝图类,并介绍了如何编写人工智能脚本。我们还有一些东西要写,但首先我们必须涵盖虚幻日场的主题。在下一章中,我们将这样做。