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

本系列文章由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;
    }
}

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

时间: 2024-12-15 04:35:59

【U3D】粒子沿特定路径移动的相关文章

[linux/net]策略路由实现特定主机特定路径

echo 200 silence >> /etc/iproute2/rt_tables ip rule add from 10.192.0.230 table silence ip rule add from 10.192.0.231 table silence ip rule add from 10.192.0.232 table silence ip rule add from 10.192.0.233 table silence ip rule add from 10.192.0.234

nginx,apache屏蔽特定路径下的php,python解析

工作中碰到一些目录需要写入数据,为了安全起见需要屏蔽特定路径下的php,python解析. nginx相关配置: location ~/(data|sites/upload)/.*\.(php|php5|py|pyc|sh)?$ { deny all; } apache相关配置: <Directory /usr/local/apache/htdocs/bbs/data> php_flag engine off </Directory> <Directory ~ "^

tomcat中实现特定路径下的图片的url访问

使用Tomcat作为服务器的时候,如果不配置图片保存路径,将图片保存在项目路径下,那么再次打war包发布项目可能会造成图片的丢失,每次重启前将图片先保存再copy到服务器明显不方便,这时可以配置图片保存位置,将图片保存到项目外的地方,方法如下: 打开tomcat - conf下的server.xml文件,在Host节点下添加 <Context  docBase="G:/upload/images"  path="/images" /> docBase为图

从特定路径下下载文件到本地

package com.hanqi.test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.net.MalformedURLException; import java.net.Socket; import java.net.URL; import java.net.URLConnection; import java.util.z

JavaEE 获取路径全攻略

本篇博客是 JavaWeb 应用服务器端在不同环境下获取文件路径的全面总结. 获取文件路径后主要应用的场景,读取 JavaWeb 自定义配置文件.在特定路径下生成各种类型的文件提供下载...... 想必看官也是来找方法的,先看上面目录有没有能解决你问题的,如果有就点击进到对应小节,如果没有速度关闭,看搜索引擎列出来的下一条记录吧. 1.Servlet 的init 方法中获取 getServletContext().getRealPath("/"); output :E:\workspa

Unity-3D 粒子光圈效果

这一次要完成的是http://i-remember.fr/en 网站所示的白色圆圈效果. 首先,我们先来看一下它的效果: 一.网站效果展示 二.创建粒子 设置相关参数 把相机背景色调黑 三.编写脚本 1.新建脚本:ParticleRotate.cs,并将其拖到Paticle System中. 2.创建粒子数组,初始化.同时我们需要为记录每个粒子的初始角度,初始半径.考虑后续可能每个粒子会有更多属性,所以写了一个class来管理粒子属性 根据下图我们知道,需要随机生成角度以及半径,从而表示出某一个

dos批处理运行带空格路径软件的两种方法

最近在学习dos批处理时遇到一个问题,就是运行特定路径程序时如果路径中带有空格则会出现问题,于是去网上查找解决方法,总结了两种方法如下: 例如:打开英伟达控制面板,路径为C:\Program Files\NVIDIA Corporation\Control Panel Client\nvcplui.exe 此时如果直接用start C:\Program Files\NVIDIA Corporation\Control Panel Client\nvcplui.exe会提示说找不到文件,那么如何解

Qt5官方demo分析集11——Qt Quick Particles Examples - Affectors

在这个系列中的所有文章都可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集10--Qt Quick Particles Examples - Emitters Affectors是Qt官方粒子系统demo中的第二个例程,它是在Emitters上的进一步扩展.我们将看到.通过使用Affectors,我们可以创造更加灵活的粒子显示以及交互行为. 首先还是看下介绍:This is a col

Linux每天一个命令:tar

Linux tar命令简介: tar命令可以为linux的文件和目录创建档案.利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件.tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案.利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的. 首先要弄清两个概念:打包和压缩.打包是指将一大堆文件或目录变成一个总的文件:压缩则是将一个大的文件通过一些压缩算法变成