当前位置:   article > 正文

Unreal Engine4蓝图编程学习(一)_unreal vector*float节点如何创建

unreal vector*float节点如何创建

学习内容主要介绍了蓝图进行对象交互、升级玩家技能、升级AI敌人、跟踪游戏状态完成游戏体验等内容。

内容来源于:Unreal Engine4蓝图可视化编程。书籍为2017年,与现在版本有一定区别。

一、制作移动标靶

1.1

首先,我们想先创建一个简单的目标Actor,当枪发射子弹击中它时能够改变自身的颜色。

我们任意创建一个圆柱体,然后创建一个材质。我们在材质中创建一个VectorParameter,将其设置为红色。

我们通过材质几点的其他输入引脚给材质添加一些光泽,可以在金属Metallic和粗糙度Roughness引脚设置值。我们创建两个ScalarParameter,将默认值改为0.1,分别连接。

至此我们创建了一个简单的材质。 

 1.2

接着我们为圆柱体增加一个蓝图脚本:

如果通过下面的按钮,则会有三个方法:

 新子类(New Subclass) 仅在选定单个Actor时可用。此方法可将蓝图资产作为Actor子类或其任一子类创建,包含所做的任何Actor属性更改。这个方法最直接。蓝图资产将保留对选定Actor的属性进行的更改。

 子Actor(Child Actors) 方法基于任意Actor类创建蓝图资产。新Actor拥有默认组件,并且关卡编辑器(Level Editor)视口中的每个选定Actor有一个额外的 子Actor组件(Child Actor Component)。子Actor组件将保留对选定Actor属性进行的更改。

收获组件(Harvest Components) 方法基于任意Actor类创建单个蓝图资产(Blueprint Asset),然后收获所有选定Actor的组件,并将组件附加到新Actor。当Actor主要作为其组件的容器时,请使用此方法。举例而言,由于通常只会出现渲染和潜在碰撞这类行为,多个 静态网格体Actor 可有效地组合为拥有多个静态网格体组件的单个Actor。但是,由于AI控制的角色做出的行为拥有Actor级别的自主权,并可能需要单独控制组件并单独访问组件数据,因此这类角色通常需要保留为单独的Actor。

当玩家第一次开始玩游戏时触发事件Begin Play。当另一个actor开始与蓝图控制的现有actor发生触碰或重叠时触发事件Actor Begin Overlap。事件Tick在游戏运行的每一帧触发与之相关的动作,帧率取决于电脑的配置,也影响着事件Tick触发动作的频率。

为了创建检测事件,创建事件命中节点。执行引脚:定义了动作序列中下一步要执行的动作。

我们接着创建Set Material节点,然后设置材质为我们刚刚创建的。

 1.3

接下来我们要保证只有子弹碰到时,会改变颜色。

数据引脚(Data Pins) 用于将数据导入节点或从节点输出数据。数据引脚只能与同类型的相连接,可以连接到同一类型的变量(这些变量有自带数据引脚),也可以连接到其他节点上同类型数据引脚。与执行引脚一样,数据引脚在未连接到任何对象时会显示为空心,在连接到对象后则显示为实心。

Blueprint Data Pin Types

我们创建一个类型转换为FirstPersonProjectile,这是UE4中第一人称模板中的蓝图,控制着子弹的行为。该节点使用类型转换来确保:只有在子弹actor击中与转换节点引用的对象相匹配的圆柱体时,才将动作附加到节点的执行引脚。

1.4

接下来我们制作移动标靶,其实就是给actor设为可移动的。

1.4.1 改变actor的移动性和碰撞

首先我们要改变actor的移动性为可移动:

 接着我们进到蓝图,选中组件,同样的在细节面板将其改为可移动。在碰撞预设中,如果选择Custom,用户可以将对象与不同对象之间的碰撞交互进行个性化设置。为了达到预期,我们只需选择BlockAllDynamic。

 为了移动一个对象,我们需要3个数据:

  • 圆柱体当前位置
  • 移动方向
  • 移动速度

1.4.2 使用变量存储数据

我们先创建方向和速度两个变量,然后我们在细节面板中改变:名称、类型、可编辑和默认值。 

 速度为浮点型,200默认值;方向为vector,默认值(0,-10,0)

1.4.3准备计算方向

首先,我们要取出direction变量的向量并进行归一化,这个操作可将向量的长度转换为一个单位长度,可与其余部分的计算兼容。我们在蓝图中完成操作:

 1.4.4使用delta time关联速度与时间

为了让速度值与方向相关,需要将速度变量与delta time相乘。

delta time是什么?可以见下面的教程:

https://www.bilibili.com/video/BV1CJ411e7WM/

首先FPS=帧速率,60FPS=1秒60帧。Delta time即两帧之间的间隔:

  • 50FPS下,Delta time=1/50=0.02秒。

假如没有使用Delta time移动:

  • Actor1:10FPS    1秒移动了10*1个单位
  • Actor2:100FPS   1秒移动了100*1单位 

使用Delta time移动:

  • Actor1:10*1*0.1=1     1秒内移动了1个单位
  • Actor2:100*1*0.01=1  1秒内移动了1个单位

所以当速度与Delta time相乘后,假设Speed为10,即为每秒10米,而不是每帧10米,能够防止帧速率不稳定时出现的状况。

1.4.5 转换现有位置坐标

 现在我们已经获得了归一化的方向向量和与时间相关的速度值,就需要将这两个数值相乘并将结果赋值给对象目前的坐标。

首先,我们将组件中的StaticMeshComponent拖入事件图表中,从这个节点中我们可以提取包含在对象的网格组件中的任何数据。

下一步我们要获取网格的位置坐标,我们创建Get World Transform节点。接着我们希望将变换分解到组件部分,这样可以在计算中仅适用变换的位置信息,同时保持旋转和缩放不变。所以我们创建Break Transform节点。

下一步我们要将方向向量和浮点型的速度数值相乘。可以创建一个Vector*Float。

最后一步是将速度与方向添加至运算得到的当前位置。我们从最新创建的乘法节点,创建一个Vector+Vector节点。

 接着我们创建一个Make Transform的节点,将引脚连接,得到最终的蓝图:

 1.4.6 更新位置和改变目标方向

得到变化的值后,我们可以通过变换的值来调整actor位置。前面已经使用了Delta time使得速度和方向的变化与帧率无关,因此可以简单的使用事件Tick节点来实现每帧都触发移动动作。

 为了移动目标,我们需要使用Set Actor Transform节点,然后连接引脚。

我们现在还没有任何停止目标移动的指令,我们还需要一个逻辑来周期性的改变目标的方向。使得目标像移动的标靶一样,在两点之间规律的移动。

为此,我们要设置两个节点,为方向向量设置两个不同的值。创建两个direction节点,,Y轴的值分别为10和-10。

现在我们需要一个方法在这两个节点之间转换,使得方向会重复的改变,希望两组动作在每次切换之前,交替执行一次,可以使用FlipFlop节点。

 

最后,我们需要确保在执行方向转换之间有一些延迟。我们创建一个Delay节点

这个节点将允许我们设置一个以秒为单位的延迟时间,而在这个节点以后的执行命令将会被延迟这段时间后执行。最后我们编译并保存查看结果, 

 

可以看到圆柱体在两个定点之间来回的移动。在这一部分,我们设置了一个目标,通过改变自身颜色来相应子弹的射击。我们还设置了一个蓝图,能够快速的创建很多移动的目标,

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/260966
推荐阅读
相关标签
  

闽ICP备14008679号