3d学习笔记(七)——粒子系统

粒子系统

作业要求

这周的作业是在已有的资源的基础上,根据上课所了解的粒子系统,制作自己的粒子系统,并通过代码控制,实现自定义的粒子在不同场景中的效果。

作业资源

话不多说,先上传一下作业最终的版本跟效果视频

理解粒子系统

尽管该次作业有老师提供的博客参考,不过由于unity版本的不同,粒子系统上的参数设置也是很不一样,最后还是需要自己学习理解每一个参数究竟是干嘛的,最终才能实现自定义的粒子

particle主控

这里写图片描述

  • Duration:粒子发射周期,如图的意思就是在发射3.32秒以后进入下一个粒子发射周期。如果没有勾选looping的话,0.6秒之后粒子会停止发射。
  • Looping:粒子按照周期循环发射。
  • Prewarm:预热系统,比如说我有一个空间大小的粒子系统,但是粒子发射速度有限,我想在最开始的时候让粒子充满空间,此时就应该勾选Prewarm。
  • StartDelay:粒子延时发射,勾选后,延长一段时间才开始发射。
  • StartLifeTime:粒子从发生到消失的时间长短。
  • StartSpeed:粒子初始发生时候的速度。
  • 3DStartSize:这个属性是当你需要把粒子在某一个方向上扩大的时候使用。
  • StartSize:粒子初始的大小。
  • 3DStartRotation:需要在一个方向旋转了子的时候可以使用。
  • StartRotation:粒子初始旋转。
  • RandomizeRotation:随机旋转粒子方向,感觉在3D粒子的情况下,尤其是圆形的没什么用。
  • StartColor:粒子初始颜色,可以调整加上渐变色。
  • GravityModifier:重力修正。
  • SimulationSpace:a.Local,此时粒子会跟随父级物体移动。b.World,此时粒子不会跟随父级移动。c.Custom,粒子会跟着指定的物体移动。
  • SimulationSpeed:根据Update模拟的速度。
  • DeltaTime:一版的DeltaTime都是1,如果需要用到Sacled是在游戏需要暂停的时候,根据TimeManager来定。如果选择UnScale的话,就会忽略时间的影响。
  • ScalingMode:Local:粒子系统的缩放和自己Transform的一样会忽略父级的缩放。Hierarchy:粒子缩放跟随父级。Shape:将粒子系统跟随初始位置,但是不会影响粒子系统的大小。
  • EmitterVelocity:
  • MaxParticles:粒子系统可以同时存在的最大粒子数量。如果粒子书数量超过最大值粒子系统会销毁一部分粒子。
  • AutonRandomSeed:随机种子,如果勾选会生成完全不同不重复的粒子效果,如果勾选即为可重复。

Emission

这里写图片描述

  • RateOverTime:随单位时间生成粒子的数量。
  • RateOverDistance:随着移动距离产生的粒子数量。只有当粒子系统移动时,才发射粒子。
  • Bursts:
    • Time:从第几秒开始。
    • Min:最小粒子数量。
    • Max:最大的粒子数量,粒子的数量会在Min和Max之间随机。
    • Cycles:在一个周期中循环的次数。
    • Interval:两次两次Cycles的间隔时间。

Shape

这里写图片描述

  • Shape:规定了粒子初始位置的形状
  • 下面就是调整一下该形状的参数

Color over Lifetime

这里写图片描述
这里写图片描述

  • 颜色渐变器:即粒子从产生到消失的颜色变化,左边是开始,右边是消失,中间是存在时的颜色

Textures Sheet Animation

这里写图片描述

  • Mode:
    • Grid:用网格来实现。
    • Sprite:通过相同尺寸的Sprite实现粒子动画。
  • Tiles:网格的行列数。
  • Animation:
    • WholeSheet:动画作用于整个表格。
    • SingleRow:动画只用于单独一行。有一个随机的选项可以选择或者是选择单独的一行来做动画。
  • FrameOverTime:根据时间来播放帧,横坐标是1s,纵坐标是帧数。
  • StartFrame:开始的帧是哪一帧。
  • Cycles:在1秒之内循环播放的次数。
  • FlipU:翻转U。
  • FlipV:翻转V。
  • EnabledUVChannels:

Renderer

这里写图片描述

  • RenderMode:
    • Billboard:粒子总是面对相机。
    • StretchedBillboard:伸展板,可以根据相机,速度,长度来调节粒子的缩放。
    • HorizontalBillboard:粒子平面平行于Floor平面。
    • VerticalBillboard:粒子平面平行于世界坐标的Y轴,但是面向相机。
    • Mesh:将粒子渲染到网格上去。
  • TrailMaterial:需要使用拖尾效果的时候,才附材质。
  • Material:用于渲染粒子的材质。
  • SortMode:
    • ByDistance:根据粒子离相机的距离渲染。
    • OldestInFront:先渲染出来的在最上层。
    • YoungestInFront:后渲染出来的在最上层。
  • SortingFudge:排序容差,仅影响整个系统在场景中出现的位置。Sorting值越小,就越容易粒子系统在其它透明的GameObjects上绘制的机会。
  • Pivot:修改粒子渲染的轴点。
  • VisualizePivot:可视化轴点。
  • Masking:
  • CustomVertexStreams:在材质的顶点着色器中配置哪些粒子属性可用。
  • CastShadows:使用阴影。
  • ReceiveShadows:规定阴影是否可以投射到粒子上,只有Opaque(不透明)的材质可以接受阴影。
  • MotionVectors:

作业实践

未控制的粒子

粒子包括三个部分:

  • 中间光的模拟
  • 光晕的模拟
  • 周围星光的模拟

具体设置的参数如下:

  • 中间光的模拟
    这里写图片描述
    这里写图片描述

  • 光晕的模拟
    这里写图片描述
    这里写图片描述

  • 周围星光的模拟
    这里写图片描述
    这里写图片描述

  • 注意的是三者都是创建在空对象的下面

代码控制的粒子

模拟下矿洞,或者调入深渊中,头上的太阳模拟

  • 控制光的代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class change2 : MonoBehaviour
{

    ParticleSystem exhaust;
    float size = 1.7f;

    // Use this for initialization
    void Start()
    {
        exhaust = GetComponent<ParticleSystem>();
    }

    // Update is called once per frame
    void Update()
    {
        size = size * 0.999f;
        var main = exhaust.main;
        main.startSize = size;
    }
}
  • 控制光晕的代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class change : MonoBehaviour {

    ParticleSystem exhaust;
    float size = 5f;

    // Use this for initialization
    void Start () {
        exhaust = GetComponent<ParticleSystem>();
    }

    // Update is called once per frame
    void Update () {
        size = size * 0.999f;
        var main = exhaust.main;
        main.startSize  = size;
    }
}
  • PS:由于不知道怎么把startsize的属性赋值到float上,所以只能笨拙的在代码中先行输入了大小

遇到的问题

主要是在texture模块中,关于一个有多个帧的图片,怎么去切割,以及怎么去规定从哪一帧开始,一秒多少帧的问题。这个大概花去了我做这个作业的一半时间。具体也不多说了,还是得自己去理解,上面有参数的说明,可以尝试自己理解后制作。

猜你喜欢

转载自blog.csdn.net/qq_36312878/article/details/80492125