【问题标题】:Identify a selected enemy prefab to play death particle system识别选定的敌人预制件以播放死亡粒子系统
【发布时间】:2014-04-27 13:32:13
【问题描述】:

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

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

一个附加在向敌人投掷的盒子上的盒子,可以检测它们是否与敌人的预制件发生碰撞。

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

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

【问题讨论】:

  • 长问题。完全不清楚你在问什么。
  • 只是简化了它,希望它会更有意义。

标签: c# unity3d game-engine


【解决方案1】:

我不确定EnemyExplosion 是什么类型的对象,但您的问题似乎是搜索该对象。在OnCollisionEnter 期间,您确切地知道碰撞发生在哪些对象之间。但现在您开始搜索名为EnemyExplosionany 对象。这就是你的粒子出现随机的原因。

更新:

好的,你的结构是这样的

EnemyContainer
  - EnemyExplosion
    - Particle System
  - EnemyModel
    - Collider

如果EnemyModel 包含对撞机,您可以通过以下方式到达EnemyExplosion,最后到达enemyDeath

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

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

【讨论】:

  • EnemyExplosion 是一个附有粒子系统的空游戏对象。敌人预制件设置在一个空游戏对象的位置,该对象充当名为 EnemyContainer 的文件夹,其中包含敌人模型和粒子系统。
  • @bconway99 我更新了我的答案。即使它不能 100% 匹配你的结构,你也应该知道如何解决它。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 2019-11-29
    相关资源
    最近更新 更多