首页 > 解决方案 > 从对撞机访问游戏对象属性

问题描述

所以我有导弹。当它击中目标时,导弹会爆炸。
爆炸有一个半径,里面可能有很多敌人。
敌人有一个“脚本/公共变量”爆炸预制。
我在 MissileMove 类中找到所有使用对撞机的敌人:

Collider[] colliders = Physics.OverlapSphere( transform.position, explosionRadius );
    foreach (Collider coli in colliders)
        if (coli.tag == "Enemy")
            Damage( coli.gameObject);

如何通过变换访问敌人的爆炸预制件?

编辑 - 阅读后...

我的问题是explosionPrefab(enemyMove 类)被定义为一个Transform。它现在是一个游戏对象。它有效:)

但是,实例化爆炸会引发“invalidCastException”并退出函数。爆炸运行(!),但功能的其余部分被跳过 - 敌人幸存下来!

但是,如果我将相同的爆炸预制件“附加”到本地脚本(MissileMove),并改为使用它,它会正常运行(不抛出异常) - 有什么区别?

void Damage( GameObject enemy )
{
    GameObject exp = enemy.GetComponent<EnemyMove>().explosionPrefab;

    Debug.Log("Start EnemyExplosion");

    // Below throws exception, runs, then quits function
    GameObject explosion = Instantiate( exp, enemy.transform.position, enemy.transform.rotation);

    // Below runs perfectly
    GameObject explosion = Instantiate( enemyExplosion, enemy.transform.position, enemy.transform.rotation);

    Destroy(explosion, 2f);

    Debug.Log("EnemyExplosion startet");

    Destroy(enemy);
}

例外:

InvalidCastException:指定的强制转换无效。
(wrapper castclass) System.Object.__castclass_with_cache(object,intptr,intptr)
UnityEngine.Object.Instantiate[T] (T original, UnityEngine.Vector3 位置, UnityEngine.Quaternion 旋转) (在
C:/buildslave/unity/build/Runtime /Export/Scripting/UnityEngineObject.bindings.cs:276)
BulletMove.Damage (UnityEngine.GameObject 敌人) (在 Assets/Scripts/BulletMove.cs:60)
BulletMove.HitTarget () (在 Assets/Scripts/BulletMove.cs:49 )
BulletMove.Update () (在 Assets/Scripts/BulletMove.cs:26)

标签: unity3dtransformgameobject

解决方案


你可以在你的敌人中使用GetComponentInChildren或使用,然后从那个类中获得相应的爆炸。GetComponentPhysics.OverlapSphere


推荐阅读