🎃
Unity ParticleSystemをJobSystemで操作する 調査メモ
概要
大変申し訳ありませんが、ParticleSystemを使いこなせておらず出来るらしいという興味の記事です
ParticleSystemの処理をJobSystemで一部分散させる方法のメモ
※ParticleSystemについては、解説しないので詳しくは各自で調べてください
得られる効果
通常ParticleSystemのパラメーターを触るだけで十分なエフェクトを得られますが
スクリプトから制御したい場合にUpdate関数を利用する部分を
JobSystemに制御を移行する事でパフォーマンスを稼げる
公式の資料
パーティクルシステム C# Job System インテグレーション
MonoBehaviour.OnParticleUpdateJobScheduled()
サンプル
particleSystemの位置を取得し、指定の方向に速度を与える
MonoBehaviour側
GameObject側でのParticleSystemの操作管理はこちらで行います。
public class ParticleJobSample : MonoBehaviour
{
[SerializeField]
private ParticleSystem particleSystem;
[SerializeField]
private float accelerator = 1f;
private void Start()
{
particleSystem.Play();
}
// パーティクル専用ジョブスケジュール関数
private void OnParticleUpdateJobScheduled()
{
if(particleSystem == null) return;
// ジョブの作成
var job = new ParticleAccelerationJob
{
m_DeltaTime = Time.deltaTime,
m_Accelerator = accelerator
}.Schedule(particleSystem);
}
}
Job側
こちらにParticeleSystemの挙動を記述するようにします
[BurstCompile]
public struct ParticleAccelerationJob : IJobParticleSystem
{
public float m_DeltaTime;
public float m_Accelerator;
public void Execute(ParticleSystemJobData particles)
{
// z軸をキャプチャする
var positionsY = particles.positions.z;
for (int i = 0; i < particles.count; i++)
{
// 現在地から位置を移動させる
positionsY[i] += m_Accelerator * m_DeltaTime;
}
}
}
雑記
- バリバリにUpdateで制御を記述したエフェクトでは、パフォーマンスを多少稼げると思いますので手段の一つとして、試してみる価値はありそうです
- パフォーマンスを追求する場合、自力でJobSystemで自作パーティクルシステムを組む、VFX Graphを利用するなどの方法が取れればそちらの方がパワー味のあるエフェクトが実現できるはずです
Discussion