2017-04-11 60 views
2

嗨我正在2D中制作我的第一个统一游戏,现在我已经有了这个代码。我在数组箭头中有3个不同的GameObjects(称它们为a,b,c),我想知道它们中的哪一个产生了(所以我可以在另一个函数中使用它),并从场景中删除前一个。现在它每隔5秒就会产生一个GameObject,我不知道它们中的哪一个会随机产生。任何想法?Unity中的随机产卵(C#)

public GameObject[] arrows; 
public float interval = 5; 

// Use this for initialization 
void Start() 
{ 
    StartCoroutine(SpawnArrow()); 
} 
public IEnumerator SpawnArrow() 
{ 
    WaitForSeconds delay = new WaitForSeconds(interval); 
    while (true) 
    { 
     GameObject prefab = arrows[UnityEngine.Random.Range(0, arrows.Length)]; 
     GameObject clone = Instantiate(prefab, new Vector3(0.02F, 2.18F, -1), Quaternion.identity); 
     yield return delay; 


    } 
}` 
+0

您只需使用您创建的对象作为参数。你在while循环中放入一个 'YourOtherFunction(clone)'。如果这不是你正在寻找的东西,你需要提供更多关于你想要做的事情的信息。在您的代码示例中也包含其他功能。 –

+0

另外,如果你问的是关于Unity的问题,你需要在你的问题上加上[tag:Unity3d]标签。否则,你可能会得到不适合在Unity上使用的答案。 –

回答

2

要跟踪的对象是什么,你实例化时,你实例化一个对象,你可以在List加它,你可以创建GameObjectList然后。然后,您可以使用该列表中的任何GameObject来执行您所需的任何操作。

public GameObject[] arrows; 
public float interval = 5; 
private List<GameObject> myObjects = new List<GameObject>(); 

// Use this for initialization 
void Start() 
{ 
    StartCoroutine(SpawnArrow()); 
} 
public IEnumerator SpawnArrow() 
{ 
    WaitForSeconds delay = new WaitForSeconds(interval); 
    while (true) 
    { 
     GameObject prefab = arrows[UnityEngine.Random.Range(0, arrows.Length)]; 
     GameObject clone = Instantiate(prefab, new Vector3(0.02F, 2.18F, -1), Quaternion.identity); 

     //Add the object to the list 
     myObjects.Add(clone); 

     yield return delay; 


    } 
} 

而且像,这将是更好地使用InvokeRepeating产卵的对象,你可以通过它的重复率,当你希望它开始。 More information on InvokeRepeating

这是怎么可能看起来像InvokeRepeating

public GameObject[] arrows; 
public float interval = 5; 
private List<GameObject> myObjects = new List<GameObject>(); 

// Use this for initialization 
void Start() 
{ 
    InvokeRepeating("SpawnArrow", 0f, interval); 
} 

void SpawnArrow() 
{ 
    //Check if there's something in the list 
    if (myObjects.Count > 0) 
    { 
     //Destroy the last object in the list. 
     Destroy(myObjects.Last()); 

     //Remove it from the list. 
     myObjects.RemoveAt(myObjects.Count - 1); 
    } 

    GameObject prefab = arrows[UnityEngine.Random.Range(0, arrows.Length)]; 
    GameObject clone = Instantiate(prefab, new Vector3(0.02F, 2.18F, -1), Quaternion.identity); 

    //Add the object to the list 
    myObjects.Add(clone); 

} 

您可以通过执行Destroy(myObjects.Last());将返回的最后一个对象在列表中,并摧毁它摧毁最后催生对象在列表中。然后您应该从列表中删除它myObjects.RemoveAt(myObjects.Count - 1);

+0

谢谢。我如何知道哪个对象最后产生了(我想用它:如果对象产生了然后...),我怎么知道哪个对象在它之前产生,所以我可以从场景中摧毁它?(我现在使用这个InvokeRepeating代码):D –

+0

@KlemenŠkrlj我在答案的最后添加了如何做到这一点。 – CNuts

+0

而在代码中,我把这两行? (我知道..我是一个noob)它说我必须添加System.Linq,当我运行它时,我说:InvalidOperationException:由于对象的当前状态,操作无效System.Linq.Enumerable.Last [ GameObject](IEnumerable'1来源) –

-2

我不知道有多少,这将有所帮助,但你试图使每一个人的箭头对象,然后回到刚才那个对象,以你需要它的方法。

public GameObject SpawnArrow(<some params>){ 
    GameObject prefab = arrows[UnityEngine.Random.Range(0, arrows.Length)]; 
    while(interval > 0){ 
     if(interval = 0){ 
      prefab = arrows[UnityEngine.Random.Range(0, arrows.Length)]; 
      GameObject clone = Instantiate(prefab, new Vector3(0.02F, 2.18F, -1), Quaternion.identity); 
     } else { 
      System.Threading.Thread.sleep(1000) // wait for the second. 
      interval = interval - 1; 
     } 
    } 
    return prefab; 
} 

IDK Unity - 从未使用过它,但需要重写函数以将箭头对象(不是延迟对象)返回给调用函数。当然,上面的代码应该被认为不工作,只是伪代码,因为我不使用统一。但是要点是找到一种更好的方法来产生一个可以返回它的方法。

+0

这不是它在Unity中的工作方式,'Instantiate'会在当前场景中产生一个'GameObject'。什么'产量回报延迟;'是等待指定的时间量继续之前。 – CNuts

+0

我再次编辑 - 但我不知道统一,只是C#我在编辑中解释这一点。 –

+1

永远永远不会从Unity项目中调用'System.Threading.Thread.Sleep'。 –