您的位置: 机械学习网> 行业应用>解决方案> 正文

打印本文             

粒子系统操作方法

车辆的排气烟雾

简单爆炸

可使用粒子系统来创建令人信服的爆炸效果,但动态性可能比最初看起来要复杂一些。爆炸的核心就是向外爆发的大量粒子,可以应用一些简单的修改使效果显得更真实。

正在发生的粒子系统爆炸

正在发生的粒子系统爆炸粒子的时间轴

一次简单爆炸会产生在各个方向迅速向外扩展的一团火焰。最初爆发有很多能量,因此温度非常高(即亮度高)并且移动得非常快。此能量迅速消散,导致火焰膨胀速度减慢并且温度降低(即亮度降低)。最后,随着所有燃料燃尽,火焰将消失并很快完全消失。

爆炸粒子的生命周期通常较短,可以在该生命周期内改变几种不同的属性来模拟效果。粒子将以非常快的速度开始移动,但随着从爆炸中心移开,其速度应该会大大降低。此外,颜色应该从最开始的明亮逐渐变暗,并最终淡化为透明状态。最后,在粒子的生命周期内逐渐减小其大小将产生火焰随着燃料耗尽而消散的效果。

实现

从默认粒子系统对象(菜单:__GameObject > Effects > Particle System__)开始,选择 Shape 模块,并将发射器形状设置为小型_球体 (Sphere),比如半径约为 0.5 个单位。标准资源中的粒子包括一种名为 ParticleFireball 的材质unity粒子系统碰撞后爆炸,这种材质非常适合用于爆炸(菜单:__Assets > Import Package > ParticleSystems__)。可以使用 Renderer_ 模块为系统设置此材质。在打开 Renderer 后,还应禁用 Cast Shadows 和 _Receive Shadows_,因为爆炸火焰应该发出光而不是接受光。

在此阶段,系统看起来像是从中心点抛出的许多小火球。当然,爆炸应该同时产生大量粒子爆发的效果。在 Emission 模块中,可将 Rate 值设置为零,并在时间为零的位置添加一个粒子 Burst 状态。爆发中的粒子数量取决于需要的爆炸规模和强度,但一般在开始时使用大约五十个粒子是一种不错的选择。设置好爆发后,系统现在开始看起来很像爆炸了,但速度相当缓慢,火焰似乎长时间停留不动。在粒子系统模块(名称与游戏对象相同,例如“Explosion”)中,请将系统的 Duration 和粒子的 Start Lifetime 均设置为两秒。

unity刚体碰撞粒子_两物体碰撞后 二次碰撞_unity粒子系统碰撞后爆炸

此外还可以使用 Size Over Lifetime 模块来创建随着燃料耗尽而变化的火焰效果。应使用“斜降”(ramp down) 预设来设置大小曲线(即,大小从 100% 开始并减小到零)。要使火焰变暗和淡化,请启用 Color Over Lifetime 模块,并将渐变设置为在左侧以白色开始,然后在右侧以黑色结束。Fire Add 材质使用附加着色器进行渲染,因此颜色属性的暗度也控制着粒子的透明度;随着颜色逐渐变黑,火焰将变得完全透明。而且,附加材质允许粒子的亮度在粒子彼此重叠产生时“加”在一起。当粒子全部靠近到一起时,这种功能有助于进一步增强在爆炸开始时出现的明亮闪光效果。

到目前为止,爆炸初步成形,但看起来好像是在太空中发生爆炸。粒子首先被发射出来,然后在消失之前以恒定速度长距离行进。如果游戏设定是在太空中,那么这种效果是很贴切的。但是,在大气中发生的爆炸会被周围的空气减缓和减弱。启用 Limit Velocity Over Lifetime 模块,然后将 Speed 设置为大约 3.0 并将 Dampen 分数设置为大约 0.4,这样应该会看到爆炸发生后逐渐失去一些能量。

最后要注意的是,当粒子从爆炸中心移开时,它们各自的形状变得更容易识别。也就是说,此时会看到所有粒子具有相同的大小和相同旋转,感觉很明显每个粒子重复使用了相同的图形。为了避免这种情况,一种简单方法是在粒子生成时为粒子的大小和旋转添加一些随机变化。在检视面板顶部的粒子系统模块中,单击 Start Size 和 Start Rotation 属性右侧的小箭头,并将这两者均设置为 Random Between Two Constants。对于旋转,请将两个值设置为 0 和 360(即完全随机旋转)。对于大小unity粒子系统碰撞后爆炸,请将值设置为 0.5 和 1.5 以便呈现一些变化,而不会有太多巨大或微小粒子的风险。现在将会看到,粒子图形的重复问题现在已经不显示。

用途

在测试过程中,开启 Looping 属性很有用,这样可以反复看到爆炸,但在已完成的游戏中,应关闭该属性,使爆炸只发生一次。为有可能爆炸的对象(例如油箱)设计爆炸时,需要将粒子系统组件添加到该对象并禁用 Play On Awake 属性。然后,可根据需要从脚本中启用爆炸。

    void Explode() {
            var exp = GetComponent();
            exp.Play();
            Destroy(gameObject, exp.duration);
        }

unity粒子系统碰撞后爆炸_unity刚体碰撞粒子_两物体碰撞后 二次碰撞

在其他一些情况下,爆炸发生在撞击点。如果爆炸来自对象(例如手榴弹),则可在延迟一段时间后或在与目标接触时调用上述 Explode 函数。

    // 手榴弹经过一段延迟时间后爆炸。
        public float fuseTime;
        void Start() {
            Invoke("Explode", fuseTime);
        }

unity粒子系统碰撞后爆炸_unity刚体碰撞粒子_两物体碰撞后 二次碰撞

// 手榴弹在撞击时爆炸。 void OnCollisionEnter(Collision coll) { Explode(); }

如果爆炸来自实际上并未在游戏中表示出来的对象(例如,飞行速度太快而无法看到的飞弹),可在适当的位置实例化爆炸。例如,可以确定射线投射的接触点。

    // 在爆炸对象上。
        void Start() {
            var exp = GetComponent();

unity粒子系统碰撞后爆炸_两物体碰撞后 二次碰撞_unity刚体碰撞粒子

exp.Play(); Destroy(gameObject, exp.duration); } //可能的飞弹脚本。 public GameObject explosionPrefab; void Update() { RaycastHit hit;

unity粒子系统碰撞后爆炸_两物体碰撞后 二次碰撞_unity刚体碰撞粒子

if (Physics.Raycast (Camera.main.ScreenPointToRay (Input.mousePosition), out hit)) { Instantiate (explosionPrefab, hit.point, Quaternion.identity); } }

思路拓展

此处介绍的爆炸是非常基本的,但可对其进行各方面的修改,从而在游戏中获得所需的确切效果。

使用的粒子图形将在很大程度上影响玩家对爆炸的“解读”。出现大量可独立识别的小型火焰表明抛出了燃烧碎片。不完全分离的较大粒子看起来更像是被破坏的油箱激发的火球。通常,需要一起更改多个属性才能达到效果。例如,火球会在消失之前持续更长时间并且膨胀更少,而剧烈的爆发可能会使燃烧碎片散开相当远的距离。

此处一些属性设置为随机值,但是其他许多属性有 Random Between Two Constants/Curves 选项,因此可通过各种方式添加变化。改变大小和旋转有助于避免最明显的粒子重复效果,但也可以考虑在 Start Delay、Start Lifetime 和 Start Speed 属性中添加一些随机性。少量的变化有助于使爆炸看起来更像是一种“自然”和不可预测的效果,而非受控的机械过程。较大的变化表明是“脏”爆炸。例如,改变 Start Delay 将产生不再剧烈而爆发速度更慢的爆炸,比如可能是因为车辆中的油箱被单独点燃。

粒子系统操作方法

车辆的排气烟雾

Collision 模块

Sub Emitters 模块

Triggers 模块

内置粒子系统的 Triggers 模块可用于基于粒子与场景中一个或多个碰撞体的相互作用来访问和修改粒子。启用此模块时,粒子系统将在附加的脚本上调用 OnParticleTrigger() 回调,因此可以根据粒子相对于场景中碰撞体的位置来访问粒子列表。

粒子系统 Triggers 模块

粒子系统 Triggers 模块使用 Triggers 模块

首先,指定粒子可与场景中的哪些碰撞体进行碰撞。为此unity粒子系统碰撞后爆炸,请将一个或多个碰撞体分配给 Colliders 列表属性。要增加列表中的碰撞体数量,请单击 Colliders 列表下方的 Add (+) 按钮。要从列表中移除某个碰撞体,请选择该碰撞体,然后单击 Remove (-) 按钮。如果尚未将碰撞体分配给列表的索引,则可以使用空条目右侧较小的 Add (+) 按钮来创建和分配新的碰撞体。这将创建一个新的游戏对象作为粒子系统的子项,并将球形碰撞体附加到该游戏对象,然后将碰撞体分配给空条目。

添加碰撞体后,可指定当粒子满足传递特定触发事件类型的条件时将执行的操作。事件类型有四种unity粒子系统碰撞后爆炸,它们描述了粒子如何与碰撞体相互作用。这些事件类型如下:

在 Inspector 中,每种事件类型都有一个下拉选单,可让您选择当粒子通过触发事件的条件时粒子将发生什么情况。选项包括:

在 OnParticleTrigger() 中访问粒子

如果选择 Callback 作为对某一触发事件的反应,则可以从附加的脚本访问满足事件条件的粒子。为此,首先需要将 OnParticleTrigger() 函数添加到附加的脚本。在此函数中,调用 ParticlePhysicsExtensions.GetTriggerParticles() 函数可获取满足触发事件条件的粒子列表。此函数接受 ParticleSystemTriggerEventType(用于指定需要获取粒子的触发事件,即 Inside、Outside、Enter 还是 Exit)以及一个粒子列表(函数将向其中填充结果)。从这一列表中,可以访问、修改或销毁任何粒子。

有关该 API 以及如何使用该 API 的更多信息,请参阅。

属性属性描述

Inside

指定粒子系统在粒子位于碰撞体内的每一帧对粒子采取的操作。选项包括:

• Callback:将粒子添加到可在 OnParticleTrigger() 回调中获取的列表中

unity粒子系统碰撞后爆炸_canvas粒子碰撞_unity物体碰撞爆炸

• Kill:销毁粒子。

• Ignore:忽略粒子。

Outside

指定粒子系统在粒子位于碰撞体外的每一帧对粒子采取的操作。选项包括:

• Callback:将粒子添加到可在 OnParticleTrigger() 回调中获取的列表中

• Kill:销毁粒子。

• Ignore:忽略粒子。

Enter

指定粒子系统在粒子进入碰撞体的帧对粒子采取的操作。选项包括:

• Callback:将粒子添加到可在 OnParticleTrigger() 回调中获取的列表中

• Kill:销毁粒子。

• Ignore:忽略粒子。

Exit

指定粒子系统在粒子退出碰撞体的帧对粒子采取的操作。选项包括:

• Callback:将粒子添加到可在 OnParticleTrigger() 回调中获取的列表中

• Kill:销毁粒子。

unity粒子系统碰撞后爆炸_unity物体碰撞爆炸_canvas粒子碰撞

• Ignore:忽略粒子。

Radius Scale

粒子的碰撞体边界。允许您更紧密地将粒子的碰撞体边界匹配到粒子的视觉外观。如果粒子为圆形且其纹理具有淡入淡出效果,这将很有用,因为默认粒子碰撞体将在粒子达到视觉效果之前位于触发器内。请注意,当事件实际触发时,此设置不会更改,但是可以延迟或提前达到触发器的视觉效果。

• 输入 1 可以使粒子碰撞体保持同一大小,并使事件在粒子接触碰撞体时发生

• 输入小于 1 的值可以使粒子碰撞体更小,并使触发看起来是在粒子穿透碰撞体之前发生

• 输入大于 1 的值可以使粒子碰撞体更大,并使触发看起来是在粒子穿透碰撞体之后发生

Visualize Bounds

指示是否在 Scene 视图中显示每个粒子的碰撞体边界。启用此属性可显示碰撞体边界,而禁用则可隐藏碰撞体边界。

示例

下面的示例会导致粒子在进入碰撞体的边界时变为红色,然后在离开碰撞体的边界时变为绿色。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[ExecuteInEditMode]
public class TriggerScript : MonoBehaviour

canvas粒子碰撞_unity粒子系统碰撞后爆炸_unity物体碰撞爆炸

{ ParticleSystem ps; // 这些列表用于包含与每帧的触发条件 // 匹配的粒子。 List enter = new List(); List exit = new List(); void OnEnable() { ps = GetComponent(); } void OnParticleTrigger() { // 获取与此帧的触发条件匹配的粒子

unity粒子系统碰撞后爆炸_unity物体碰撞爆炸_canvas粒子碰撞

int numEnter = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Enter, enter); int numExit = ps.GetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit); // iterate through the particles which entered the trigger and make them red for (int i = 0; i < numEnter; i++) { ParticleSystem.Particle p = enter[i]; p.startColor = new Color32(255, 0, 0, 255); enter[i] = p; } // 迭代离开触发器的粒子并使它们变绿 for (int i = 0; i < numExit; i++) { ParticleSystem.Particle p = exit[i]; p.startColor = new Color32(0, 255, 0, 255);

canvas粒子碰撞_unity物体碰撞爆炸_unity粒子系统碰撞后爆炸

exit[i] = p; } // 将修改后的粒子重新分配回粒子系统 ps.SetTriggerParticles(ParticleSystemTriggerEventType.Enter, enter); ps.SetTriggerParticles(ParticleSystemTriggerEventType.Exit, exit); } }

请查看以下图像以了解此示例的结果:

Editor 视图

Editor 视图

Game 视图

Game 视图

Collision 模块

Sub Emitters 模块


解决方案

——

联系我们

努力创造优质作品,奉献更多精品佳作

机械学习网

  • 地 址:广东省广州市天河区珠江新城高德置地广场
  • 电 话:400-1234-5678
  • 邮 箱:749843418@qq.com
机械学习网微信二维码
Copyright Your WebSite.Some Rights Reserved.机械学习网,机械,机械设备 鄂ICP123456789 , 由 Z-blog · 网站模板 驱动