2017-02-16 130 views
0

我有一个敌人预制装置(ZomBunny),它有两个局部系统,当敌人被击中和敌人死亡时,这个系统会被执行。我面对的问题是,我只能访问其中一个粒子系统(HitParticle)时使用下面的代码。如何获得粒子系统之一?

层次

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

你可以上传你的层次结构的图片,显示粒子的位置? – Programmer

+0

加入试过mrthod 1和2层次 –

回答

2

当你这样做:

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

团结会得到第一个ParticleSystem组件对孩子。你需要一种方法来区分你想要的。有很多方法可以做到这一点。

如果EnemyHealth脚本连接到ZomBunny游戏对象:

方法1

ZomBunny游戏物体,hitParticles是孩子。 Zombunny是小孩和deathParticles是小孩。

这应该是:

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

方法2

发现无论GameObjects然后从他们每个人得到的组件:

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

方法3

使用GetComponentsInChildren返回数组而不是GetComponentInChildren。该命令是不可预知的,因此我们还必须检查GameObject的名称以确保它是正确的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]; 
    } 
} 

你似乎是Unity的新手。在这种情况下,您最好了解许多选项。

+0

的照片更新,第一种方法为工作需要,而第二个方法,工作正常,但给人** MissingReferenceException:类型的对象“粒子系统”已被破坏,但你仍在努力访问它。 您的脚本应该要么检查它是否为空或不应该销毁的对象。**错误。 –

+0

可以” T告诉为什么会发生的事情。使用适合你的那个。 – Programmer

+0

非常感谢您的协助。 –