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

时间:2017-04-12 20:58:36

标签: c# unity3d unity5

嘿伙计们,所以我正在学习C#/ Unity,我正在制作一个太空入侵者类型的游戏,并且遇到了一个我不理解的问题。

我有一个产生我的敌人的课程(根据有多少位置的游戏对象孩子在这个“Enemy Spawner”中)。我不喜欢每个旁边的名字(克隆),并希望在我的日志中获得更多反馈,因为我开始制造武器/射弹/碰撞等。

问题:我在打印gameObject.name时得到不一致的结果 - 初始加载按预期打印(Enemy 1,Enemy 2,Enemy 3等)。我有一个射击碰撞,它将命中dmg发送给敌人,但这就是不一致的名字出现的地方 - 它显示那里的所有敌人都只是“敌人”。
TL;博士
Prints在Enemy Spawner和Laser中返回了预期的gameObject.name,但在我们收到dmg之后没有返回Enemy Controller。

Enemy Spawner:

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函数使用这些变量打印正确的名称(在开始时正确打印) - 尝试了一堆其他的东西并且想我会问,因为我我可能只是对一些微不足道的事情犯了错误。

2 个答案:

答案 0 :(得分:2)

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

enemyController.ReceiveDmg(laserDmg);

你应该调用刚刚点击的游戏对象上附带的脚本

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

答案 1 :(得分:0)

这很可能是因为没有正确设置Laser中的EnemyController引用。

不能保证与OnTriggerEnter2D中的collision.gameObject相同的GameObject与给定的代码并且可能指向预制件。