Unity5.X- 粒子系统,粒子沿着一定的轨迹运动的研究

本文介绍了如何使用Unity5.X的粒子系统让粒子沿着预设的路径运动,通过调整Velocity over LifeTime的Curve并编写扩展脚本来自动化这一过程。首先设置Start Speed为0,然后通过编辑Velocity over LifeTime的Curve来控制粒子的轨迹。文章提供了一个Monobehaviour脚本示例,用于动态设置粒子系统的Velocity over LifeTime Curve,并展示了如何在Editor中预先生成沿路径的运动Curve。
摘要由CSDN通过智能技术生成

最近项目有个需求就是模拟油管里的油流动的效果,想想让建模的直接做一个动画是最简单!不过,自己也想用粒子系统来实现一下!初期得到不错的效果!现在的需求就是这里有一根油管,当然不是一根直直的油管,会拐弯,油管里会有油在流动!

找了很多资料也没有找到关于如何让粒子沿着路径运动的,那么自己开始动手吧!

原理很简单,我们都知道粒子系统里有一个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);
        }
    }
}


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面是一个主要的工具类:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值