2014-04-27 22 views
-3

我试图在敌人死亡时发挥粒子效应,但它似乎在随机选择的一个而不是被击中的那个上发挥作用。然而,被击中的敌人仍然消失,仍然为得分加分。确定一个选定的敌人预制玩死亡粒子系统

目前我有三个脚本来执行这一点(所有已经缩短,所以我只显示相关的代码):

其中一个连接到在敌人投掷箱检测,如果他们与敌人的预制件相撞。

void OnCollisionEnter (Collision theCollision) { 

     if (canProjectileKill == true) { 
      // If the projectile hits any game object with the tag "Enemy" or "EnemyContainer". 
      if (theCollision.gameObject.tag == "Enemy") { 
       GameObject.Find("EnemyExplosion").GetComponent<enemyDeath>().ProjectileHasHitEnemy(); 
       // Destroy the projectile itself. 
       Destroy (gameObject); 
       // Destroy the game object that the projectile has collided with (E.g. the enemy). 
       Destroy (theCollision.gameObject); 
       GameObject.Find("Manager").GetComponent<projectileSpawner>().deleteProjectile(); 
      } 
     } 
    } 

另一个附加到敌人预制件,检测他们是否被一个盒子击中。

void OnCollisionEnter (Collision theCollision) { 
     if(theCollision.gameObject.tag == "Projectile") { 
      GameObject.Find("EnemyExplosion").GetComponent<enemyDeath>().EnemyHasBeenHit(); 
     } 
    } 

我然后运行一个if语句,询问如果两个箱子一直打到敌人的预制,如果敌人预制已经在试图确定,而不是所有的人都一个预制受到了冲击箱。但是,这仍然行不通。

public bool HasProjectileHitEnemy; 
    public bool HasEnemyBeenHitByProjectile; 

    void Start() { 
     gameObject.particleSystem.Stop(); 
     HasProjectileHitEnemy = false; 
     HasEnemyBeenHitByProjectile = false; 
    } 

    public void ProjectileHasHitEnemy() { 
     // From projectile. 
     HasProjectileHitEnemy = true; 
    } 

    public void EnemyHasBeenHit() { 
     // From enemy. 
     HasEnemyBeenHitByProjectile = true; 
     PlayParticleSystem(); 
    } 

    public void PlayParticleSystem() { 
     if (HasEnemyBeenHitByProjectile == true && HasProjectileHitEnemy == true) { 
      gameObject.particleSystem.Play(); 
      HasProjectileHitEnemy = false; 
      HasEnemyBeenHitByProjectile = false; 
     } 
    } 
} 

我知道这是一个长期的问题,但我一直停留在这一个多星期,所以任何帮助,将不胜感激。谢谢:)

+0

很长的问题。完全不清楚你在问什么。 –

+0

只是简化它,所以希望它会更有意义。 – bconway99

回答

0

我不确定什么样的对象EnemyExplosion是,但你的问题似乎是搜索这个对象。在OnCollisionEnter期间,您完全知道碰撞发生在哪些对象之间。但是现在您开始搜索任何对象,该对象被称为EnemyExplosion。这就是你的粒子随机出现的原因。

更新:

好了,你的结构类似的东西

EnemyContainer 
    - EnemyExplosion 
    - Particle System 
    - EnemyModel 
    - Collider 

如果EnemyModel包含对撞机,你可以得到EnemyExplosion最后enemyDeath下面的方式。

var explosion = theCollision.transform.parent.gameObject.GetComponent<EnemyExplosion>(); 
explosion.GetComponent<enemyDeath>().ProjectileHasHitEnemy(); 

既然您正在访问正确的对象,您可以删除一些双重检查并依赖一个对撞机事件。

+0

EnemyExplosion是一个空的游戏物体,附有粒子系统。敌方预制装置设置在有空的游戏对象的地方,该对象充当名为EnemyContainer的文件夹,其中包含敌方模型和粒子系统。 – bconway99

+0

@ bconway99我更新了我的答案。即使它不符合你的结构100%,你应该知道如何解决它。 –

0

我似乎找到了解决办法。相反,我只是设置它来实例化粒子系统,只要敌人检测到它已经与弹丸相撞。然后我使用协程在2秒后删除粒子系统。