我正在Unity 5制作2D游戏,其中玩家有一把枪对玩家来说是孩子,当玩家被击中时我怎么能摧毁枪?我正在使用的当前代码会破坏播放器但不会破坏枪支。
public float health=500f;
public GameObject gun;
void OnTriggerEnter2D(Collider2D collider){
BulletScript bullet = collider.gameObject.GetComponent<BulletScript> ();
if (bullet) {
health -= bullet.getdamage ();
bullet.hit ();
Handheld.Vibrate();
if (health <= 0) {
GetComponent<Animator> ().SetBool ("deadBool", true);
GetComponent<Animator> ().SetTrigger ("deadTrigger");
ExecuteAfterTime (1f);
Destroy (gun);
}
}
}
IEnumerator ExecuteAfterTime(float time){
yield return new WaitForSeconds (time);
Destroy (gameObject);
GameObject child = gameObject.GetComponentInChildren<> (gameObject);
}
注意:枪是应用脚本的玩家的孩子。
答案 0 :(得分:0)
假设你想要摧毁每个孩子,你首先可以通过以下方式检索所有孩子:
allChildren = gameObject.getComponentsInChildren()
这会产生一个数组,所以在你可以简单地用一个循环遍历它们之后:
for (int a = 0; a < allChildren.length; aa ++)
{
Destroy(allChildren[a].gameObject);
}
如果枪是你想要在该循环内销毁的唯一孩子,你可以查询有关该物体的细节,并在找到枪时调用Destroy,如:
if(allChildren[a].name == "gun")
{
Destroy(allChildren[a].gameObject)
}
答案 1 :(得分:0)
如果你想只销毁枪支,那么我会说在你的剧本中保留你的枪的参考:
public GameObject gun;
从检查员处分配枪支。然后在这样击中时摧毁它:
Destroy(gun);
如果玩家有多个孩子。然后你可以创建一个这样的数组:
public GameObject[] destroyables;
从检查员分配并保存预制件。然后在击中时使用循环来销毁。
for(int i=0;i<destroyables.Length;i++) Destroy(destroyables[i]);
答案 2 :(得分:0)
当你破坏父游戏对象时,所有的孩子都会自动销毁。但是你试图手动销毁它们。 你有延迟,因为你在协程中调用Destory(gameObject)。尝试将Destroy(枪)移动到协程。
public float health=500f;
public GameObject gun;
void OnTriggerEnter2D(Collider2D collider){
BulletScript bullet = collider.gameObject.GetComponent<BulletScript> ();
if (bullet) {
health -= bullet.getdamage ();
bullet.hit ();
Handheld.Vibrate();
if (health <= 0) {
GetComponent<Animator> ().SetBool ("deadBool", true);
GetComponent<Animator> ().SetTrigger ("deadTrigger");
StartCoroutine(ExecuteAfterTime (1f));
}
}
}
IEnumerator ExecuteAfterTime(float time){
yield return new WaitForSeconds (time);
//destroying gun only
Destroy (gun);
//manually destroying all of childre
GameObject child = gameObject.GetComponentInChildren<> (gameObject);
foreach(var entry in child )
{
Destroy(entry);
}
Destroy (gameObject);
}