unity3d - 如何直接控制粒子,同时防止粒子系统做同样的事情?
问题描述
我有很多相同的简单对象会影响游戏玩法,成千上万个!好吧,不是数千,而是很多。因此,如果我将它们设为 GameObjects,FPS 会降低,尤其是在生成它们时。即使是池化。我应该尝试不同的方法。
您知道 Unity3D 中的粒子系统可以非常快速地渲染许多粒子。它还可以自动控制、发射和移除粒子。但在我的例子中,物体的位置和生命周期是由游戏逻辑管理的,粒子系统不允许在没有我的命令的情况下做任何事情,甚至是重新排序粒子。
我正在尝试使用SetParticles
方法来控制粒子。它适用于我GetParticles
首先使用的测试项目。我什至可以删除将生命周期设置为 -1 的粒子,但不能生成新粒子。它也不会阻止粒子系统控制粒子。
我可以禁用发射,因此不会自动创建任何粒子。
我可以将粒子速度设置为 0,这样它们就不会移动。
我可以将生命周期设置为巨大的数字,这样它们就不会被删除。
我有一个Particle
实例池,以避免不必要的 GC 分配。对象在生成时接收对粒子的引用,在更新时更改它,并设置生命周期 -1 并在删除时将其返回到池中。池存储以下内容:
private ParticleSystem.Particle [] _unusedParticles;
private int _unusedCount;
private ParticleSystem.Particle [] _array;
_unused
池化需要数组和计数器,并_array
存储所有粒子,无论是使用过的还是未使用过的,并在SetParticles
调用中使用。
这种方法的主要缺点是它不起作用,可能是因为SetParticles
它不会创建新的粒子。另外我猜它对粒子绘制顺序没有任何作用,这就是为什么它不适合子弹模式应该看起来不错的子弹地狱游戏。
我应该怎么做才能正确禁用粒子的自动控制并正确设置直接控制,包括生成和移除?
解决方案
您正在寻找的可能是
List<Matrix4x4> matrixes=new List<Matrix4x4>();
for (...)
{
matrixes.Add(Matrix4x4.TRS( position,rotation,scale));
}
Graphics.DrawMeshInstanced(mesh,0,material, matrixes);
在每一帧上,您只需更新位置、旋转和缩放,并在一次绘制调用中获取所有在 GPU 上渲染的实例(与单独的游戏对象相比非常快)。您可以使用这种方式在一次调用中渲染多达 1000 个实例
推荐阅读
- visual-studio-code - VS Code JSON 格式在文件更改时恢复
- ruby - Chrome DevTools 协议 addScriptToEvaluateOnNewDocument 使用 ruby chrome_remote
- php - 如何在不更改 php.ini max_execution_time 的情况下避免超过 60 秒的最大执行时间 Laravel
- python - 两个字符串,并让输入的字母打印出另一个字符串中的内容
- python - Python,Keras,RNN:无法将大小为 7 的序列复制到维度为 5 的数组轴
- mysql - 构建一个 mysqli 查询以获取两行的内部连接
- python - 负 cross_val_score() 是什么意思?
- c++ - 如何检测奇数个值并打印出错误消息
- excel - 根据 2 个标准隐藏单元格
- r - 以更有效的方式使用 geosphere::distm?