Unity/C# - gameObject.name 返回不一致的名称

Unity / C# - gameObject.name returning inconsistent names

大家好,我正在学习 C#/Unity 并正在制作 space 入侵者类型的游戏,遇到了一个我不理解的问题。

我有一个 class 正在生成我的敌人(基于此 "Enemy Spawner" 中有多少位置游戏对象子项)。我不喜欢每一个旁边的名称(克隆),并希望在我开始构建 weapons/projectiles/collisions 等

时在我的日志中获得更多反馈

问题:打印 gameObject.name 时得到不一致的结果 -- 初始加载按预期打印(敌人 1、敌人 2、敌人 3 等)。我有一个射弹碰撞,将命中 dmg 发送给敌人,但这是出现不一致名称的地方——它显示那里的所有敌人都只是 "Enemy"。
tl;dr
印刷品有预期的 gameObject.name 在敌人生成器和激光中返回,但在我们收到 dmg 后不会在敌人控制器中返回。

敌方生成器:

public class EnemySpawner : MonoBehaviour {
    public GameObject enemyPrefab;

    // Use this for initialization
    void Start() {
        var i = 1;

        //spawn enemy prefab for each position inside Enemy Spawner
        foreach (Transform child in transform)
        {
            GameObject enemy = Instantiate(enemyPrefab, child.transform.position, Quaternion.identity) as GameObject;
            enemy.transform.parent = child;
            enemy.name = ("Enemy " + i);
            print (enemy.name);
            i++;
        }
    }

}


激光:

public class Laser : MonoBehaviour {
    public float laserDmg = 5f;
    public EnemyController enemyController;

    public void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.name.StartsWith("Enemy"))
        {
            enemyController.ReceiveDmg(laserDmg);
            Destroy(gameObject);
        }
        else
        {
            print("laser touched a " + collision.gameObject.name);
        }
    }
}


敌方控制者:

public class EnemyController : MonoBehaviour {
    public float enemyHP = 40f;
    public string myName;

    // Use this for initialization
    void Start () {
        myName = gameObject.name;
        print(myName);
        gameObject.name = myName;
    }
    public void ReceiveDmg (float amount)
    {
        print(gameObject.name + " Took " + amount + " DMG || Now has " + this.enemyHP + " Remaining" );
    }
}

编辑* 敌人控制器中的启动变量是我试图让 receiveDmg 函数使用这些变量打印正确的名称(在启动时正确打印)——我也尝试了很多其他的东西,我想我会问因为我可能只是在一些微不足道的事情上弄错了。

这很可能是因为激光中的 EnemyController 引用设置不正确。

它不能保证与 OnTriggerEnter2D 中的 collision.gameObject 相同的游戏对象,并可能指向预制件。

你得到同一个名字是正常的,你总是在这里调用附加在同一个对象上的同一个脚本

enemyController.ReceiveDmg(laserDmg);

你应该调用附加在它刚击中的游戏对象上的脚本

collision.gameObject.GetComponent<EnemyController>().ReceiveDmg(laserDmg);