2017-08-02 19 views
0

私はパーティクルエフェクトを使用して再生を開始し、停止します。私はこれが私が見ている簡単な修正だと確信しています。パーティクルシステムが再生できません(

パーティクルはインスタンス化して再生できますが、パーティクルは必然的に階層内でアクティブであるオーバーヘッドとパーティクルを残します。

public void EmitFX(ParticleSystem particle) 
{ 
    Instantiate(particle, particlePos, Qauternion.identity) 
} 

私はParticleSystem内でメソッドを使用したいと思いますが、いくつかの問題が発生しています。私はマニュアルを使っていて、まだブロックに入っています。私は、コードを以下に変更した他の問題に基づいて、これを上下に探検しました。それはまだ動作しませんし、今のハッキングに他の人々をベースモンスターが重宝されています。ここで/

public void EmitFX(ParticleSystem particle) 
    { 
     particle = particle.GetComponent<ParticleSystem>(); 
     particle.transform.position = ballPos; 

     var em = particle.emission; 
     em.enabled = true;  

     particle.Play(); 
    } 

はインスペクタで、粒子のS/Cです。すべての

enter image description here

+0

あなたのタイトルは、あなたの質問が何であるかを明確にしてくださいすることができ、あなたが困っ演奏を持っており、あなたの質問は、あなたがインスタンス化し、再生することができますと言うと言いますか?さらに、実行中のこれらの「問題」と「ブロック」は何ですか? – ryeMoss

+0

パーティクルはインスタンス化して再生することができますが、必然的に階層内でアクティブなオーバーヘッドとパーティクルが残っていることは明らかです。 パーティクルシステムを一度インスタンス化したいと思います。その後、必要に応じてPlay()とStop()を再生できるようになります。問題とブロックは、私が何を変更するのかに関わらず、コードを賢明にしようとすると動作させることができないということです。私はマニュアルを読み、ParticleSystem内のPlay()関数を意図したとおりに実行することはできません。 – Shrykar

答えて

2

まず、particle = particle.GetComponent<ParticleSystem>();ラインが行うことになっているかわかりませんか? particle変数はParticleSystemであり、EmitFX()メソッドに提供するので、これを呼び出す必要はありません。

あなたのスクリプトにいくつかの参照の問題があります(いくつかの変数があなたのプレハブを参照しています。次に、この参照をオーバーライドします...)ので、私はあなたのコードを "クリーナー"あなたの2つのスクリプト):それは後でそれにアクセスし、それが発生した覚えことができるように、それは変数にインスタンス化粒子を格納している何

#region Attributes 
[SerializeField] 
private ParticleSystem particle; 

private ParticleSystem generatedParticle; 
#endregion 

#region MonoBehaviour 
protected void Start() 
{ 
    generatedParticle = null; 
} 

protected void Update() 
{ 
    if(Input.GetKeyDown(KeyCode.Space)) 
    { 
     EmitFX(particle); 
    } 
} 
#endregion 

public void EmitFX(ParticleSystem a_Particle) 
{ 
    if(generatedParticle == null) 
    { 
     generatedParticle = Instantiate(particle, particlePos, Qauternion.identity); 
    } 

    generatedParticle.transform.position = ballPos;  
    generatedParticle.Play(); 

    // You can set a fixed duration here if your particle system is looping 
    // (I assumed it was not so I used the duration of the particle system to detect the end of it) 
    StartCoroutine(StopFXAfterDelay(generatedParticle.main.duration)); 
} 

private IEnumerator StopFXAfterDelay(float a_Delay) 
{ 
    yield return new WaitForSeconds(a_Delay); 
    generatedParticle.Stop(); 
} 

。また、コルーチンを追加して、エフェクトの終了時に無効にしました。このことができます

希望、

+0

パーティクルが何であるかわからない= particle.GetComponent ();ラインは何をすべきか?その時点で私は多くの「ヒント」を読んで人々がそれを機能させるために使用していたのですが、私はそれをすべてそこに投げ込まないのですが、そのラインはちょうど悪いと間違っていると考えました。時間をかけて私を助けてくれてありがとう。残念ながら、これは私のために働いていません。 EDIT- ifチェックIf if(generatedParticle == null)の場合に機能します。 ありがとうございます。 – Shrykar

+0

'if(someObject!= null)'ではなく 'if(someObject)'を呼び出すというこの古い悪い習慣が残っています。これはUnityがObjectクラスをオーバーライドする方法が原因です。しかし、私はこれを深く掘る必要があります:)それは助けてうれしい! – Kardux

関連する問題