识别选定的敌人预制件以玩死亡粒子系统

时间:2014-04-27 13:32:14

标签: c# unity3d game-engine

当敌人被杀时我试图发挥粒子效果,但它似乎是在随机选择的一个而不是被击中的那个上发挥。然而,被击中的敌人仍然消失,仍然为分数增加分数。

目前我有三个脚本可以执行此操作(所有内容都已缩短,因此我只显示相关代码):

一个附着在敌人身上的盒子,可以检测到他们是否与敌人的预制件相撞。

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

我知道这是一个很长的问题,但我已经坚持了一个多星期,所以任何帮助都会非常感激。谢谢:))

2 个答案:

答案 0 :(得分: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();

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

答案 1 :(得分:0)

我似乎找到了解决这个问题的方法。相反,我只是设置它来在敌人检测到它与射弹相撞时实例化粒子系统。然后我使用Coroutine在2秒后删除粒子系统。