UE基础篇七:特效

news2024/11/28 18:50:56

导语:

文末有工程地址,通过小游戏来学习特效

入门

下载项目,在文章最下面 

播放开始游戏。按住左键射击并使用WASD移动。

在本教程中,您将创建两个粒子效果。一个用于船舶的推进器,一个用于船舶爆炸时。要创建这些,您将使用粒子系统

什么是粒子系统?

顾名思义,粒子系统是一个创建和管理粒子的系统。粒子基本上是空间中的一个点。使用粒子系统,您可以控制粒子的外观和行为。

粒子系统由一个或多个称为发射器的组件组成。这些负责产生粒子。

发射器也有称为模块的组件。模块控制发射器产生的粒子的特定属性。例如,粒子的材料和初始速度。在下面的示例中,使用了两个模块来为每个粒子提供一个红色圆圈材质和随机速度。

您还可以在粒子的生命周期内更改粒子的颜色。在此示例中,粒子的颜色从红色变为蓝色:

现在您已经了解了粒子系统是什么,是时候为飞船的推进器创建一个了。

创建粒子系统

导航到ParticleSystems文件夹并单击Add New\Particle System。将粒子系统重命名为PS_Thruster,然后打开它。

Cascade:粒子系统编辑器

Cascade 由四个主要面板组成:

  1. 视口:此面板将显示您的粒子系统的预览。您可以通过按住右键单击并移动鼠标来环顾四周。要移动,请按住右键单击并使用WASD键。按F键可以快速定位,操作和在编辑器一样
  2. 详细信息:您选择的任何组件(发射器、模块等)都将在此处显示其属性。如果未选择任何内容,它将显示粒子系统的属性。
  3. 发射器:此面板将显示从左到右的发射器列表。每个发射器显示其模块的列表。
  4. 曲线编辑器:曲线编辑器允许您可视化和调整模块曲线的值。并非所有模块属性都支持曲线。

现在,粒子系统正在使用默认的粒子材质。

首先,您将使用圆形材质替换粒子材质。

将材质应用于粒子

转到发射器面板并选择所需模块。

必需模块包含必要的属性,例如粒子材料和发射器持续时间。每个发射器都必须有一个必需的模块。

要更改材质,请转到 Details 面板并将Material设置为M_Particle。这会将粒子的外观更改为橙色圆圈。

直接使用工程效果是白色,不要紧往下看

接下来,您将粒子系统附加到玩家的飞船上。

附加粒子系统

返回主编辑器并导航到Blueprints文件夹。打开BP_Player,然后转到 Components 面板。

要使用粒子系统,您可以使用粒子系统组件。创建一个并将其重命名为ThrusterParticles。确保将其附加到碰撞组件。

要指定粒子系统,请转到 Details 面板并找到Particles部分。将模板设置为PS_Thruster

接下来,将ThrusterParticles位置设置为(-80, 0, 0)。这将把它放在船的后面。

最后,将Rotation设置为(0, 90, 0)。这将定向粒子系统,使粒子远离飞船。

单击编译,然后返回主编辑器。按Play查看粒子系统的效果。

粒子系统正在工作,但粒子移动有点太慢而且非常小。您可以通过设置粒子的初始速度和大小来解决此问题。

设置粒子的速度和大小

首先,您将设置粒子的初始速度。打开PS_Thruster,然后选择Initial Velocity模块。之后,展开Start Velocity\Distribution

默认情况下,粒子的初始速度范围为(-10, -10, 50)(10, 10, 100)

要以更快的速度将粒子从飞船上移开,您需要做的就是增加Z速度。将Min Z设置为300,将Max Z设置为400

以下是原始速度和新速度之间的比较:

接下来,您将设置粒子的初始大小。

设置粒子的大小

选择Initial Size模块,然后转到 Details 面板。之后,展开Start Size\Distribution

与 Initial Velocity 模块一样,Initial Size 也有最小和最大范围。但是,对于本教程,您会将大小设置为一个常量值。为此,请将 Distribution 设置Distribution Vector Constant

注意:分布允许您在范围内或曲线上指定恒定值。您还可以使用蓝图设置值。要了解更多信息,请前往虚幻引擎文档中的分发页面。

然后,将Constant设置为(70, 70, 70)。这是一个尺寸比较:

返回主编辑器并按Play

粒子看起来更好,但它们之间的距离仍然很远。这是因为粒子生成之间的持续时间过长。要解决此问题,您可以提高生成率。

增加粒子生成率

要提高生成率,您需要使用Spawn模块。该模块控制发射器产生粒子的速度。除了必需之外,每个发射器都必须有一个 Spawn 模块。

打开PS_Thruster然后选择Spawn。转到 Details 面板,然后展开Spawn\Rate部分。

常数设置为50。这会将生成速率提高到每秒 50 个粒子。

返回主编辑器并按Play

如您所见,它现在看起来更像一条小径。为了使粒子看起来更像推进器火焰,您可以随着时间的推移缩小它们。

随着时间的推移缩小粒子

打开PS_Thruster,然后转到 Emitters 面板。

要缩小粒子,您可以使用Size By Life模块。该模块将在其生命周期内将乘数应用于粒子的大小。通过右键单击发射器中的空白空间并选择Size\Size By Life来创建一个。

默认情况下,这对粒子的大小没有视觉影响。这是因为乘数始终设置为 1。要缩小粒子,您需要调整模块的曲线,使大小乘数随时间减小。但首先,什么是曲线?

什么是曲线?

曲线是点的集合。每个点有两个东西:一个位置和一个值。

当你有两个或更多点时,你就形成了一条线。下面是基本线性曲线的示例。点 A的位置和值为0点 B的位置为2,值为1

如果您在任何位置对线性曲线进行采样,它的功能类似于线性插值。例如,如果您在位置1对上面的曲线进行采样,您将收到0.5的值。

如果您创建一条下降的曲线,您收到的价值将逐渐变小。这是您要用于“按寿命计算尺寸”模块的曲线类型。

现在,您将在 Cascade 中创建上面的曲线。

修改模块的曲线

选择Size By Life,然后转到 Details 面板。之后,展开Life Multiplier\Distribution\Constant Curve\Points在这里,您将看到Life Multiplier曲线的点列表。

In Val是曲线上点的位置。对于Size By Life,值0表示粒子生命的开始。值1表示粒子生命周期的结束

要随时间减小尺寸乘数,您需要减小第二个点的Out Val。将点1的值设置为(0, 0, 0)。这将随着时间的推移将粒子的大小减小到 0。

您可以使用曲线编辑器可视化Life Multiplier曲线。为此,请单击Size By Life模块上的图形图标。

这会将生命乘数添加到曲线编辑器中。要将曲线拟合到视图中,请单击曲线编辑器中的拟合

如您所见,在粒子的生命周期内,大小乘数从 1 减小到 0。

返回主编辑器并按播放

粒子现在看起来更像火焰!您将添加到此粒子系统的最后一件事是颜色变化。

添加颜色变化

要使用 Cascade 设置粒子的颜色,您需要正确设置粒子材质。导航到Materials文件夹并打开M_Particle

目前,颜色是在材质中设置的。要使用粒子系统中的颜色,您需要使用ParticleColor节点。

首先,删除连接到Emissive Color的节点。接下来,添加一个ParticleColor节点并像这样连接它:

揭示

单击应用,然后关闭M_Particle

要设置粒子的颜色,可以使用Initial Color模块。

初始颜色模块

打开PS_Thruster,然后添加一个Initial Color模块。您可以在颜色类别下找到它。

要添加颜色变化,您需要指定颜色的范围。为此,您可以使用分布。

选择初始颜色,然后转到详细信息面板。展开Start Color部分并将 Distribution 更改Distribution Vector Uniform。这将允许您为每个颜色通道指定一个范围。

对于本教程,颜色范围应为橙色到红色。为此,请将Max设置为(1.0, 0.0, 0.0)并将Min设置为(1.0, 0.35, 0.0)

如果您查看视口,您会发现颜色表现异常。

虚幻引擎 4 粒子系统教程

这是因为Color Over Life模块不断将颜色更新为白色。要解决此问题,请选择Color Over Life并按Delete。您的模块列表现在应该如下所示:

关闭PS_Thruster,然后在主编辑器中按Play 。看看那些推进器的火焰!

接下来,您将学习如何切换粒子系统,具体取决于船是否在移动。

切换粒子系统

要检查船是否在移动,您可以检查玩家是否按下了任何移动键。

打开BP_Player并找到Event Tick节点。将以下设置添加到节点链的末尾:

让我们来看看这个设置的作用:

  1. 这将检查MoveUpMoveRight轴映射。如果两者都返回0,则意味着玩家没有按下任何移动键。
  2. 如果Branch返回true(玩家没有按下任何移动键),则停用ThrusterParticles
  3. 如果Branch返回false(玩家正在按下移动键),则激活ThrusterParticles

单击编译,然后关闭BP_Player。按播放并在移动和不移动之间切换以查看切换。

现在是有趣的部分了:创建一个爆炸粒子系统!

创建爆炸效果

您将复制推进器粒子,而不是创建新的粒子系统。导航到ParticleSystems文件夹,右键单击PS_Thruster选择Duplicate。将其重命名为PS_Explosion然后打开它。

对于爆炸,所有粒子应该同时产生而不是一个一个产生。这称为突发发射

创建突发

首先,您需要将生成率设置为零,因为您不想使用默认生成行为。选择Spawn模块并将Spawn\Rate\Distribution\Constant设置为0

接下来,您需要告诉发射器您要创建一个爆发。向下滚动到Burst部分并将新条目添加到Burst List。您可以通过单击+图标来执行此操作。

每个条目将包含三个字段:

  1. 计数:产生多少粒子。将此设置为20
  2. Count Low:如果大于或等于 0,则生成的粒子数量范围为Count LowCount。将其保留为-1
  3. 时间:何时产生粒子。值 0 表示发射器生命周期的开始。值 1 表示发射器的生命周期结束。将其保留为0.0

注意:您可以在“必需”模块中找到发射器的持续时间。它在Duration部分下列为Emitter Duration

这意味着发射器将在其生命之初产生20 个粒子。

为了让它看起来像爆炸,你需要设置速度,使粒子向外移动。

向外移动粒子

由于这是一个自上而下的游戏,您只需要指定 X 和 Y 速度。选择Initial Velocity模块并展开Start Velocity\Distribution。将Max设置为(1000, 1000, 0)并将Min设置为(-1000, -1000, 0)

通过指定从负到正的范围,粒子将从发射器向外移动。

接下来,您需要设置发射器应循环的次数。

Setting the Emitter Loops

默认情况下,发射器将无限循环。 这对于火焰和烟雾等效果非常有用,但爆发应该只播放一次。 要解决此问题,您需要告诉发射器仅循环一次。

选择所需模块,然后找到持续时间部分。 将发射器循环设置为 1。

现在,是时候在敌人死亡时播放爆炸了!

Spawning Particles on Enemy Death

返回主编辑器并导航到 Blueprints 文件夹。 打开 BP_Enemy,然后找到 OnDeath 事件。

要生成粒子系统,您可以在 Location节点处使用Spawn Emitter 。创建一个并将其连接到Destroy Actor

接下来,将Emitter Template设置为PS_Explosion

最后,创建一个GetActorLocation并将其连接到Location引脚。

现在,当敌人死亡时,它会在敌人的位置生成一个PS_Explosion实例。

单击编译,然后返回主编辑器。按播放并开始拍摄一些坏人。

看看那些爆炸!接下来,您将通过使它们与敌人的颜色相同来为它们添加一些额外的香料。

将爆炸颜色更改为敌人颜色

要使用敌人的颜色,您需要一种从蓝图中接收该信息的方法。幸运的是,Cascade 有一个允许这样做的分发类型。

打开PS_Explosion并选择Initial Color模块。将Start Color\Distribution设置为Distribution Vector Particle Parameter

这将为您提供一个可以使用蓝图设置的参数。将参数名称设置为PrimaryColor

对于爆炸,您将使用敌人的两种颜色。要使用第二种颜色,您将需要另一个发射器。右键单击发射器上的空白区域并选择Emitter\Duplicate and Share Emitter。这将复制发射器。

您会注意到现在每个模块旁边都有一个+号。通过使用Duplicate 和 Share Emitter而不是Duplicate,您已经链接了模块而不是复制它们。您在一个模块中所做的任何更改也将在另一个发射器的同一模块中发生。如果您想更改所有发射器的属性(例如大小),这很有用。

您需要更改的唯一模块是Initial Color。但是,如果您进行更改,两个发射器都会收到更改。在这种情况下,您不希望模块被链接,因为它们需要单独的参数名称。取消链接的最简单方法是删除重复的初始颜色模块并创建一个新模块。

注意:在撰写本文时,没有用于取消链接模块的内置方法。

选择新的Initial Color并将Start Color\Distribution设置为Distribution Vector Particle Parameter。接下来,将Parameter Name设置为SecondaryColor

至此,粒子系统就完成了。关闭PS_Explosion

接下来,您需要使用蓝图设置参数。

使用蓝图设置粒子参数

打开BP_Enemy,然后在Spawn Emitter 之后的 Location添加突出显示的节点:

这将允许您在PS_Explosion中设置两个参数。

现在,您需要设置正确的参数名称。将第一个Set Color Parameter的Parameter Name设置为PrimaryColor。将第二个Set Color Parameter的Parameter Name设置为SecondaryColor

最后,您需要提供颜色。为了使事情更容易,颜色已经存储在变量PrimaryColorSecondaryColor中。将每个变量连接到它们各自的节点,如下所示:

这是您最终应该得到的结果:

让我们回顾一下事件的顺序:

  1. 当敌人死亡时,它会在其位置生成一个PS_Explosion实例
  2. PS_ExplosionPrimaryColor参数将被设置
  3. 将设置PS_ExplosionSecondaryColor参数

单击编译,然后关闭BP_Enemy。按播放并开始射击敌人以查看粒子混乱!

 工程地址:张乂卓从头学UE4/Particle

原文链接:https://www.raywenderlich.com/270-unreal-engine-4-particle-systems-tutorial

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1218493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从0开始学习JavaScript--JavaScript 循环与迭代详解

JavaScript中的循环和迭代是编写高效和灵活代码的关键。循环用于重复执行一段代码,而迭代则用于遍历数据结构。本文将深入研究JavaScript中常见的循环结构和迭代方法,并通过丰富的示例代码来帮助读者更好地理解和运用这些概念。 基本的for循环 for循环…

RT-Thread STM32F407 定时器

定时器简介 硬件定时器一般有 2 种工作模式,定时器模式和计数器模式。不管是工作在哪一种模式,实质都是通过内部计数器模块对脉冲信号进行计数。下面是定时器的一些重要概念。 计数器模式:对外部输入引脚的外部脉冲信号计数。 定时器模式&…

21 - 深入JVM即时编译器JIT,优化Java编译

说到编译,我猜你一定会想到 .java 文件被编译成 .class 文件的过程,这个编译我们一般称为前端编译。Java 的编译和运行过程非常复杂,除了前端编译,还有运行时编译。由于机器无法直接运行 Java 生成的字节码,所以在运行…

java springboot在当前测试类中添加临时属性 不影响application和其他范围

目前 我们的属性基本都写在 application.yml 里面了 但是 如果 我们只是想做一下临时变量的测试 有没有办法实现呢? 显然是有的 这里 我们还是先在application.yml中去写一个 test属性 下面加个prop 然后 我们尝试在测试类中 获取一下这个属性 直接用 Value 读取…

第七篇 基于JSP 技术的网上购书系统——新品上架、推荐产品、在线留言、搜索功能实现(网上商城、仿淘宝、当当、亚马逊)

目录 1.新品上架 1.1功能说明 1.2界面设计 1.3处理流程 1.4数据来源和算法 1.4.1数据来源 1.4.2查询条件 1.4.3表间关系 1.4.4相关sql实例 2.推荐产品 2.1功能说明 2.2界面设计 2.3处理流程 2.4数据来源和算法 2.4.1数据来源 2.4.2查询条件 2.4.3表间关…

【Spring】Spring中的DI(依赖注入)Dependence Import

由之前的IoC可以知道,我们写在具体对象后面的new方法肯定不能要了,这时候就要通过依赖注入的形式将Dao配置到Service中 Dependence Import的步骤如下: 1. 在Service类中给Dao提供setter方法 原本我们是直接给bookDao new了一个对象 public …

【Linux】vscode远程连接ubuntu失败

VSCode远程连接ubuntu服务器 这部分网上有很多,都烂大街了,自己搜吧。给个参考连接:VSCode远程连接ubuntu服务器 注意,这里我提前设置了免密登录。至于怎么设置远程免密登录,可以看其它帖子,比如这个。 …

vscode的git 工具使用

vscode的git 工具使用 目录概述需求: 设计思路实现思路分析1.git 工具的使用2.提交代码3.查看历史提交代码 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a be…

【OJ比赛日历】快周末了,不来一场比赛吗? #11.18-11.24 #15场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…)比赛。本账号会推送最新的比赛消息,欢迎关注! 以下信息仅供参考,以比赛官网为准 目录 2023-11-18(周六) #5场比赛2023-11-19…

UE基础篇五:动画

导语: 视频文档在文末 一、动画 1.1 物理资产可以用来做布娃娃系统 1.2 混合空间 调整这个值会在动画切换时有一个插值时间,表现为等一下再切 1.3 启用根运动 1.4 一些导入设置只有在导入时才有效, 1.5 动画图标可以预览调节数值<

【微软技术栈】C#.NET 内存映射文件

本文内容 进程、视图和管理内存使用内存映射文件编程示例 内存映射文件包含虚拟内存中文件的内容。 借助文件和内存空间之间的这种映射&#xff0c;应用&#xff08;包括多个进程&#xff09;可以直接对内存执行读取和写入操作&#xff0c;从而修改文件。 可以使用托管代码访…

在Spring Boot中使用Redis的发布订阅功能

Redis的发布订阅模式是一种消息传递模式&#xff0c;它允许多个订阅者订阅一个或多个频道&#xff0c;同时一个发布者可以将消息发布到指定的频道。这种模式在分布式系统中非常有用&#xff0c;可以解决以下问题&#xff1a; 实时消息传递&#xff1a;发布订阅模式可以用于实时…

【洛谷算法题】P5712-Apples【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5712-Apples【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格式&…

linux运行java程序

这个帖子实现的是linux上运行java代码 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 事情发生的原因是博洋需要知道海外城市的数量&#xff0c;我一开始准备将全量数据拉取到本地&#xff0c;用代码遍历一遍。但是打包好全量数据&…

数据结构 链表

单链表&#xff1a;单链表用来写邻接表&#xff0c;邻接表用来存储图和树 双链表&#xff1a;用来优化某些问题 单链表 链式存储 #include<stdio.h> #include<stdlib.h> int cont 0; //结构体 typedef struct List { int data; //数据域 struct List* next; //…

实战:给docusaurus文档网站配置Algolia 实现全站内容搜索功能-2023.11.16(已解决)

更新于&#xff1a;2023年11月16日 次文档已全部脱敏&#xff01; 实战&#xff1a;给docusaurus文档网站配置Algolia 实现全站内容搜索功能-2023.11.16(已解决) 目录 前提条件 &#x1f340; 前提条件 具备docker环境 具有自己的网站 &#x1f340; 实验软件&#xff08…

【BIM入门实战】Revit属性对话框中“视图范围”工具的使用方法详解

每个平面图都具有视图范围属性&#xff0c;也称为可见范围。视图范围是一组水平平面&#xff0c;可以控制视图中对象的可见性和外观。水平面为顶部平面、剖切面和底部平面。顶部切割平面和底部切割平面表示视图范围的顶部和底部。剖切面是确定视图中某些图元可视剖切面高度的平…

Android JNI静态和动态注入方法

作者&#xff1a;MiniCode Android调用C/C的代码目前比较流行的方式之一便是通过JNI&#xff0c;其中按本地方法的实现有两种方式&#xff1a;静态和动态 创建一个C项目或者C的Module&#xff1a; 创建成功之后会生成如下文件&#xff08;CMakeLists.txt、nativelib.cpp&#…

C#,数值计算——插值和外推,Base_interp的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Abstract base class used by all interpolation routines in this chapter. /// Only the routine interp is called directly by the user. /// </summary> pu…

SoftwareTest8 - 怎样测试一个系统的性能 ?

Hello , 大家好 , 又给大家带来新的专栏喽 ~ 这个专栏是专门为零基础小白从 0 到 1 了解软件测试基础理论设计的 , 虽然还不足以让你成为软件测试行业的佼佼者 , 但是可以让你了解一下软件测试行业的相关知识 , 具有一定的竞争实力 . 这篇文章是带着大家先了解一些性能测试的概…