2017-02-16 2 views
0

J'ai un préfabriqué ennemi (ZomBunny) dans lequel ils sont deux systèmes partiels qui doivent être joués quand l'ennemi est touché et quand l'ennemi meurt. Le problème auquel je suis confronté est, je ne peux accéder qu'à un système de particules (HitParticle) lorsque vous utilisez le code ci-dessous.Comment obtenir l'un des systèmes de particules?

Hiérarchie

enter image description here

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

Pouvez-vous télécharger une image de votre hiérarchie qui montre où sont les particules? – Programmer

+0

Mis à jour en ajoutant la photo de la hiérarchie –

Répondre

2

Lorsque vous faites:

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

unité obtiendra le premier ParticleSystem composant sur l'enfant. Vous avez besoin d'un moyen de distinguer celui que vous voulez. Il y a plusieurs façons de le faire.

Si le script EnemyHealth est attaché à la ZomBunny gameobject:

Méthode 1:

Sous la ZomBunny gameobject, hitParticles est enfant . Zombunny est enfant et deathParticles est enfant .

Ce devrait être:

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

Méthode 2:

Trouver les GameObjects puis obtenir les composants de chacun d'eux:

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

Méthode 3:

Utilisez GetComponentsInChildren qui renvoie tableau au lieu de GetComponentInChildren. L'ordre est imprévisible, nous devons donc vérifier le nom du GameObject pour être sûr que c'est le bon 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]; 
    } 
} 

Vous semblez être de nouveau à l'unité. Il est préférable de connaître beaucoup d'options que vous avez dans ce cas.

+0

Essayé mrthod 1 et 2, la première méthode a fonctionné comme souhaité, tandis que la 2ème méthode fonctionne bien mais donne ** MissingReferenceException: L'objet de type 'ParticleSystem' a été détruit mais vous essayez toujours de y accéder. Votre script doit soit vérifier si elle est nulle, soit ne pas détruire l'objet. ** error. –

+0

Ne peut pas dire pourquoi cela se produit. Utilisez celui qui fonctionne pour vous. – Programmer

+0

Merci beaucoup pour votre aide. –