【U3D】粒子沿特定路径移动

来源:互联网 发布:垫下巴取出 知乎 编辑:程序博客网 时间:2024/06/04 20:04


本系列文章由CSDN@萌萌的一天 出品,未经博主允许不得转载。


      U3D中粒子是三维空间中渲染出来的二维图像,通常来说,一个粒子系统是由粒子发射器、动画器和渲染器组成的。我们可以通过脚本来控制粒子系统上的每个粒子,接下来主要讲解一下如何让粒子发射器中产生的粒子沿特定路径进行移动。

     首先呢创建一个粒子发射器,我们打算让其中产生的粒子按照如下(P1--->P2--->P3--->P4--->P5)的方向依次移动,就是下图这样的思路:

       

     

      假设一下,如果我们通过一个数组来记录每个粒子的位置,让它们依次遵循直线进行移动,这样粒子会排列成一条直线,会产生这样的运动效果:     


这种效果不是我想要的,我希望粒子移动能够像这样,它们的方向不变,但是不会排列成一条线,比如这样:


     

      

      考虑一下,为了实现这个目的, 需要创建一个位置的数组(比如P1到P5的postion),一个表示方向的数组,之后每帧判断粒子的位置,根据当前粒子的位置来决定它的移动方向,当粒子到达任意一点,如果它还在生命周期内,就让它移动到下一个点。

      OK,思路大致如此,打开U3D开始实现效果~~~

      首先,我们需要在Hierarchy面板上点击右键创建一个Particle System(粒子系统),这样系统会自动生成一个发射器,并且默认调用Particle Shader来渲染产生的粒子。

       由于新创建的粒子系统会的Shape自动调用Cone类型,我们需要把它改为Box,这样粒子就会沿着一条直线进行运动:


然后在新创建的Particle System上新创建一个脚本TestParticleMovement,代码如下所示:

using UnityEngine;using System.Collections;using System.Collections.Generic;public class TestParticleMovement : MonoBehaviour{    public List<Vector3> nodes;       public Vector3[] directions;    private ParticleSystem particles;void Start (){    GetComponent<ParticleSystem>().startLifetime = nodes.Count;    if (nodes.Count == 0)        Debug.LogError("请添加至少1个node");        //自动生成方向        directions = new Vector3[nodes.Count];        for (int i = 0; i < nodes.Count; i++)            directions[i] = (nodes[i] - ((i - 1 >= 0) ? nodes[i - 1] : transform.position));}void Update (){        particles = GetComponent<ParticleSystem>();        ParticleSystem.Particle[] particleList = new ParticleSystem.Particle[particles.particleCount];    int partCount = particles.GetParticles(particleList);    for (int i = 0; i < partCount; i++)    {            // 计算粒子当前的生命        float timeALive = particleList[i].startLifetime - particleList[i].lifetime;        float dist = GetAddedMagnitude((int) timeALive);        int count = 0;            //判断位置信息        while (dist > GetAddedMagnitude(count))        {            count++;            particleList[i].velocity = directions[count];        }    }        particles.SetParticles(particleList, partCount);}    private float GetAddedMagnitude(int count)    {        float addedMagnitude = 0;        for (int i = 0; i < count; i++)        {            addedMagnitude += directions[i].magnitude;        }        return addedMagnitude;    }}

这样就能让粒子正确的沿着设置的点进行移动了。





0 0
原创粉丝点击