嗨,我正在制作我的第一个2D游戏,我现在有了这个代码。我在数组箭头中有3个不同的GameObjects(称为a,b,c),我想知道它们中的哪一个被生成(所以我可以在另一个函数中使用它)并从场景中删除前一个。现在它只是每隔5秒在另一个游戏对象上生成一个GameObject,我不知道它们中的哪一个随机产生了它。有什么想法吗?
{{1}}
答案 0 :(得分:3)
要跟踪您实例化的对象,可以创建List
GameObject
,然后在实例化对象时,可以将其添加到List
中。然后,您可以使用该列表中的任何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);
答案 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 - 从未使用它,但您需要重写函数以将箭头对象(不是延迟对象)返回给调用函数。当然上面的代码应该被视为不工作,只是伪代码,因为我不使用统一。但要点是找到一种更好的方法来生成一个可以返回它的方法中的箭头。