【Unity】 スクリプトからパーティクルを操作する

この状態からスクリプトでパーティクルを動かしていきます f:id:Brave345:20200128071147g:plain プロパティはここを変更しただけです。 f:id:Brave345:20200128065934p:plain

スクリプトからパーティクルを操作

各パーティクルの情報はParticleSystem.GetParticlesでパーティクルの情報を取得できます。

docs.unity3d.com

public class TestEffect : MonoBehaviour {

    ParticleSystem m_ParticleSystem;
    private ParticleSystem.Particle[] m_Particles;
    float m_TotalTime = 0;
    public float m_Speed = 1;
    Vector3 tmp;

     void Start()
    {
        //コンポーネントを取得
        m_ParticleSystem = GetComponent<ParticleSystem>();
    }

    void Update()
    {
        // 必要な場合のみ配列を作成しなおす
        int maxParticles = m_ParticleSystem.main.maxParticles;
        if (m_Particles == null || m_Particles.Length < maxParticles)
        {
            m_Particles = new ParticleSystem.Particle[maxParticles];
        }

        // 現在のパーティクルを取得する
        int particleNum = m_ParticleSystem.GetParticles(m_Particles);

        //パーティクルひとつひとつの処理
        for (int i = 0; i < particleNum; i++)
        {
            tmp = m_Particles[i].position;
            // ひとつひとつのパーティクルをゆらす
           tmp.x += Mathf.Cos(m_TotalTime * i) * m_Speed;
            m_Particles[i].position = tmp;
        }

        // 変更を適用する
        m_ParticleSystem.SetParticles(m_Particles, particleNum);

        m_TotalTime += Time.deltaTime;
    }
}

実行結果

こんな感じになります。

f:id:Brave345:20200128070222g:plain

tmp = m_Particles[i].position;
// ひとつひとつのパーティクルをゆらす
 tmp.x += Mathf.Cos(m_TotalTime * i) * m_Speed;
m_Particles[i].position = tmp;

の部分で各パーティクルの座標にCosカーブの値を加えてパーティクルを左右に揺らしています。

これを数学つよい人が上手く使えば通常のパーティクルシステムではできない面白い表現ができそうですね。