首页 > 其他分享 >Unity - 粒子系统跟随路径移动

Unity - 粒子系统跟随路径移动

时间:2022-12-13 15:04:41浏览次数:70  
标签:粒子系统 ps index 路径 Waypoints OnInspectorGUI Unity ParticleSystem


对于最新版的粒子系统Particle System,要让其跟随路径移动,无非就是借用其自身的API直接为每个粒子设置速度。

看一下最终的效果图:

Unity - 粒子系统跟随路径移动_Assembly

Unity - 粒子系统跟随路径移动_复选框_02

Unity - 粒子系统跟随路径移动_编辑器_03

编辑器

为了能在场景中更方便的编辑路径,我们要将路径点的编辑功能加入到Inspector界面,但同时我们并不想破坏ParticleSystem自身的Inspector界面,所以这需要在不替换掉ParticleSystem组件原有Editor扩展的情况下加入我们的扩展布局。

这里的思路来自于雨松MOMO的一篇文章:​​http://www.xuanyusong.com/archives/3931​

方法十分简单粗暴,直接用反射获取ParticleSystemInspector类(这是Unity底层对于ParticleSystem组件的Inspector界面扩展类),创建一个实例,然后每次在我们自己的OnInspectorGUI()方法调用时,都调用一次ParticleSystemInspector实例的OnInspectorGUI()方法,也就是在ParticleSystem的Inspector界面同时保持了两种布局。

代码如下:

private Assembly _assembly;
private Type _particleSystemInspector;
private MethodInfo _onInspectorGUI;
private Editor _particleSystemEditor;

//载入程序集
_assembly = Assembly.GetAssembly(typeof(Editor));
//获取ParticleSystemInspector类
_particleSystemInspector = _assembly.GetTypes().Where(t => t.Name == "ParticleSystemInspector").FirstOrDefault();
//获取OnInspectorGUI方法
_onInspectorGUI = _particleSystemInspector.GetMethod("OnInspectorGUI", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
//创建ParticleSystemInspector的实例
_particleSystemEditor = CreateEditor(target, _particleSystemInspector);

然后在我们自己的Editor类的OnInspectorGUI()方法中,加一句话就可以了:

_onInspectorGUI.Invoke(_particleSystemEditor, null);

这样,再加上我们自己的布局代码,就可以在ParticleSystem的Inspector界面同时保持两种布局。

编辑路径

Unity - 粒子系统跟随路径移动_粒子系统_04

1.勾选路径模式前面的复选框,为开启路径模式,粒子系统的所有粒子都将忽略原有的生命值和速度,保证自身的生命值能够走到路径的结尾。
2.选中路径点,可以在场景中编辑路径点的位置。
3.右下角的加号为新增路径点。
4.Speed的值越小,粒子的移动速度越快。

代码实现

ParticleSystem的粒子类(Particle)有一个速度属性,包含了速度方向与速度值,我们只需要根据路径的变化改变其值就可以了:

//路径
public List<Vector3> Waypoints;

//获取当前的激活粒子
ParticleSystem.Particle[] ps = new ParticleSystem.Particle[PS.particleCount];
int pCount = PS.GetParticles(ps);

for (int i = 0; i < pCount; i++)
{
//计算生命值比例
float proportion = (ps[i].startLifetime - ps[i].remainingLifetime) / ps[i].startLifetime;
//判断所在的路径点
int index = Mathf.FloorToInt(proportion * Waypoints.Count);
if (index >= 0 && index < Waypoints.Count - 1)
{
Vector3 direction = Waypoints[index + 1] - Waypoints[index];
//赋予新的速度
ps[i].velocity = direction * (1.0f / Speed) * (1.0f / transform.localScale.x);
}
else
{
//超出路径之后,粒子销毁
ps[i].remainingLifetime = 0;
}
}
//重新设置粒子
PS.SetParticles(ps, pCount);


标签:粒子系统,ps,index,路径,Waypoints,OnInspectorGUI,Unity,ParticleSystem
From: https://blog.51cto.com/u_15911199/5934146

相关文章

  • 【Unity】 HTFramework框架(三十七)Inspector自定义序列化检视器
    更新日期:2020年8月21日。Github源码:​​​[点我获取源码]​​​Gitee源码:​​[点我获取源码]​​索引​​Inspector自定义序列化检视器​​​​使用​​​​Dropdown下拉......
  • 【Unity】 HTFramework框架(三十六)AssetsMaster资源管理器,做资产的主人
    更新日期:2020年8月13日。Github源码:​​​[点我获取源码]​​​Gitee源码:​​[点我获取源码]​​索引​​AssetsMaster​​​​使用AssetsMaster​​​​打开AssetsMaster......
  • Unity 多物体混合动画、值变动画控制器
    索引​​前言​​​​示例​​​​1、4个Cube的联动动画​​​​2、UGUIText文本动画​​​​3、UGUIImage图片动画​​​​4、物体消隐动画​​​​使用与解析​​​​1......
  • Unity实现在白板上绘画涂鸦
    前言有段时间没有更新博客了,不知道应该写些什么,太简单感觉没有记录的必要,太难自己都没能理解,不知道如何下手。回归初心,记录自己想记录的东西。需要实现一个白板绘画的功能,......
  • Unity 使用拖尾渲染器模拟简易的管道流体
    关于管道流体关于管道流体,最佳的解决方案肯定是UV动画无疑,在网上看过很多例子几乎都是这样的,毕竟用实时流体计算的话开销确实太大,用粒子系统的话又苦于难以表现出流体的粘稠......
  • Unity UGUI图文混排源码(三) -- 动态表情
    这里是根据图文混排源码(二)进一步修改的,其他链接也不贴了,就贴一个链接就好了,第一次看这文章的同学可以先去看看其他几篇文章1.首先来一个好消息,在最新版本的图文混排中,终于......
  • Unity 简易的UI背景昼夜轮替效果
    在UI背景上实现一个简易的有光影照射的昼夜轮替效果,往往比一个死板的UI背景看起来更加形象生动,比较传统的方式是多图轮流替换的序列帧动画,不过要达到整个UI背景大图的所有地......
  • 手动build unity3d的docker镜像
    手动buildunity3d的docker镜像参考资料docker官方文档:​​DockerDocumentation|DockerDocumentation​​unity3dlinux版的论坛链接,在这里能找到各个版本,以及需要安装......
  • Unity UGUI
    超详细的基础教程传送门:(持续更新中)UnityUGUI的教程好少,幸亏找到一个UGUI的Demo,看了几个例子,以下是一些简单的学习笔记:1.导入UI图片资源2.设置参数:            ......
  • unity shaderlab Blend操作
    原文链接: ​​http://www.tiankengblog.com/?p=84​​Blend混合操作是作用于在所有计算之后,是Shader渲染的最后一步,进行Blend操作后就可以显示在屏幕上。shader的计算步骤......