IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unreal Engine蓝图编程学习(二) -> 正文阅读

[游戏开发]Unreal Engine蓝图编程学习(二)

二 升级玩家技能

目标:

我们通过修改玩家控制器蓝图,来扩展之前的射击交互的核心部分。

为角色添加冲刺、摧毁游戏对象功能,在摧毁对象时附加爆炸效果和声音效果。

  • 玩家输入和控制
  • 视野
  • 时间轴和分支逻辑
  • 为对象交互添加声音和例子效果

2.1 添加 加速功能

我们打开FirstPersonCharacter蓝图,然后找到Stick input注释的这一组节点:

?红色的触发器节点在每帧都被调用,并将TurnRateLookUpRate节点的值分别通过一个控制器输入传递出去。这些值与我们实际用的模拟摇杆的上/下?、左/右轴相匹配。只有两个触发器,是因为向上看和向下看传递的Axis Value为正值和负值。

两个轴向触发器的值都与一个变量相乘,表示玩家转身或向上(下)的速率。这些值也都与world delta seconds相乘来归一化,避免了不同帧率的影响,尽管触发器每帧都会调用,但是玩家速率保持不变。

乘积传递给的两个函数,将控制器输入转化为展现在玩家摄像机中的效果。

下面这个节点组,转换鼠标移动输入,与轴向摇杆控制器不同,它直接获取数据然后将这些值传递给相应的Add Controller Yaw Input函数和Add Controller Pitch input函数,而不需要像模拟输入做那些计算。

?管理玩家移动功能的节点组。从输入轴MoveForward输入轴MoveRight获取的轴值是由控制器或键盘输入的。在运动转换中,我们需要actor移动的方向,这样移动转换可以被应用到正确的方向。

最后一个与移动相关的就是jump节点组。输入动作Jump触发节点检测与跳起事件绑定的按键的按压和释放,并且从按键按下至抬起的时间都有相关函数进行事件监听。

?2.1.1 自定义输入控制

?FPS模板在蓝图中,绑定了一些玩家输入动作来产生一些行为。为了创建新类型的行为,我们将新的物理控制输入添加到玩家动作当中。

我们进入项目设置——输入——Binding(绑定):

?绑定下有操作映射和轴映射。

  • 操作映射:监听按键和鼠标点击事件触发玩家动作
  • 轴映射:针对的玩家移动和事件都有范围。

?这两个映射提供了一种通过在输入行为和激活行为的按键之间,插入一个中间层来方便地映射按键和坐标轴的机制。操作映射针对按键按下和释放,而轴映射针对具有连续范围的输入。

我们在操作映射下,加入两个事件动作:

?2.1.2 添加冲刺功能

接下来我们要扩展Sprint功能。

首先我们要创建触发器来激活冲刺功能,我们在事件图表中创建Sprint(InputAction Sprint)事件节点:

?我们希望修改玩家的移动速度。如果尝试添加一个节点,在搜索框内搜索speed并且勾选情景关联(context-sensitive),那会仅找到检测最大速度并校验是否超过最大速度的节点,而不能设置最大速度。

所以我们要检索到一个值,从FirstPersonCharacter附加到actor的角色运动组件上,查看组件面板并选中CharacterMoverment(继承).之后细节面板会出现一系列变量:

?具体说明:

?我们可以在细节面板中,找到Max Walk Speed(最大行走速度)。这个变量的意义如它的名字,定义了玩家可以达到的最大移动速度,并且它需要成为Sprint函数的目标。我们希望从角色移动组件中得到这个值,并添加到事件图表中。

?为此,我们将CharacterMovement组件拖入到事件图表中。然后从这个节点创建设置Max Walk Speed(确保勾选了情景关联)。我们也希望按键抬起时能减速,所以我们还需要一个Max walk speed节点。然后我们连接对应引脚:

?现在模拟中,角色的速度有明显的变化,但是按键松开后,速度会直接变为600,没有逐渐减少,这是个问题,后续可改善这部分?。

?2.2 制作瞄准镜

在事件图表中靠近Mouse input节点组的附近空白处创建Zoom view注释和输入动作Zoom(InputAction Zoom)触发器节点。

?我们希望修改FirstPersonCamera组件中的FOV(field of view视野)值,所以我们到组件面板,找到FirstPersonCamera将它拖入事件图表中从该节点创建Set Field Of View(变量)节点并选择。

?减小视野给我们一种效果:在屏幕的中央将一小块区域进行放大。由于我们的默认值是90,处理后的视野值在节点中为45。我们连接引脚,编译保存:

?我们在模拟中确实有视野缩小。但由于主摄像机中为角色剔除的对象会产生变形,所以我们要优化这一行为。

?2.2.1 使用时间轴进行平滑过渡?

?为了让视野平滑转换,我们需要创建一个将变化逐渐地显示出来的动画。为了实现这个效果,先回到第一人称角色蓝图中。

我们在输入操作Zoom节点的Pressed,重新创建一个添加时间轴节点。

时间轴允许我们在指定的时间内改变一个值(比如摄像机的视野)。利用时间轴节点可以随时间对值设置关键帧。

注释:

  • 组件末尾的(继承)标签告诉我们这个组件的功能在C++脚本中定义,而不是在蓝图中定义的。组件的功能直接在C++脚本中定义,这在进行移动或网格定义的物理计算等复杂工作的组件中很常见。

为了改变时间轴的值,双击时间轴节点,进入时间编辑器。左上角的四个按钮,每个按钮都能添加一个不同类型的并且将在时间轴过程中改变的值。

?因为视野被一个数值所表示,我们点击f按钮(添加浮点型轨迹),将添加一个时间轴,将其命名为Field of view。为了完成时间轴,我们按住shift键在(0,0)处点击(或者可以在附近点击右键添加关键帧)。

并且在上方的数值处修改为时间0,值90。并且我们将长度修改为0.3.这个操作可以将动画限定在0.3秒内完成。

?我们再用相同操作在0.3处,修改值为45。

?之后我们转回到事件图表,希望用时间轴设置视野。我们如下连接蓝图。

从时间轴节点的Field of view输出引脚至设置节点的输入引脚。这样将重写之前写死的值45。

然后将时间轴节点的Update输出执行引脚与设置节点的输入执行引脚相连。这个操作将使得视野值通过传递新的值给执行函数来随时更新。由于在时间轴已经设置过了,视野的值在这里就不需要设置了,时间轴使得视野值从90到45在0.3秒内逐渐变化。

最后,我们希望当鼠标右键松开时,取消放大视野。所以讲Released引脚连接到Reverse引脚上。这个操作使得松开鼠标右键时,原来拉近视野的动画倒着播放(即拉远视野),保证在还原到原来视野时有一个平滑的切换动画。

最后我们检查效果,放大和还原的视角都很平滑了:?

2.2.2 加快子弹的速度

?接下来我们要关注游戏的射击机制。我们在演示中可以看到,子弹的运动轨迹像是一条速度较慢的弧线,我们希望能适当的加快子弹速度。

为了修改子弹的属性,我们要打开FirstPersonProjectile

然后在组件中找到:

这是个控制子弹移动组件,其已经被添加到球体网格和碰撞器,用于定义当子弹在游戏世界中被创建后怎样移动。

我们需要修改其中的一些属性,将初始速度和最大速度修改为原来的两倍:

?然后我们移除应反弹这个选项,因为在之前中,子弹遇到物体后会反弹,像碰到了橡皮墙一样。?

?2.3 添加音效和粒子效果

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

2.3.1 为目标状态添加分支

我们需要保证CylinderTarget蓝图中有使目标圆柱体的状态变化逻辑。进入蓝图中,找到事件Hit节点组。当我们的子弹击中目标圆柱体时,这些节点通知圆柱体改变为红色材质。

为了在圆柱体被击中两次后给圆柱体添加改变圆柱体行为的能力,我们需要为蓝图添加一个检查圆柱体被击中次数的计数器,然后根据状态显示不同的结果。

为此,我们创建分支(Branch)节点。这个分支节点使用一个布尔变量作为输入。接着我们要创建一个初始状态,创建一个Primed布尔变量。

?我们将变量的默认值为假,然后将其和分支节点的条件相连,然后连接之前的节点。

?我们希望的状态有三个:默认,击中一次,销毁。由于销毁一个actor不能执行任何行为,所以在目标销毁后就不能有任何行为发生。因此我们只关注默认、击中一次这两个状态。

首先完成默认状态。我们希望这个事件为修改材质。此外,也要将Primed布尔变量设为。这样,当目标圆柱体再次被击中时,分支节点把行为传递到其他执行队列。

?2.3.2

下一步就是去定义从分支节点的真分支出发的动作序列。按照我们之前的定义,在目标被摧毁时,应该有:

  • 有爆炸声响
  • 看到爆炸的效果
  • 将目标对象从游戏世界中移除

所以我们从真分支创建如下的节点:

?这个节点承载一个声音和位置信息输入,并在该位置上播放声音。我们在sound上选择默认的声音资产。关于位置信息,我们的事件Hit将这件事简化了。它的输出引脚之一为Hit Location。这个引脚包含了被事件Hit节点检测到的游戏世界中两个对象发生碰撞的位置信息。

这个位置是产生爆炸效果的绝好位置,所以我们将这个引脚和音效的位置引脚相连。

接着我们从音效节点创建Spawn Emitter at Location节点。这个节点和播放位置处音效类似。

?在Emitter Template下选择P_Explosion效果。这个是FPS模板自带的另一个标准资源,它将在发射器被添加的地方产生一个令人满意的爆炸效果。

因为我们希望爆炸效果与爆炸音效在同一个位置生成,将事件Hit节点的Hit Location引脚和此节点的Location引脚相连。

爆炸是一个从所有角度看都一样的三维效果,所以我们可以暂时不管Rotation

?Auto Destroy开关决定粒子发射器能否能被多次触发,一旦这个粒子效果被创建,我们就将包含这个粒子发射器的actor销毁,所以我们勾选这个选项。

最后我们希望在这些效果完成后,从游戏世界中移除目标圆柱体。创建Destroy Actor节点。由于这个蓝图包含了我们想摧毁的圆柱体对象,并且self就是我们想要摧毁的,所以我们不需要对这个节点进行设置。

注释:

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

总结:

游戏中添加音效和视觉效果,是主角应该有的能力。

在这一章中,我们创建了一些自定义的玩家控制来允许玩家冲刺加速和拉近的视野。在这个过程中,我们探索了移动控制器时怎样将玩家的输入转换为游戏体验。我们也通过时间轴创建了简单的动画。然后通过为敌方目标添加爆炸效果和音效,在目标被击中两次时添加不同的状态,增加了更多的玩家与环境的反馈。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-09-20 16:04:04  更:2021-09-20 16:04:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/28 4:32:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码