Уничтожить систему частиц при инициализации программно - PullRequest
0 голосов
/ 29 мая 2018

У меня есть игра с игроком и противником.

У меня также есть система частиц для случая, когда игрок умирает, как взрыв.Я сделал эту систему частиц заранее готовой, чтобы я мог использовать ее несколько раз за уровень, так как кто-то может много умереть.

Итак, в моем скрипте врага.cs, прикрепленном к моему врагу, у меня есть:

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);
}

Это вызывает нового игрока, как обычно, но в моем проекте каждый раз, когда я умираю, у меня есть объект смерти (клон), который я не хочу.Последние 2 строки предназначены для удаления этого, но это не так.

Я также пробовал это, но это не сработало:

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

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Нет необходимости Instantiate и Destroy смертельной частицы, которая создаст много накладных расходов, вы можете просто воспроизвести ее, когда захотите, чтобы запустить и остановить, когда она вам не нужна

 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);
    }

или вы можете enable и disable 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);
        }
0 голосов
/ 29 мая 2018

Вы всегда можете создать новый скрипт и назначить его префабу, который уничтожит его через определенное время:

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.Этот скрипт полезен во множестве сценариев, если вы создаете экземпляры объектов, чтобы у вас не было нагрузки ненужных объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...