仅在场景开始时在几个随机位置生成多个随机对象

Spawning several random objects in several random positions only when a scene begins

我只想在场景开始时在几个随机位置生成几个随机对象。我该怎么做?这是我的代码,但只出现了一个对象。

using UnityEngine;
using System.Collections;

public class SpawnItems : MonoBehaviour
{
    public Transform[] SpawnPoints;
    public GameObject[] Objetos;

    void Start () 
    {
        int spawnindex = Random.Range (0, SpawnPoints.Length);
        int objectindex = Random.Range (0, Objetos.Length);

        Instantiate (Objetos [objectindex], SpawnPoints [spawnindex].position, SpawnPoints [spawnindex].rotation);
    }

}

我相信这是因为您在 Start() 函数中调用了 spawnindex

这意味着您的 spawnindex 将始终与 Start() 函数相同的数字,或多或少只会在您点击播放模式时发生一次。

这也意味着 objectIndex具有相同的编号,所以它总是会生成相同的对象。

这意味着您所有生成的对象都使用相同的编号生成。如果您查看层次结构,您的 GameObjects 可能都在相同的位置和相同的对象中。

您需要找到一种方法来为每个 GameObject 生成不同的数字。 :-)

编辑:

此代码来自 Unity 网站的其中一个教程。它以设定的时间速率生成对象。您可以这样做,但将生成时间率设置为非常小的数字,这样您所有的 GameObject 就会看起来是同时生成的。

void Start ()
    {
        // Call the Spawn function after a delay of the spawnTime and then continue to call after the same amount of time.
        InvokeRepeating ("Spawn", spawnTime, spawnTime);
    }


    void Spawn ()
    {
        // If the player has no health left...
        if(playerHealth.currentHealth <= 0f)
        {
            // ... exit the function.
            return;
        }

        // Find a random index between zero and one less than the number of spawn points.
        int spawnPointIndex = Random.Range (0, spawnPoints.Length);

        // Create an instance of the enemy prefab at the randomly selected spawn point's position and rotation.
        Instantiate (enemy, spawnPoints[spawnPointIndex].position, spawnPoints[spawnPointIndex].rotation);
    }

你可以只用循环

    Start()
    {
         int numberOfObjectsToSpawn = 10;
         int spawnindex;
         int objectindex

         for(int i = 0; i < numberOfObjectsToSpawn; i++){

         spawnindex = Random.Range (0, SpawnPoints.Length);
         objectindex = Random.Range (0, Objetos.Length);


         Instantiate (Objetos [objectindex], SpawnPoints [spawnindex].position, SpawnPoints [spawnindex].rotation);

         }
    }

希望我答对了你的问题。

我制作了一个函数来为我正在开发的游戏执行此操作。

public List<GameObject> spawnPositions;
public List<GameObject> spawnObjects;   

void Start()
{
    SpawnObjects();
}

void SpawnObjects()
{
    foreach(GameObject spawnPosition in spawnPositions)
    {
        int selection = Random.Range(0, spawnObjects.Count);
        Instantiate(spawnObjects[selection], spawnPosition.transform.position, spawnPosition.transform.rotation);
    }
}

它的工作方式是将您的不同位置放在一个列表中,并将您想要生成的所有不同对象预制件放在一个单独的列表中,然后循环在每个不同位置生成一个随机对象。

记得放:

using System.Collections.Generic;

最上面的class为了使用Lists。您也可以为此使用数组,但我个人更喜欢列表。

并且每个对象只调用一次 Start() 函数,因此每次加载场景时这段代码只会 运行 一次。