2017-08-02 49 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

粒子可以實例化併發揮作用,但這顯然會留下開銷和粒子,當它們不需要時,它們在層次結構中處於活動狀態。 我想實例化粒子系統一次。然後能夠播放()它和停止()需要時播放。問題和障礙在於,無論我改變了什麼,或者嘗試使用代碼,我都無法實現它。我已閱讀手冊並且無法使ParticleSystem中的Play()函數按預期運行。 – Shrykar

回答

2

首先,不知道什麼particle = particle.GetComponent<ParticleSystem>();線該怎麼辦? particle變量是ParticleSystem提供給您的EmitFX()方法,因此無需爲此調用。我的猜測是你的腳本中有一些引用問題(一些變量指向你的預製,然後你實例化的將覆蓋這個引用,...),所以我給你寫了一個「更乾淨」的代碼版本(通過合併你的兩個腳本):

#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(generatedParticle == null)。 非常感謝。 – Shrykar

+0

我的壞對它仍然有調用'if(someObject)'而不是'if(someObject!= null)'這個老習慣':這是由Unity覆蓋Object類的方式引起的。不過,我應該更深入地挖掘它:)很高興它有幫助! – Kardux