C#随机生成点

时间:2018-03-10 22:29:02

标签: c# list loops unity3d

好的我正在尝试做两件事:

1-产生预制件后,它不应再次产生

2-生成点用于预制后,不应再次使用(因此两个对象不会在同一位置生成)

一直试图用列表来做这件事。我遇到的问题是在while循环中删除列表中的正确项目,这似乎是有问题的。所有对象都在同一个生成点产生,我不知道为什么。

这是我的代码:

public List<GameObject> myList = new List<GameObject>();
 public List<GameObject> spawnPoint = new List<GameObject>();



 void Start () {


 Debug.Log ("Total objects to spawn now is " + myList.Count);



         if(myList.Count == 0){
             Debug.Log ("No Objects to spawn");
         } else {

             if(spawnPoint.Count ==0)
             {
                 Debug.Log ("No more spawn points");
             } else {

             while (myList.Count > 0) {

                 GameObject itemToSpawn = myList [Random.Range (0, myList.Count)];
                 GameObject spawns = spawnPoint [Random.Range (0, spawnPoint.Count)];
                 Vector3 position = GameObject.FindGameObjectWithTag ("replace").transform.position;
                 GameObject myItem = Instantiate (itemToSpawn, position, Quaternion.identity) as GameObject;
                 myList.Remove (itemToSpawn);
                 Debug.Log ("Total item now is " + myList.Count);
                 spawnPoint.Remove (spawns);
                 Debug.Log ("Total spawn points now is " + spawnPoint.Count);
                 DestroyObject (GameObject.FindGameObjectWithTag ("replace"));

             }
             }

         }

     }

}

1 个答案:

答案 0 :(得分:0)

潜在的问题是你没有使用列表中的不同生成点作为新myItem GameObject的输入转换。您继续使用标记为"replace"的游戏对象的位置,但循环中没有任何内容会改变游戏对象的位置。我假设该列表中的对象包含"replace"标记,但您实际上从未在场景中添加或删除任何对象,因此使用该标记找到的任何对象都将保持不变。您在spawnPoint列表中获取了对变量的引用,但在从列表中删除之前,您从未对其执行任何操作。您可能想要进行设置,以便您可以执行以下操作:

Vector3 position = spawns.GetComponent<Transform>().position;

我同意High的观点,你应该切换到Stack或Queue,但无论你迭代什么,都要确保你获得了你认为的信息。