2016-07-09 15 views
1

パーティクルシステム関数を毎回インスタンス化するのではなくプールに変更しようとしています。私は粒子を再利用したい。そんなことがあるものか?私は統一チュートリアルを見ましたが、どのように開始するのか分かりませんが、何とかそれはまだ不明です。多分私は他のクラスのパーティクルシステム関数を呼び出すので、何とか私を混乱させるでしょう。Unity:パーティクルシステムをプールに変更

public ParticleSystem[] Myeffects; 


public void Particle(int particleNum, Vector3 Pos) 
{ 
    if (Myeffects != null && Myeffects[particleNumber] != null) 
    { 
     if (Myeffects[particleNumber].isPlaying) 
      Myeffects[particleNumber].Stop(); 

     ParticleSystem temp = Instantiate(Myeffects[particleNum], particlePos, new Quaternion()) as ParticleSystem; 

     temp.Play(); 
    } 
} 
} 
+0

粒子を再利用したいです。あなたのコードはパーティクルそのものではなく、**パーティクル**システムをインスタンス化しています。 – AgentFire

+0

どのように影響しますか? – John

+0

チュートリアルからスクリプトをコピーするだけで、を使用する代わりに、を使用してください。 – Absinthe

答えて

2

まず第一に、あなたのパーティクルシステムプレハブ/ TNTは目を覚ましオンプレイがチェックされていることを確認し、その後選択します。以下のプーリングスクリプトは、それを達成するためのトリッキーな方法です。 ParticleSystemの配列を作成し、それらを再利用します。 ParticlePoolではなく、MonoBehaviourから継承していますので、必ず直接コピーしてください。

using UnityEngine; 
using System.Collections; 
using System; 

public class ParticlePool 
{ 
    int particleAmount; 
    ParticleSystem[] NormalParticle; 
    ParticleSystem[] TNTParticle; 

    public ParticlePool(ParticleSystem normalPartPrefab, ParticleSystem tntPartPrefab, int amount = 10) 
    { 
     particleAmount = amount; 
     NormalParticle = new ParticleSystem[particleAmount]; 
     TNTParticle = new ParticleSystem[particleAmount]; 

     for (int i = 0; i < particleAmount; i++) 
     { 
      //Instantiate 10 NormalParticle 
      NormalParticle[i] = GameObject.Instantiate(normalPartPrefab, new Vector3(0, 0, 0), new Quaternion()) as ParticleSystem; 

      //Instantiate 10 TNTParticle 
      TNTParticle[i] = GameObject.Instantiate(tntPartPrefab, new Vector3(0, 0, 0), new Quaternion()) as ParticleSystem; 
     } 
    } 

    //Returns available GameObject 
    public ParticleSystem getAvailabeParticle(int particleType) 
    { 
     ParticleSystem firstObject = null; 

     //Normal crate 
     if (particleType == 0) 
     { 
      //Get the first GameObject 
      firstObject = NormalParticle[0]; 
      //Move everything Up by one 
      shiftUp(0); 
     } 

     //TNT crate 
     else if (particleType == 1) 
     { 
      //Get the first GameObject 
      firstObject = TNTParticle[0]; 
      //Move everything Up by one 
      shiftUp(1); 
     } 

     return firstObject; 
    } 

    //Returns How much GameObject in the Array 
    public int getAmount() 
    { 
     return particleAmount; 
    } 

    //Moves the GameObject Up by 1 and moves the first one to the last one 
    private void shiftUp(int particleType) 
    { 
     //Get first GameObject 
     ParticleSystem firstObject; 

     //Normal crate 
     if (particleType == 0) 
     { 
      firstObject = NormalParticle[0]; 
      //Shift the GameObjects Up by 1 
      Array.Copy(NormalParticle, 1, NormalParticle, 0, NormalParticle.Length - 1); 

      //(First one is left out)Now Put first GameObject to the Last one 
      NormalParticle[NormalParticle.Length - 1] = firstObject; 
     } 

     //TNT crate 
     else if (particleType == 1) 
     { 
      firstObject = TNTParticle[0]; 
      //Shift the GameObjects Up by 1 
      Array.Copy(TNTParticle, 1, TNTParticle, 0, TNTParticle.Length - 1); 

      //(First one is left out)Now Put first GameObject to the Last one 
      TNTParticle[TNTParticle.Length - 1] = firstObject; 
     } 
    } 
} 

次に、ParticleHolderスクリプトを次のコードで更新する必要があります。それでおしまい。これ以上のインスタンス化はありません。

public class ParticleHolder : MonoBehaviour 
{ 

    public ParticleSystem[] effects; 
    ParticlePool particlePool; 

    void Start() 
    { 
     // 0 = Normal crate 
     // 1 = TNT crate 
     particlePool = new ParticlePool(effects[0], effects[1], 5); 
    } 

    public void playParticle(int particleType, Vector3 particlePos) 
    { 
     ParticleSystem particleToPlay = particlePool.getAvailabeParticle(particleType); 

     if (particleToPlay != null) 
     { 
      if (particleToPlay.isPlaying) 
       particleToPlay.Stop(); 

      particleToPlay.transform.position = particlePos; 
      particleToPlay.Play(); 
     } 

    } 
} 
+0

あなたは10種類の粒子を意味しますか?私は2種類しかないと思った? – Programmer

+0

はい、私は10をインスタンス化すると言っていました。さらにテストした後、私は5だけをインスタンス化することにしました。あなたが 'particlePool = new ParticlePool(effects [0]、effects [1]、5); 5人で十分です。それはそれらを再利用します5.あなたはそれ以上のものを必要としません。それを試してみてください。 – Programmer

+0

あなたを更新します。ありがとう^^ – John

関連する問題