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