3

嗨,我正在制作我的第一个 2D 统一游戏,现在我有这个代码。我在数组箭头中有 3 个不同的游戏对象(称它们为 a、b、c),我想知道其中哪一个是生成的(所以我可以在另一个函数中使用它)并从场景中删除前一个。现在它只是每 5 秒在另一个游戏对象上生成一个游戏对象,我不知道是哪个游戏对象随机生成的。任何想法?

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;


    }
}`
4

2 回答 2

3

要跟踪您实例化的对象,您可以创建一个Listof 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,您可以将重复率传递给它,以及何时开始。有关 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);

于 2017-04-11T16:49:25.497 回答
-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 - 从未使用过它,但您需要重写函数以将箭头对象(不是延迟对象)返回给调用函数。当然,上面的代码应该被认为不工作,只是伪代码,因为我不使用统一。但要点只是找到一种更好的方法来在可以返回箭头的方法中生成箭头。

于 2017-04-11T16:21:22.647 回答