How to get one of the particle system?

妖精的绣舞 提交于 2019-12-11 08:46:13

问题


I have an enemy prefab(ZomBunny) in it their are two partial systems which are to be played when the enemy is hit and when the enemy die.The problem i am facing is ,i can only access only one of the particle system(HitParticle) when using the down below code.

Hierarchy

EnemyHealth

public class EnemyHealth : MonoBehaviour
{
    public int startingHealth = 100;          // The amount of health the enemy starts the game with.
    public int currentHealth;                    // The current health the enemy has.
    public float sinkSpeed = 2.5f;           // The speed at which the enemy sinks through the floor when dead.
    public int scoreValue = 10;               // The amount added to the player's score when the enemy dies.
    public AudioClip deathClip;              // The sound to play when the enemy dies.
    public GameObject text;

    Animator anim;                              // Reference to the animator.
    AudioSource enemyAudio;              // Reference to the audio source.
    ParticleSystem hitParticles;             // Reference to the particle system that plays when the enemy is damaged.
    ParticleSystem deathParticles;
    CapsuleCollider capsuleCollider;     // Reference to the capsule collider.
    bool isDead;                                  // Whether the enemy is dead.
    bool isSinking;                               // Whether the enemy has started sinking through the floor.

    void Awake ()
    {
        // Setting up the references.
        anim = GetComponent <Animator> ();
        enemyAudio = GetComponent <AudioSource> ();
        hitParticles = GetComponentInChildren <ParticleSystem> ();
        deathParticles = GetComponentInChildren <ParticleSystem> ();
        capsuleCollider = GetComponent <CapsuleCollider> ();

        // Setting the current health when the enemy first spawns.
        currentHealth = startingHealth;
    }

    void Update ()
    {
        // If the enemy should be sinking...
        if(isSinking)
        {
            // ... move the enemy down by the sinkSpeed per second.
            transform.Translate (-Vector3.up * sinkSpeed * Time.deltaTime);
        }
    }

    public void TakeDamage (int amount, Vector3 hitPoint)
    {
        // If the enemy is dead...
        if(isDead)
            // ... no need to take damage so exit the function.
            return;

        // Play the hurt sound effect.
        enemyAudio.Play ();

        // Reduce the current health by the amount of damage sustained.
        currentHealth -= amount;

        // Set the position of the particle system to where the hit was sustained.
        hitParticles.transform.position = hitPoint;

        // And play the particles.
        hitParticles.Play();

        // If the current health is less than or equal to zero...
        if(currentHealth <= 0)
        {
            // ... the enemy is dead.
            Death ();
        }
    }

    void Death ()
    {
        // The enemy is dead.
        isDead = true;

        // Turn the collider into a trigger so shots can pass through it.
        capsuleCollider.isTrigger = true;

        // Tell the animator that the enemy is dead.
        anim.SetTrigger ("Dead");

        deathParticles.Play();
        // Change the audio clip of the audio source to the death clip and play it (this will stop the hurt clip playing).
        enemyAudio.clip = deathClip;
        enemyAudio.Play ();
    }

    public void StartSinking ()
    {

        // Find and disable the Nav Mesh Agent.
        GetComponent <UnityEngine.AI.NavMeshAgent> ().enabled = false;

        // Find the rigidbody component and make it kinematic (since we use Translate to sink the enemy).
        GetComponent <Rigidbody> ().isKinematic = true;

        // The enemy should no sink.
        isSinking = true;

        // Increase the score by the enemy's score value.
        ScoreManager.score += scoreValue;

        // After 2 seconds destory the enemy.
        Destroy (gameObject, 2f);
    }
}

回答1:


When you do:

hitParticles = GetComponentInChildren<ParticleSystem>();
deathParticles = GetComponentInChildren<ParticleSystem>();

Unity will get the first ParticleSystem component on the child. You need a way to distinguish which one you want. There are many ways to do this.

If the EnemyHealth script is attached to the ZomBunny GameObject:

Method 1:

Under the ZomBunny GameObject, hitParticles is child 0. Zombunny is child 1 and deathParticles is child 2.

That should be:

hitParticles = transform.GetChild(0).GetComponentInChildren<ParticleSystem>();
deathParticles = transform.GetChild(2).GetComponentInChildren<ParticleSystem>();

Method 2:

Find both GameObjects then get the components from each of them:

hitParticles = GameObject.Find("HitParticles").GetComponent<ParticleSystem>();
deathParticles = GameObject.Find("DeathParticles").GetComponent<ParticleSystem>();

Method 3:

Use GetComponentsInChildren which returns array instead of GetComponentInChildren. The order is unpredictable so we must also check the name of the GameObject to make sure that it is the correct ParticleSystem.

ParticleSystem[] ps = GetComponentsInChildren<ParticleSystem>();
for (int i = 0; i < ps.Length; i++)
{
    if (ps[i].gameObject.name == "HitParticles")
    {
        hitParticles = ps[i];
    }
    else if (ps[i].gameObject.name == "DeathParticles")
    {
        deathParticles = ps[i];
    }
}

You seem to be new to Unity. It's better to know many options you have in this case.



来源:https://stackoverflow.com/questions/42265669/how-to-get-one-of-the-particle-system

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!