嘿伙计们,所以我正在学习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函数使用这些变量打印正确的名称(在开始时正确打印) - 尝试了一堆其他的东西并且想我会问,因为我我可能只是对一些微不足道的事情犯了错误。
答案 0 :(得分:2)
这是正常的,你得到同一个名字,你总是在同一个对象上调用相同的脚本
enemyController.ReceiveDmg(laserDmg);
你应该调用刚刚点击的游戏对象上附带的脚本
collision.gameObject.GetComponent<EnemyController>().ReceiveDmg(laserDmg);
答案 1 :(得分:0)
这很可能是因为没有正确设置Laser中的EnemyController引用。
不能保证与OnTriggerEnter2D中的collision.gameObject相同的GameObject与给定的代码并且可能指向预制件。