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

时间:2016-06-16 08:43:19

标签: unity3d unityscript

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

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

}

3 个答案:

答案 0 :(得分:1)

您只需使用循环

即可
    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);

         }
    }

希望我能回答你的问题。

答案 1 :(得分:0)

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

这意味着您的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);
    }

答案 2 :(得分:0)

我为我正在制作的游戏做了一个功能来完成这个。

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;

在课程顶部以便使用列表。您也可以使用Arrays,但我个人更喜欢列表。

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