【问题标题】:C# Spawning random prefabs at random spawn pointsC# 在随机生成点生成随机预制件
【发布时间】:2018-03-10 22:29:01
【问题描述】:

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

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"));

             }
             }

         }

     }

}

【问题讨论】:

  • 是使用堆栈或队列而不是列表的更好方法。您可以简单地学习使用它。但你应该知道这些类型是不可序列化的,不会显示在检查器中。

标签: c# list loops unity3d


【解决方案1】:

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

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

我同意 High 的观点,即您应该切换到堆栈或队列,但无论您迭代什么,请确保您获得了您认为的信息。

【讨论】:

  • 你说我不删除对象,但是我的最后一行呢? DestroyObject (GameObject.FindGameObjectWithTag ("replace"));
  • 抱歉,我很马虎,错过了。不过,您仍然没有在每个循环中实例化它的新版本。如果您想使用该方法,您需要先实例化spawns,然后再尝试在场景中通过标签找到它。
  • 我明白了,虽然我不确定。你会如何编码?只是为了更清楚一点,生成点是场景中的固定对象,所以我不知道为什么要在运行时实例化它们。原因是这样我使它更简单并避免处理相交的对象等。所以我想要做的是在随机预定义的生成点处生成一个随机对象列表,每个对象只生成一次,并且一旦使用生成点,它不再使用。
  • 如果您的 spawnPoint 列表已经包含适当的游戏对象,那么只需更新 position,就像我在原始答案中所做的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 2015-07-19
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
相关资源
最近更新 更多