🎃

Unity ParticleSystemをJobSystemで操作する 調査メモ

2024/12/04に公開

概要

大変申し訳ありませんが、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を利用するなどの方法が取れればそちらの方がパワー味のあるエフェクトが実現できるはずです
GitHubで編集を提案

Discussion