最近项目有个需求就是模拟油管里的油流动的效果,想想让建模的直接做一个动画是最简单!不过,自己也想用粒子系统来实现一下!初期得到不错的效果!现在的需求就是这里有一根油管,当然不是一根直直的油管,会拐弯,油管里会有油在流动!
找了很多资料也没有找到关于如何让粒子沿着路径运动的,那么自己开始动手吧!
原理很简单,我们都知道粒子系统里有一个Velocity over LifeTime 这样一个属性,里面是可以选择使用Curve来设置粒子生命周期内的速度属性!速度决定粒子的运动轨迹!
1.一开始我们设置粒子的Start Speed 为0,避免对我们设置的速度造成影响;
2.开始调整Velocity over LifeTime的Curve,使粒子沿着我们要求的路径进行运动;
好了,就这两点!不过我相信即使原理简单,但是要手动去调Curve也会让人崩溃,而且还要调X,Y,Z三个方向上的速度曲线!
一开始我是手动调的,明白了调整Curve可以让粒子沿着路径运动是可以做到的,那么下面就开始动手写一个小扩展,用代码帮忙调Curve了,毕竟程序员就是要用程序来简化实际中的很多工作!
首先先写一个运行时动态设置例子系统的Velocity over LifeTime 的Curve的Monobehaviour吧!
第一步:在场景中放置N个路径点;
第二步:写脚本,脚本大致就是通过场景中的路径点的得到位置,注意路径点不能重叠,否则得不到想要的效果,然后认定其中一个为起点,然后计算方向和距离,并得到每前后两个点的距离和总的路径长度,通过前后两个点之间的距离与总的距离的比得到该点在Curve上X轴的位置,当然第一个点从0开始!然后生成AnimationCurve,有一点需要说明的就是KeyFrame设置里面的inTangent和outTangent,这里设置成正无穷大,就表示是90度角,那么我们得到的Curve会是一根折现,而且Curve所有拐角的地方都是90度角,因此我们得到粒子沿着路径运动实际上是沿着一根折线路径,这也是我这里沿着路径运动的粒子比较受限制的地方!不过你可以再调整好沿着折线运动之后,再去调整Curve的inTangent和outTangent就可以达到沿着曲线运动了,哈哈,当然这个运行时设置Curve的脚本就没有这个功能了,不过后面我写到的一个小扩展就可以做到!先上代码:
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
public class PathParticle : MonoBehaviour
{
public ParticleSystem Particle;
public Transform[] wayPoints;
void Start()
{
if (wayPoints.Length > 1)
{
Queue<FrameDate> frames;
float distance = ParticleUtils.CalculateDirection(new List<Transform>(wayPoints), out frames);
Particle.transform.position = wayPoints[0].transform.position;
AnimationCurve curve_X;
AnimationCurve curve_Y;
AnimationCurve curve_Z;
float lifeTime = distance / Particle.startLifetime;
ParticleUtils.MakeCurve(frames, distance, lifeTime, out curve_X, out curve_Y, out curve_Z);
var vel = Particle.velocityOverLifetime;
vel.enabled = true;
vel.space = ParticleSystemSimulationSpace.Local;
vel.x = new ParticleSystem.MinMaxCurve(lifeTime, curve_X);
vel.y = new ParticleSystem.MinMaxCurve(lifeTime, curve_Y);
vel.z = new ParticleSystem.MinMaxCurve(lifeTime, curve_Z);
}
}
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面是一个主要的工具类: