以编程方式初始化时破坏粒子系统

时间:2018-05-29 09:04:03

标签: c# unity3d

我与玩家和敌人玩游戏。

我还有一个粒子系统,用于播放器何时死亡,如爆炸。 我已经将这个粒子系统制作成预制件,因此每个级别可以多次使用它,因为有人可能会死很多。

所以在我的敌人的脚本中,附着在我的敌人身上,我有:

public GameObject deathParticle;

private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.name == "Player" && !player.dead){
            player.dead = true;
            Instantiate(deathParticle, player.transform.position, player.transform.rotation);
            player.animator.SetTrigger("Death");
        }
    }

因此当玩家被敌人杀死时,这将扮演我的粒子系统。现在在我的播放器脚本上,我有这个。这个特定的功能在死亡动画之后播放:

public void RespawnPlayer()
{
    Rigidbody2D playerBody = GetComponent<Rigidbody2D>();
    playerBody.transform.position = spawnLocation.transform.position;
    dead = false;
    animator.Play("Idle");

    Enemy enemy = FindObjectOfType<Enemy>();
    Destroy(enemy.deathParticle);
}

这会像正常一样重新生成玩家,但在我的项目中,每次我死的时候都会有一个我不想要的死亡(克隆)对象。最后两行是为了删除它,但它没有。

我也试过这个没有用的东西:

Enemy enemy = FindObjectOfType<Enemy>();
ParticleSystem deathParticles = enemy.GetComponent<ParticleSystem>();
Destroy(deathParticles);

2 个答案:

答案 0 :(得分:2)

没有必要InstantiateDestroy死亡粒子,这将产生大量开销,你可以简单地重播它,当你想要它开始和停止它,当你不需要它

 ParticleSystem deathParticleSystem;

    private void OnTriggerEnter2D(Collider2D collision)
        {
            #rest of the code
            deathParticleSystem.time = 0;
            deathParticleSystem.Play();

        }
    public void RespawnPlayer()
    {
        //rest of the code
        deathParticleSystem.Stop(true, ParticleSystemStopBehavior.StopEmittingAndClear);
    }

或者您可以enabledisable与您的粒子预制相关联的gameObject

  public GameObject deathParticlePrefab;

        private void OnTriggerEnter2D(Collider2D collision)
            {
                #rest of the code
                deathParticlePrefab.SetActive(true);

            }
        public void RespawnPlayer()
        {
            //rest of the code
            deathParticlePrefab.SetActive(false);
        }

答案 1 :(得分:1)

您可以随时创建一个新脚本并将其分配给预制件,该预制件会在一段时间后销毁它:

using UnityEngine;
using System.Collections;

public class destroyOverTime : MonoBehaviour {

   public float lifeTime;

   // Use this for initialization
   void Start () {

   }

   // Update is called once per frame
   void Update () {
       lifeTime -= Time.deltaTime;

       if(lifeTime <= 0f)
       {
           Destroy(gameObject);
       }
   }
}

因此,在这种情况下,您可以将此分配给您的deathParticle。如果您要实例化对象,那么此脚本在很多场景中都很有用,这样您就不会有大量不必要的对象。