UE4 蓝图教程(二) 蓝图,消灭香蕉

2023-11-11 11:10
文章标签 ue4 教程 蓝图 香蕉 消灭

本文主要是介绍UE4 蓝图教程(二) 蓝图,消灭香蕉,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

蓝图

蓝图是虚幻4中的可视化脚本系统,是一种快速开发游戏原型的方法。无需逐行编写代码,您可以直观的做所有事情:拖放节点,将它们的属性设置在UI中,并拖动连接线来连接。除了成为一个快速的原型开发工具之外,蓝图还使得非编程人员可以很快速地上手编写脚本。
注 : 博主水平有限,如有疑问,请参见 原英文教程

在本教程中,您将用蓝图:
1 设置一个从上向下看的摄像机
2 创建一个由玩家控制的具有基本动作actor
3 设置玩家输入
4 创建一个物品,当玩家碰到它时消失。

开始
下载 starter project并解压它。打开项目文件夹并打开BananaCollector.uproject。
注意:如果你收到提示,说这个项目是用旧版本的虚幻4创建的,没关系(引擎经常更新)。您可以选择打开副本,也可以选择在合适的位置进行版本转换。
如果一切正常,你会看到下面的场景。这是玩家移动并收集物品的地方。

我已经将项目文件夹分类了以便于查找文件,正如您所看到的:

如果你愿意,你可以使用红色区域的按钮来显示或隐藏Content面板。
创建玩家
在内容浏览器中,找到Blueprints 文件夹。单击Add New按钮并选择Blueprint class。
因为你想让actor 能够接收到玩家的输入,所以Pawn 类是合适的。从弹出窗口中选择Pawn ,并将其命名为BP_Player。

注意:Character 类也可以工作。它甚至在默认包含了一个移动组件。但是,你将会实现你自己的移动功能,所以用Pawn 类就足够了。

附加相机
相机是玩家观察世界的方法。你需要创建一个相机,指向玩家的视线方向。
在内容浏览器中,双击BP_Player,在蓝图编辑器中打开它。
要创建一个相机,请来到组件面板。点击Add Component并选择Camera。

想让相机从上往下看,你需要把它放在玩家上面。选择了相机组件后,转到Viewport选项卡。通过按W键激活移动操作器,然后移动到(-1100,0,2000)。或者,您可以直接在将坐标输入。它位于详细信息面板的Transform/Location字段下。

如果你看不到相机,按下F键。
接下来,通过按E键激活旋转。在y轴上旋转相机到-60度。
玩家代表
红色的方块代表玩家,所以你需要使用一个静态的网格组件来显示它。
首先,通过单击组件面板中的空白空间取消选中的相机组件。否则,下一个添加的组件将会是一个相机的子组件。
单击Add Component 并选择 Static Mesh。

要显示红色方块,选中StaticMesh组件,然后切换到细节选项卡。单击位于Static Mesh右侧的下拉框并选择SM_Cube.。

这就是您应该看到的场景(如果您没有看到它,您可以在Viewport中按F):

现在,该创建Pawn了。单击编译并返回到主编辑器。
产生玩家
在玩家控制Pawn之前,你需要指定两件事:
1 玩家将控制的Pawn类
2 Pawn如何生成
通过创建一个Game Mode类来完成上述任务。

创建游戏模式
游戏模式是一个控制玩家如何进入游戏的类。例如,在多人游戏中,你可以使用游戏模式来确定每个玩家的产生的位置。更重要的是,游戏模式决定了哪些Pawn玩家将使用。
进入内容浏览器,确保你已经进入了Blueprints文件夹。单击Add New按钮并选择Blueprint class。从弹出窗口中,选择Game Mode Base ,并将其命名为GM_Tutorial。

现在,您需要指定一个默认的Pawn 类。双击GM_Tutorial 打开它。
转到详细信息面板并查看类的部分。单击Default Pawn Class 的下拉框,并选择BP_Player。

在你使用你的新游戏模式之前,关卡需要知道使用了哪种游戏模式。你可以在World Settings中指定。单击Compile并关闭蓝图编辑器。每个关卡都有自己的设置。您可以通过选择Window\World Settings来访问这些设置。或者,您可以在工具栏选择Settings\World Settings来设置。

一个新的“World Settings”选项卡将在Details选项卡旁边打开。从这里,单击GameMode Override 的下拉列表,并选择GM_Tutorial。

现在您将看到这些类已经更改为在GM_Tutorial中所选中的类。

您需要指定玩家在何处生成。你可以通过将一个Player Start actor放入这个关卡中来实现这个目标。
设置游戏开始时,玩家所在的位置
在生成一个玩家的过程中,游戏模式寻找一个玩家开始的角色。如果游戏模式找到了,它会尝试在那里生成玩家。
要想让玩家启动,可以模型面板中搜索Player Start。点击和Player Start 从模型面板开始进入Viewport。释放鼠标将它放置好。

你可以把它放在你喜欢的地方。完成后,到工具栏并单击Play。将会在你放置Player Start.的地方生成。

想要退出游戏,单击工具栏中的Stop按钮或按Esc键。如果你看不到光标,请按Shift+F1。
如果你不能四处移动,那就不是一个游戏了,对吧?您的下一个任务是设置输入参数。
配置输入
为操作分配一个键称为键绑定。
在虚幻引擎中,您可以设置键绑定,当您按下它们时,将触发一个事件。事件是当某些操作发生时执行的节点(在这种情况下,当你按下这个键)。当触发事件时,连接到事件的节点都将执行。

这种绑定键的方法十分方便。
例如,您将鼠标左键单击并将其命名为Shoot。任何可以射击的actor 都可以使用Shoot事件来判断玩家是否按下了左键。如果您想要更改键,您可以在输入设置中更改它。

Axis 和Action 映射
要查看输入设置,请点击Edit\Project Settings.。在左边,选中Engine中的input。

Bindings 部分是您将设置输入的地方。

虚幻提供了两种创建键绑定的方法:
1 Action Mapping:
它只存在两种状态:按下或没有按下。当您按下或释放键时,事件才会触发。用于那些没有中间状态的动作,比如射击。
2 Axis Mapping:
它输出的数值称为axis value (稍后会详细说明)。Axis事件每个帧都会触发。通常用于鼠标控制准星的动作。
对于本教程,您将使用Axis Mapping。

创建移动映射
首先,您将创建两个axis Mapping组。组允许您将多个键绑定到一个事件。
要创建一个新的axis映射组,需要单击Axis Mappings右侧的+号。现在创建两组,并将它们命名为MoveForward和MoveRight。

MoveForward将处理前后移动。MoveRight将处理左右移动。
你将把移动映射到四个键:W、A、S和D。当前,只有两个槽可以映射键。通过单击组(MoveForward)名称旁边的+号,向每个组添加另一个axis映射。

映射一个键,需要单击下拉列表来弹出一个键列表。将W和S键映射到MoveForward。将A和D的键映射到MoveRight。

接下来,您将设置输入Scale大小。
Axis 和Scale值
在设置Scale字段之前,您需要了解它们是如何使用axis 值工作的。
axis值是一个数值,如何使用它由它输入的类型决定。按钮或键在按下时输出1。根据你的方向和你推进的距离,输出-1到1之间的值。

你可以使用axis 值来控制一个pawn的速度。例如,如果你把图钉推到边缘,axis 的值是1。如果你把它推到一半,它就会是0.5。
通过将axis值与速度变量相乘,你可以调整图钉的速度。

您还可以使用axis值指定沿着轴的方向。如果你将一个Pawn的速度乘以一个正轴值,你将得到一个正的偏移量。使用负axis值将导致负偏移。将这个偏移量添加到Pawn的位置将确定它移动的方向。

由于键盘键只能输出1或0的axis 值,因此可以使用scale值将其转换为负数。它的作用是取axis值然后乘以它的scale。
如果你把正(轴的值)和负的(比例)相乘,你会得到一个负数。
通过单击scale字段并输入-1来设置S和A的scale值。

接下来,有趣的部分是:让Pawn移动!关闭Project Settings,然后双击BP_Player,在蓝图编辑器中打开
移动玩家
首先,您需要为您的移动映射获取事件。在事件节点图中右击一个空白区域,以获得一个节点列表。从菜单中搜索MoveForward。添加在Axis Events中列出的MoveForward节点。注意,您正在寻找在Axis Events下的红色节点,而不是在Axis值下的绿色节点。
重复这个过程。

现在,您将为MoveForward设置节点。
使用变量
要移动,你需要指定兵的移动速度。指定速度的一种简单方法是将其存储在一个变量中。
要创建一个,请转到My Blueprint选项卡,并单击“Variables 部分右侧的+号。

选中新变量后,请转到Details选项卡。将变量重命名为MaxSpeed。然后,将变量类型改为Float类型。通过单击Variable Type 旁边的下拉框并选择Float。

接下来,需要设置默认值。在您设置它之前,您需要在工具栏中单击Compile。
选中变量,返回到详细信息面板。转到默认值部分,将MaxSpeed的默认值修改为10。

接下来,从My Blueprint中拖动MaxSpeed变量到节点图视图中。在菜单中点击Get。

现在,你将把MaxSpeed和axis 值相乘,以确定最终的速度和方向。添加一个float * float节点,并把Axis 值和MaxSpeed都和它相连。

得到玩家方向
为了前进,你需要知道Pawn的位置。幸运的是,虚幻有一个节点用于这个目的。添加一个Get Actor Forward Vector 节点。

接下来,添加一个Add Movement Input 节点。该节点将接受一个方向和值,并将其转换为一个存储的偏移量。像这样连接节点:

白线代表一个执行链。换句话说,当玩家输入axis移动时,将产生一个事件,该事件将执行InputAxis MoveForward 节点。白线表示,一旦发生这种情况,将执行 Add Movement Input 节点。
Add Movement Input节点接受以下输入:
1 Target:目标,设置为self,在本例中为玩家自己(红色框)。
2 World Direction:世界方向,移动目标的方向,在本例中是玩家所面对的方向。
3 Scale Value:比例值:在这个例子中是最大速度axis值(记住是在-1到1之间的值)。
重复这个过程,但是用Get Actor Right Vector.取代Get Actor Forward Vector,不要查看上面的说明, 看看你能做多少!

添加偏移量
要实际移动Pawn,你需要通过添加移动输入计算出偏移量,并将其设置到Pawn的位置。
基本上,你要做的就是让玩家在游戏的每一帧中移动一小部分,因此你需要将动作添加到一个Event Tick事件中,这是每一个帧都会触发的的。
转到节点图中的Event Tick节点。它的左边应该是灰色的,如果没有,就创建一个。

要获得偏移量,创建一个Consume Movement Input Vector节点。要添加偏移量,创建一个 AddActorLocalOffset 节点。然后,把它们连起来:

基本上,这意味着在游戏的每一帧中,你将获得任何已有的动作输入,并将它添加到actor的当前位置。
单击Compile,然后返回主编辑器并单击Play。你现在可以四处走动了!

不过,这儿还有一个小问题。该事件是帧事件,每帧都会触发,配置高的机器能够以更快的速度渲染帧。移动节点将会执行得更频繁。这就导致了在置高的机器上会以更快的速度移动,反之亦然。
要解决这个问题,你的运动需要保持独立的帧速率。
注意:我已经设置了一些键绑定,这些绑定将显示帧速率依赖的影响。按0将帧速率设为60,并按1重新设置默认。在不同的帧速率中移动,以观察速度的差异。
帧速率独立
帧速率的独立性意味着无论帧速率如何,所有的结果都会有相同的结果。幸运的是,在虚幻引擎中实现帧率的独立是很容易的。
退出游戏,然后打开BP_Player。接下来,转到到您的Event Tick节点,并查看Delta Seconds秒。

Delta秒是上次事件发生后的时间。通过将你的偏移量与时间相乘,你的运动就会独立于帧速率。
例如,你的Pawb的最大速度是100。如果一秒钟过去了,你的兵将会移动全部100个单位。如果半秒过去了,它将移动50个单位。

如果移动依赖于帧速率,那么无论帧与帧之间的时间间隔为多少,每一帧Pawn都会移动100个单位。
要将您的偏移量与Delta Seconds相乘,添加一个vector * float节点。然后,连接起来:

因为在帧之间的时间(Delta Seconds)非常小,你的Pawn会移动的非常慢。通过将MaxSpeed的默认值更改为600,来解决这个问题

祝贺您,您已经成功地实现了帧率独立!

你可能已经注意到,立方体能穿过所有的东西。要解决这个问题,你需要了解碰撞。
带上安全帽,因为你要与一些碰撞理论正面交锋!
Actor碰撞
当你想到碰撞的时候,你可能会想到汽车撞在一起了。幸运的是,虚幻引擎的碰撞更安全。
为了能够碰撞,一个actor 需要一个碰撞空间(通常称为碰撞)。你可以使用以下的任意一个:
1 Collision mesh:当一个网格被导入时,这些是自动生成的(如果启用的话)。用户还可以使用3D软件创建一个自定义的碰撞网格。这个红色的盒子已经有了一个自动生成的碰撞网格。
2 Collision component:它们有三种形状:盒子、胶囊和球体。您可以通过组件面板添加它们。一般用于简单的碰撞。
下面是一个人物及其碰撞的例子。

当一个actor的碰撞空间遇到另一个actor的碰撞空间时发生碰撞。

现在是时候开启碰撞了
启用碰撞
你可能想知道为什么这个盒子没有碰撞,即使它有一个碰撞网。当您移动一个actor时,虚幻引擎只考虑到根组件的碰撞。因为你的Pawn的根组件没有任何碰撞检测,所以它会穿过所有的东西。
注意:一个没有发生碰撞的actor仍然可以阻止其他物体。但是,如果你移动actor,它不会与任何东西相撞。

所以,StaticMesh要碰撞,需要根组件。要做到这一点,去组件面板。然后,左击StaticMesh 拖动到DefaultSceneRoot。释放左击使StaticMesh成为新根组件。

碰撞前还有一件事要做。切换到事件节点图并找到到AddActorLocalOffset节点。找到Sweep 并将其设置为true,勾选复选框。

基本上,AddActorLocalOffset将碰撞对象的位置。Sweep确保actor 与新旧位置之间的任何东西发生碰撞。回到主编辑器,点击Play。立方体现在会与地面碰撞!

你要做的最后一件事是创建一个当玩家碰到它时消失的物品。
创建一个item
一般来说,item是玩家可以收集到的物品。您将使用BP_Banana作为收集的item
要检测玩家何时该触碰到到item,您需要一个事件节点,该节点在发生冲突时触发。您可以使用冲突响应来生成这样的事件。
碰撞响应也决定了一个Actor与另一个Actor碰撞时的反应。碰撞响应有三种类型:忽略、重叠和阻塞。下面是它们如何相互作用:

尽管您可以使用Overlap 或Block,本教程只会向您展示如何使用Overlap 。
设置碰撞反应
退出游戏,然后打开BP_Banana。选择StaticMesh组件,然后进入Details面板。Collision 部分是你设置碰撞响应的地方。

如您所见,大多数设置都是灰色的。为了使它们可编辑,左键单击Collision Presets的下拉菜单。从列表中选择Custom。

现在,您需要指定立方体的碰撞响应项
组件有一个称为object type的属性。对象类型可以方便的把相似的actors组合在一起。您可以在这里关于对象类型的内容。
由于立方体的类型是WorldDynamic,所以您要在Collision Responses部分更改该类型的碰撞响应。,改变了worldddynamic的碰撞响应。通过左击勾选“WorldDynamic”右边中间的复选框来完成这个操作。

处理碰撞
要处理碰撞,需要使用overlap 事件。进入组件面板,右键单击StaticMesh。从上菜单中,选择Add Event\Add OnComponentBeginOverlap。

这会将 OnComponentBeginOverlap (StaticMesh) 节点添加到事件节点图中。

最后,创建一个DestroyActor 节点并将其链接到OnComponentBeginOverlap (StaticMesh) (StaticMesh)节点。

放置物体
关闭蓝图编辑器,然后确保您在蓝图文件夹中。
开始将香蕉放置到水平,通过左击和拖动BP_Banana进关卡视口。

点击 Play 开始收集香蕉!

这篇关于UE4 蓝图教程(二) 蓝图,消灭香蕉的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/389631

相关文章

全网最全Tomcat完全卸载重装教程小结

《全网最全Tomcat完全卸载重装教程小结》windows系统卸载Tomcat重新通过ZIP方式安装Tomcat,优点是灵活可控,适合开发者自定义配置,手动配置环境变量后,可通过命令行快速启动和管理... 目录一、完全卸载Tomcat1. 停止Tomcat服务2. 通过控制面板卸载3. 手动删除残留文件4.

Python的pandas库基础知识超详细教程

《Python的pandas库基础知识超详细教程》Pandas是Python数据处理核心库,提供Series和DataFrame结构,支持CSV/Excel/SQL等数据源导入及清洗、合并、统计等功能... 目录一、配置环境二、序列和数据表2.1 初始化2.2  获取数值2.3 获取索引2.4 索引取内容2

python依赖管理工具UV的安装和使用教程

《python依赖管理工具UV的安装和使用教程》UV是一个用Rust编写的Python包安装和依赖管理工具,比传统工具(如pip)有着更快、更高效的体验,:本文主要介绍python依赖管理工具UV... 目录前言一、命令安装uv二、手动编译安装2.1在archlinux安装uv的依赖工具2.2从github

C#实现SHP文件读取与地图显示的完整教程

《C#实现SHP文件读取与地图显示的完整教程》在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平... 目录概述功能特点核心代码解析1. 文件读取与初始化2. 坐标转换3. 图形绘制4. 地图交互功能缩放

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

详解Java中三种状态机实现方式来优雅消灭 if-else 嵌套

《详解Java中三种状态机实现方式来优雅消灭if-else嵌套》这篇文章主要为大家详细介绍了Java中三种状态机实现方式从而优雅消灭if-else嵌套,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录1. 前言2. 复现传统if-else实现的业务场景问题3. 用状态机模式改造3.1 定义状态接口3

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl