unreal 蓝图变量初始值

2017-05-02 17:00:00 weixin_34123613 阅读数 41

本节书摘来异步社区《Unreal Engine 4蓝图可视化编程》一书中的第1章,第1.5节,作者: Brenden Sewell 译者: 陈东林 责编: 胡俊英,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.5 制作移动标靶

既然我们有目标来响应玩家的射击,则可以添加一些挑战性的东西来让项目像一个游戏,一个简单的方法是为目标制作移动的标靶。为了完成这个功能,首先我们需要将目标actor是设为可移动的,然后需要通过蓝图设置逻辑。这样便可以控制目标移动。我们的目标是使目标圆柱体在关卡中来回移动。

1.5.1 改变actor的移动性和碰撞

为了让目标移动,首先需要改变actor的移动性(Mobility)为可移动(Moveable)。这个操作将允许对象在玩游戏时可以被操纵。在UE4编辑器的世界大纲视图中,选中CylinderTarget_Blueprint,查看细节(Details)面板。在变换数值(Transform values)的下方,可以看到可移动的开关,单击将状态由静态(Static)转变到可移动,如图1.22所示。


22

注意 批注 

默认情况下, 放置在世界中/场景中的actor为静态(Static)。“静态”表示这个对象在游戏运行时不能移动或被操作。静态对象着重对少量的关键资源进行渲染,应该将其作为非交互对象的默认选择,以便最大化帧率。

注意:关卡中目标圆柱体的版本仅仅是我们为目标圆柱体创建的蓝图模板的一个实例。这个实例是指一个已经被创建的真正的对象,而蓝图是各种特征的描述,一旦使用蓝图创建了实例,该实例也会拥有这些特征。

在关卡中我们做的改变仅仅是针对目标圆柱体的,为了对其他目标也做一些改变,就需要直接修改蓝图了。为此,打开CylinderTarget_Blueprint。

随着蓝图的打开,我们希望查找工具栏下方的视口标签。在左侧,可看到组件(Components)面板列出了组成这个蓝图的所有组件。由于我们想编辑物理对象、网格的属性,所以单击组件StaticMeshComponent(继承)。在蓝图编辑器的右边会看到细节面板与UE4关卡编辑界面中的细节面板有着相同的属性和分类。在这里,我们同样地将变换(Transform)下方的移动性开关设为可移动。这个操作将确保由这个蓝图创建的目标是设置为可移动的。

因为我们希望子弹能够将对象作为射击目标,所以需要确保目标能够发生碰撞,以至于子弹不会穿过目标。仍然是在细节面板中操作,找到Collision分类,然后在下拉菜单中找到碰撞预设值(Collision Presets)。在这个菜单中会有很多的选项。选择Custom时,用户可以将对象与不同对象之间的碰撞交互进行个性化设置。为了达到项目预期,我们仅需要选择BlockAllDynamic。这样网格会记录它与其他拥有碰撞器的对象之间发生的碰撞。如图1.23所示。


23

1.5.2 目标分析

既然我们将目标设置为可移动的,接下来需要让蓝图控制目标圆柱体如何移动。为了移动一个对象,需要3个三方面的数据。

  • 圆柱体的当前位置。
  • 应该在什么方向移动。
  • 它应该达到的移动速度。

为了理解对象现在的位置,我们需要知道更多的信息,特别需要留意圆柱体在世界中的坐标。需要将速度和方向的值提供给蓝图,通过一些必要的计算将这些值算出来,为蓝图移动对象提供有用的信息。

1.5.3 使用变量存储数据

第一步就是创建两个变量:方向(direction)和速度(speed)。找到我的蓝图(My Blueprint)面板,你会看到一个叫作变量(Variables)的分类,这个分类里暂时没有其他数据,可单击这个分类右边的加号(+)来创建变量。

创建变量后,单击该变量,在蓝图编辑器右边的细节面板中,用户将看到一系列的区域可以用于编辑这个变量,我们需要编辑其中的4个:变量名称(Variable Name)、变量类型(Variable Type)、可编辑(Editable)和默认值(Default Value)。我们希望第一个变量用于控制移动速度,因此重命名该变量名为Speed。对于变量类型,我们希望这个变量能够用于存储期望的速度数值,因此在下拉列表中选择浮点型(Float)。

勾选可编辑使得能够在此蓝图之外编辑该变量。这样在测试游戏的时候能够很方便快速地调整变量的数值。默认值分类看起来没有可编辑区域,但是有一条提示信息请编译此蓝图(compile the Blueprint),编译蓝图之后,出现一个可以输入初始值的区域,将默认的值0.0改为200.0,如图1.24所示。


24

通过同样的步骤,创建Direction变量,变量类型选择Vector。Vector包含X、Y、Z坐标轴的信息。在这个情况下,我们需要指明对象移动的方向。设置Direction变量为可编辑,并且将默认值设为(0.0,-10.0,0.0)。

1.5.4 准备计算方向

为了得到需要为移动所提供的信息,现在将继续探索。或许最初的时候看起来有些难,但是通过分解每个功能并将各个节点组合起来,就可以完成最终的目标。

我们需要完成的第一个计算工作就是取出direction变量的向量并进行归一化(normalize)。归一化是向量运算中的一个常见步骤,可将向量的长度转换为一个单位长度,可与其余部分的计算兼容。有一个专门的蓝图节点来完成此操作。

选中我的蓝图(My Blueprint)面板上的Direction变量,将它拖曳至事件图表(Event Graph)中的空白区域。这个操作将生成一个小的节点,提示用户选择获得(Get)或者设置(Set)。我们想取出direction的值,所以选择获得来创建这个节点来存储变量的值。单击Direction节点的输出引脚至事件图表的空白区域,在搜索框内键入“normalize”,在搜索结果中选择Vector分类下的Normalize节点,如图1.25所示(选中需要注释的两个节点后按[C]键添加注释)。


25

如果发现搜索不到节点,请将Vector数组改为Vector,如图1.26所示。

注意 批注 

在蓝图上留下注释是一个很好的习惯,注释能够帮助描述这一组蓝图完成什么样的功能。在编辑完这个蓝图后,过一阵子回过头来看的时候能够快速地知道它的功能。


26

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

为了让速度值与方向相关,首先需要将速度变量与delta time相乘。delta time是以秒计算,完成最后一帧的时间。它与游戏的帧速率不同。速度变量的值与delta time相乘后,可以确保游戏中的对象的速度都是一致的,与游戏的帧速率无关。[4]

将Speed变量拖入事件图表,选择“获得”来创建这个速度节点。在事件图表空白区域单击鼠标右键进行搜索,找到Get World Delta Seconds选项。最后从Speed节点或Get World Delta Seconds节点的输出引脚拖出引线,调出搜索框,键入“”(星号)或“multi”,找到并选择floatfloat节点。最后,将另外一个节点(Speed节点或Get World Delta Seconds节点)输出引脚至float*float节点的另一个输入引脚,这样就做到了使两个数值相乘,如图1.27所示。


27

1.5.6 转换现有位置坐标

既然已经有了归一化的方向向量和与时间相关的速度值,就需要将这两个数值相乘并将结果赋给对象目前的坐标。首先,在组件面板找到StaticMeshComponent,并将它拖曳到事件图表。这个操作将生成一个节点,从这个节点中我们可以提取包含在对象的网格组件(mesh component)中的任何数据。

下一步,我们希望获取网格的位置坐标。方法之一就是查看对象的变换属性并提取位置(location)信息,从蓝色的输出引脚拖出引线,在搜索框内键入“Get World”,选择Get World Transform选项创建节点。除了位置坐标,变换还包含对象的旋转和缩放信息。这一点很有用,因为我们希望目标移动的时候仍然具有旋转和缩放属性,并且从新的移动信息中获取信息来创建变换 的值。

现在我们希望将变换分解到组件部分。这样就可以在计算中仅使用变换的位置信息,同时保留旋转和缩放不变。从Get World Transform节点的输出引脚拖出引线,搜索Break Transform节点并添加到事件图表中。

现在我们需要添加必要的节点为刚提取出来的位置信息添加速度和方向。右键单击事件图表的空区域,搜索并选择Make Transform节点。这个将时我们运算的最后一个操作,所以将它放在蓝图靠右的位置。Make Transform节点有3个输入:Location、Rotation、Scale。将Rotation、Scale与之前创建的Break Transform节点的对应输出引脚相连。

下一步,我们需要将方向向量与浮点型的速度数值相乘。从Normalize节点的输出引脚拖出引线,搜索“”或“multi”,选择Vector Float,然后将绿色的输入引脚与速度乘以deltatime的节点的输出引脚相连。

最后一步是将速度与方向添加至运算得到的当前位置。单击最新创建的乘法节点的黄色向量输出引脚,拖出引线至事件图表空白区域,搜索“+”,选择Vector+Vector节点。确保向量相加的输入引脚与乘法节点的输出引脚相连后,将另外一个输入引脚与Break Transform节点的Location输出引脚连接。最后,将向量加法节点输出引脚与Make Transform节点的Location输入引脚相连接,如图1.28所示。


28

1.5.7 更新位置

既然我们计算了变换,就可以通过变换的值来调整目标actor的位置了。前面已经使用deltatime使得速度和方向的变化与帧率无关,因此可以简单地使用事件Tick节点来实现每帧都触发移动(move)动作。鼠标右键事件图表的空白区域,搜索“Event Tick”并选择事件Tick,将它放置在Make Transform节点的右边。

为了移动目标actor,我们需要使用Set Actor Transform节点。从事件Tick的执行引脚拖出引线至图表的空区域,查找Set Actor Transform并选择节点。然后连接Make Transform节点的Return Value输出引脚至Set Actor Transform节点的New Transform输入引脚,如图1.29所示。


29

2018-12-01 09:24:16 qq_42673921 阅读数 1383

**

创建数组

**
创建数组非常简单,仅需在创建变量时点击Array(数组)网格图标即可。
在这里插入图片描述
一旦选择了该图标,新键的项就是一个数组,而不是标准的变量。
在这里插入图片描述
**

编辑数组

**
可以通过蓝图默认设置或者沿着蓝图节点网络的任何点来编辑数组的值。这些网络可以在构建脚本、函数、宏或事件图表中。
数组默认值
设置数组的默认值非常简单。简单地创建必要的数组,进入 Blueprint Defaults(蓝图默认值) 选卡或者蓝图编辑器的 Defaults(默认值) 模式。将看到一个以的数组命名的部分,如下所示:
在这里插入图片描述
如果在蓝图默认值中没有看到数组,请确保在创建数组之后已经编译了蓝图。
要想编辑数组的默认值的值:

  1. 在 Blueprint Defaults(蓝图默认值) 选卡中,点击 按钮。这将会创建一个新的索引。重复多次执行这个操作直到满足了想让数组包含的元素数为止。
    在这里插入图片描述
    在这个示例中,已经添加了三个索引值。

  2. 适当地设置每个值。注意设置值的方式是由所使用的数组类型决定的。
    在这里插入图片描述

  3. 要想插入、删除或复制一个数组索引,请点击元素项旁边的 按钮来调出编辑菜单。
    在这里插入图片描述
    如果从列表的中间添加或删除索引,那么其他的编号将会自动地更新。
    数组索引
    同时需要注意的一点是,数组中的值的索引值是 从0开始的 ,这意味着第一个索引是 0 而不是1。比如,如果添加了5个元素项到数组中,在内部,如下所示:

    索引0 第一个元素项
    索引1 第二个元素项
    索引2 第三个元素项
    索引3 第四个元素项
    索引4 第五个元素项

记住这点非常重要,因为有时候需要通过索引值来访问指定的元素项。

通过节点网络设置数组值

如果的数组要在运行时进行赋值,那么一般不使用默认值。此时,将在构建脚本或事件图表中使用节点来填充每个索引。

**

Add Item(添加项目)

**
Add Item(添加项目) 取入一个数组和一个变量。它将该变量插入到数组的尾部,并相应地增加数组的大小。
在这里插入图片描述
**

Clear(清除)

**
Clear 节点将清除相连接的数组中的所有数据,重置数组,并删除数组中的所有索引值。
在这里插入图片描述
**

Contains Item(包含变量)

**
Contains Item(包含项目) 节点允许搜索一个数组来查找特定变量。如果找到了该变量,那么该节点则输出 True ,否则会输出 False 。它不会返回找到的该变量所处的索引值。
在这里插入图片描述
**

Filter Array(过滤数组)

**
Filter Array(过滤数组) 节点取入一个类型为 Actor(或其任何子项) 的数组,并基于输入的 Class(类) 过滤该数组。所得结果是一个新数组,仅包含原始数组中和相连的类的类型相匹配的项目。
在这里插入图片描述
**

Find Item(过滤项目)

**
Find Item(过滤项目) 节点取入一个数组和一个变量,然后查找在数组中第一次找到那个变量的值时该值所处的索引编号。
在这里插入图片描述
**

Get(获取)

**
Get(获取) 节点取入一个数组和一个整型值,该整型值用作为索引编号。然后,它返回在索引编号处找到的数组值。
在这里插入图片描述
**

Insert Item(插入项目)

**
Insert Item(插入项目)节点取入一个数组、一个变量值和一个整型值(索引编号)。然后,它把该变量的值插入到数组中的该索引值指定的位置处。
在这里插入图片描述
**

Last Index(最后一个索引值)

**
Last Index(最后一个索引值) 节点返回数组中最后一个值的索引编号。
在这里插入图片描述
**

Length(长度)

**
Length(长度) 返回数组的大小或数组中元素项的个数。如果数组中有 N 个对象,那么 Length 将返回 N , 而数组的有效索引值是从 0 到 N-1 。
在这里插入图片描述
**

Remove Index(删除索引)

**
Remove Index(删除索引) 节点通过使用项目的索引编号来从数组中删除那个项目。所有其他的索引编号将会自动更新来弥补该空缺。
在这里插入图片描述
**

Remove Item(删除项目)

**
Remove Item(删除项目) 将通过取入一个变量值来从数组中删除一个项目。如果在数组中找到了那个值,则删除它。所有其他的索引编号将会自动更新来弥补该空缺。这个节点具有布尔值输出,如果找到了该项目并将其删除了,则返回 True 。
在这里插入图片描述
**

Resize(调整大小)

**
Resize(调整大小) 节点将取入一个数组和一个整型值,该整型值为该数组的新的容量大小。如果调整大小后的数组小于原始数组,那么所有不适合调整后的数组的元素项都将会丢弃。如果调整大小后的数组大于原始数组, 则会在数组尾部添加空元素项。
在这里插入图片描述
**

Set Array Elem(设置数组元素)

**
Array Elem(数组元素) 允许您将一个数组的一个特定索引设置为特定的值。

在这里插入图片描述

2019-07-31 18:46:26 lei_7103 阅读数 459

在众多关卡中来回切换,就出现了一个问题,因为子关卡不能获取到其他关卡中的数据,所以需要一个公共的变量来进行记录所需要的数据,进行获取以及设置。

示例:两个子关卡中都有控件蓝图,分别有两个按钮,点击后加载对应的场景

一、创建基于GameInstance类的蓝图类命名为MyGameInstance

1.在文件夹空白处右键创建蓝图类,在类型中的其他类中搜索GameInstance,命名为MyGameInstance

 

2.打开创建的MyGameInstance,创建变量类型为int的变量命名为localLevelIndex,权限更改为公开。(只是用于测试)

3.在工具栏选择编辑/项目设置,选择 项目/地图&模式 ,在GameInstance 选项中选择自己创建的MyGameInstance

二、文件夹空白处右键创建两个关卡,(可以用前两节的关卡)分别命名

1.我的关卡命名为LeveStreamingVolume,及TwoLevelStreaming,打开固定关卡,将两个关卡作为子关卡拖入到固定关卡下方。

  

2.子关卡前方的眼睛代表的是在当前固定关卡中是否可以看到子关卡的物体,如果关闭,子关卡中对应的物体将会消失,选中其中的子关卡进行设置,分别拖入正方体和球,摆放好位置(一号关卡中 为正方体,二号关卡中 为球)

三、创建控件蓝图。

1.文件夹空白处右键创建User Interface下的控件蓝图,命名为OneUMG,先创建一个 另外一个直接复制粘贴就可以。

2.打开创建的控件蓝图,在设计师面板,创建两个按钮,并在按钮下添加text 文本框,分别命名为场景一,及场景二,放好位置

3.选择场景二的button控件,细节面板中最下方选择 OnClick,点击 + 号 ,进入图表中

4.编辑卸载当前关卡,加载二号子关卡逻辑

首先先要获取到GameInstance中的变量,使用节点Get GameInstance ,然后将获取到的GameInstance转换类型为MyGameInstance,这样才可以获取到指定的数据变量,使用get locallevelinde节点,为了方便使用该变量,可以在控件蓝图中创建一个int 类型变量来接收关卡全局变量。

LocalLevelIndex为提升变量,用来记录当前值,该操作每次当关卡加载的时候都会执行一次。

5.在刚才自动创建的按钮响应事件节点,编辑逻辑,当点击按钮后更改全局变量并加载二号关卡,并卸载当前关卡。

使用switch int节点进行判断当前全局变量值。

6.复制一份UMG,命名为TwoUMG,将场景一的按钮按上面的方式进行创建执行方法,更改设置的全局变量值,及加载、卸载关卡的名称

四、打开对应的子关卡蓝图,创建控件,显示UMG

1.可以在Blueprints,下选择子蓝图进行编辑子关卡蓝图。(或者选择在文件夹中创建的子关卡,单独打开)

2.显示UMG

LeveStreamingVolume 关卡蓝图

towLevelStreaming 关卡蓝图

说明:当子关卡加载后,子关卡蓝图有BeginPlay节点的 会自动执行。

五、在主关卡中,WorldLevel,编辑关卡蓝图,设置全局变量值,及加载LeveStramingVolume子关卡,并显示鼠标。

五、运行

初始状态

点击场景二按钮

点击场景一按钮

如果有多个子关卡,可以设置一个函数,用于判断全局变量值,返回当前关卡名称,直接连接到要卸载的关卡名称上,人物在固定关卡中,如果在子关卡,当子关卡被卸载的时候,人物也会跟随卸载。可以尝试在每个子关卡中有单独的人物。

 

 

2017-05-02 17:25:00 weixin_34391854 阅读数 93

本节书摘来异步社区《Unreal Engine 4蓝图可视化编程》一书中的第2章,第2.3节,作者: Brenden Sewell 译者: 陈东林 责编: 胡俊英,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.3 添加音效和粒子效果

既然我们已经拥有了更好的玩家移动和射击属性,将我们关注的点转向敌方目标。现在的效果是射击目标圆柱体后圆柱体会变成红色。然而,目前没有任何可以被玩家完全摧毁的目标。

我们可以通过添加蓝图逻辑来添加更多的与目标之间的交互,比如在击中目标两次及以上时销毁物体,同时增加玩家的奖励,一旦目标被摧毁,就产生一个令人满意的声音和视觉效果。

2.3.1 为目标状态添加分支

我们需要保证CylinderTarget蓝图中有使目标圆柱体的状态变化逻辑。打开Blueprints文件夹中的CylinderTarget蓝图,找到事件Hit节点组。当我们的子弹击中目标圆柱体时,这些节点通知圆柱体改换红色材质。为了在圆柱体被击中两次后给圆柱体添加改变圆柱体行为的能力,我们需要为蓝图添加一个检查圆柱体被击中次数的计数器,然后根据状态显示不同的结果。如图2.13所示操作,可以帮助我们完成这个功能。


2_13

为了在蓝图中创建多结果的条件逻辑,我们要利用分支(Branch)节点。这里的分支节点使用一个布尔变量作为输入。由于布尔变量的值只有真或假两种情况,分支节点只能产生两种结果。这两种节点可以通过连接的其他节点的输出执行引脚执行,代表真通道和假通道。

创建分支的第一步时定义你的布尔变量代表什么,并且哪些情况会将条件值从假改变为真。我们要创建一个表示目标被击中的初始状态,然后当目标再次被击中时被摧毁。开始创建一个Primed布尔变量吧。

回忆之前在我的蓝图(My Blueprint)面板定义的变量,读者应该看到了之前为速度和方向定义的两个变量。单击加号(+)按钮添加变量,新的变量类型默认为布尔型,所以就不用去修改了,将它重命名为Primed并勾选可编辑使得在外部也能修改变量。最后,编译、保存蓝图。因为我们并不希望目标在一次都没被击中的情况下就处于primed状态,所以我们将变量的默认值设为假(false)(编译保存后默认值的勾选框不勾选)。

既然有了Primed布尔变量,将它从我的蓝图面板拖放到事件图表中,选择获取选项。这个将从变量中获取状态数据(真/假),同时也让我们能够在蓝图中使用它。从Primed节点的输出引脚拖出红色引线到事件图表,搜索并添加分支节点。

最后,我们可以将分支节点添加到事件Hit蓝图节点组。按住[Alt]键单击节点之间的连线,断开类型转换为FirstPersonProjectile节点和Set Material节点的连接。先将Set Material节点暂时拖放到一边,然后连接类型转换为FirstPersonProjectile节点的输出执行引脚和分支节点的输入执行引脚,现在将在目标圆柱体被击中时都调用分支来进行判断。

既然我们已经将分支节点激活,就需要给目标圆柱体一些指令来响应每个状态。我们希望创建的目标可以有这3种状态:默认(Default)、击中一次(Primed)和销毁(Destroyed)。由于销毁一个actor不能执行任何行为,所以在目标销毁后就不能有任何行为发生。因此,我们只需要关注默认、击中一次这两种状态。

首先来完成默认状态。由于这个分支监听当圆柱体在每一次被击中后圆柱体上发生的事件,所以我们希望执行之前添加的改变材质事件。如果目标现在还没有被击中,并且现在被第一次击中,那么我们需要将材质转换为红色。此外,我们也要将Primed布尔变量设为真(True)。通过上述设置,当目标圆柱体再一次被击中时,分支节点把行为传递到其他执行队列,节点的假(False)执行队列如图2.14所示。


2_14

将Set Material节点移到分支节点的右边,将分支节点的假(False)输出执行引脚与节点Set Material的输入执行引脚相连。从我的蓝图面板中拖出Primed变量至事件图表,选择设置选项,将Primed变量的输入执行引脚与Set Material节点的输出执行引脚相连,并勾选设置节点的Primed选项。这个操作将保证当目标被第二次被击中时,分支的判断结果为真。

2.3.2 触发声音效果、爆炸、销毁

下一步就是去定义从分支节点的真分支触发的动作序列。在之前早些时候,按照我们的定义,正在摧毁一个目标时希望能够完成3件事:听到爆炸声响、看到爆炸的效果、将目标对象从游戏世界中移除。我们先从经常忽视的,但是非常关键和影响游戏体验的声音元素开始。

我们可以设计的最基本的交互就是:在游戏世界中的某个位置立即播放一个“.wav”声音文件,并且这个功能可以完美地按照我们的意愿运行。从分支节点的真执行引脚拖出引线,搜索Play Sound at Location节点,如图2.15所示。


2_15

Play Sound at Location是一个简单的节点,其承载一个声音文件和一个位置输入,并在该位置上播放声音。这个项目中有几个默认的声音文件资源,单击Sound输入引脚旁的选择资源,用户可以从下拉菜单中看到声音文件的列表,找到并选择Explosion01作为爆炸音效。

既然我们已经选择了声音资源,就需要定义在哪里播放这个声音。还记得怎样通过设置目标圆柱体的网格组件设置视野吗?可以使用与之相类似的方法来进行设置,提取出位置信息,然后将位置向量与声音节点直接连起来。然而,事件Hit触发器把这个事情简化了。

事件Hit节点的输出引脚之一为Hit Location。这个引脚包含了被事件Hit节点检测到的游戏世界中两个对象发生碰撞的位置信息。这个位置是产生爆炸效果的绝好位置,从事件Hit节点的Hit Location引脚拖出引线与Play Sound at Location节点的Location引脚相连接。

编译、保存、最小化蓝图后,在UE4编辑器中单击播放按钮进行测试。射击某一个移动目标使它变红,然后接下来的每一次射击都将产生一个爆炸音效。

既然我们的爆炸声音效果已经起作用了,现在开始添加视觉效果并销毁圆柱体,参照图2.16进行设置。


2_16


从Play Sound at Location节点的执行引脚拖出引线至事件图表的空白区域,搜索并添加Spawn Emitter at Location节点。

Spawn Emitter at Location节点看起来与Play Sound at Location节点类似,不过它还多了旋转输入引脚和Auto Destroy开关。在Emitter Template下方的下拉菜单中,找到并选择P_Explosion效果。这是FPS模板中自带的另一个标准资源,它将在发射器被添加的地方产生一个令人满意的爆炸效果。

因为我们希望爆炸效果与爆炸音效在同一个位置生成,从事件Hit节点的Hit Location引脚拖出引线与Spawn Emitter at Location节点的Location引脚相连接。爆炸是一个从所有的角度看都一样的三维效果,所以我们可以暂时不管Rotation输入引脚。Auto Destroy开关决定粒子发射器是否能被多次触发,一旦这个粒子效果被创建,我们就将包含这个粒子发射器的actor销毁,所以我们勾选Auto Destroy。

最后,我们希望在爆炸的声音和视觉效果完成后,从游戏世界中移除目标圆柱体。从Spawn Emitter at Location节点的输出执行引脚拖出引线,搜索Destroy Actor节点(为了找到这个节点,你可能需要暂时地将情境关联取消勾选)并添加。这个节点只有一个目标输入,默认为self。由于这个蓝图包含了我们想摧毁的圆柱体对象,并且self就是我们想摧毁的,所以我们不需要对这个节点进行设置。

注意 提示 

Emitter(发射器)是一个在特殊位置产生粒子效果的对象。粒子效果收集了很多小的对象,将它们结合起来创建液体、气体或其他不能触摸的效果,比如水的冲击、爆炸或光束。

扩展整个事件Hit节点序列的注释,并且更新上面的文本描述,写清楚这个节点组完成了哪些功能,如图2.17所示。


2_17

当你完成了注释的添加,请编译、保存,最小化蓝图后,在UE4编辑器中单击播放按钮进行测试。当你使用枪发射子弹击中目标圆柱体两次后,将看到爆炸效果并听到爆炸音效。

2016-05-10 11:37:00 weixin_34375054 阅读数 170

1 在头文件声明变量

 

  UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Damage")
    int32 TotalDamage;
    
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Damage")
    float DamageTimeInSeconds;
    
    UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Transient, Category = "Damage")
    float DamagePerSecond;

 UPROPERTY() 宏命令 定义变量的属性  

EditAnywhere   在UI编辑器中可编辑   

BlueprintReadWrite  在蓝图中可读写

Category = "Damage" 在编辑器中以组“Damage”显示

2 变量初始化两种方式

AMyActor::AMyActor() : TotalDamage(200),
DamageTimeInSeconds(1.f)
{

}

 

AMyActor::AMyActor()
{
  ChangeValue();
}
AMyActor::ChangeValue() 
{

TotalDamage = 200;
    DamageTimeInSeconds = 1.f;
}
 

3 此时如果在编辑器中修改变量

TotalDamage
DamageTimeInSeconds

值,DamagePerSecond的值并不会随之改变 

需要添加edit回调

#if WITH_EDITOR
void AMyActor::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{
  
changeValue();
  super::PostEditChangeProperty(PropertyChangedEvent);
} #endif

 4 c++ wizard 中方法如果想要在Blueprint 中显示,在方法声明前添加宏

UFUNCTION(BlueprintCallable, Category="Damage")
void CalculateValues();

5 c++ 调用Blueprint方法(未测试)

UFUNCTION(BlueprintImplementableEvent, Category="Damage")
void CalledFromCpp();

6 Blueprint可override方法(未测试)

UFUNCTION(BlueprintNativeEvent, Category="Damage")
void CalledFromCpp();

This version still generates the thunking method to call into the Blueprint VM. So how do you provide the default implementation? The tools also generate a new function declaration that looks like _Implementation(). You must provide this version of the function or your project will fail to link. Here is the implementation code for the declaration above.

void AMyActor::CalledFromCpp_Implementation()
{
    // Do something cool here
}

 

UE4 蓝图RandomStreams

阅读数 5438