(Unity)生成随机预制件,其中没有一个是相同的

问题描述 投票:0回答:2

我想生成随机预制件,但我不想让它们中的任何一个巧合地相同。我目前有这个代码块:

int animalIndex = Random.Range(0, 8);
         int animalIndex2 = Random.Range(0, 8);
         int animalIndex3= Random.Range(0, 8);
         int animalIndex4 = Random.Range(0, 8);
         int animalIndex5 = Random.Range(0, 8);
         int animalIndex6 = Random.Range(0, 8);

         // spawn first card
         GameObject breeder1 = Instantiate(breedingPhase.randomPrefabs[animalIndex], new Vector3(-4.5f, 3.2f, 0), Quaternion.identity);
         // spawn second card
         GameObject breeder2 = Instantiate(breedingPhase.randomPrefabs[animalIndex2], new Vector3(0, 3.2f, 0), Quaternion.identity);
         // spawn third card
         GameObject breeder3 = Instantiate(breedingPhase.randomPrefabs[animalIndex3], new Vector3(4.5f, 3.2f, 0), Quaternion.identity);
         // spawn fourth card
         GameObject breeder4 = Instantiate(breedingPhase.randomPrefabs[animalIndex4], new Vector3(-4.5f, -2, 0), Quaternion.identity);
         // spawn fifth card
         GameObject breeder5 = Instantiate(breedingPhase.randomPrefabs[animalIndex5], new Vector3(0, -2, 0), Quaternion.identity);
         // spawn sixth card
         GameObject breeder6 = Instantiate(breedingPhase.randomPrefabs[animalIndex6], new Vector3(4.5f, -2, 0), Quaternion.identity);

使用上面的代码块,我可以生成随机动物,但有些情况下它们中的一些是相同的预制件。预先感谢您的回复。

unity-game-engine instantiation prefab
2个回答
0
投票

您可以复制预制数组并随机打乱元素。由于它们的顺序是随机的,您可以简单地选择第一个、第二个等元素并实例化它,从而保证不会有重复项。

以下代码通过逐个元素遍历数组并将每个元素与数组中的另一个元素交换来打乱预制件。元素也可以与其自身交换。我已经稍微“延迟”了您的代码以删除重复项。它会根据指定的位置生成繁殖者。

Vector3[] pos = {new Vector3(-4.5f, 3.2f, 0), new Vector3(0, 3.2f, 0), new Vector3(4.5f, 3.2f, 0), new Vector3(-4.5f, -2, 0), new Vector3(0, -2, 0), new Vector3(4.5f, -2, 0)};
GameObject[] breeder = new GameObject[pos.Length];

//creates new array and shuffles it
GameObject[] shuffledPrefab = breedingPhase.randomPrefabs;
for(int i=0; i<shuffledPrefab.Length; i++){
  int element = Random.Range(0, shuffledPrefab.Length);
  GameObject temp = shuffledPrefab[i];
  shuffledPrefab[i] = shuffledPrefab[element];
  shuffledPrefab[element] = temp;
}

//instantiates as many breeders as there are positions
for(int i=0; i<pos.Length; i++){
  breeder[i] = Instantiate(shuffledPrefab[i], pos[i], Quaternion.identity);
}

请注意,如果您指定的位置多于预制件,此代码将导致错误。


0
投票

这里是一组函数,

SpawnRandomAnimals
,作为入口点。

using System.Linq;

Vector3[] spawnPoints = new Vector3[]
{
    new Vector3(-4.5f, 3.2f, 0), 
    new Vector3(0, 3.2f, 0), 
    new Vector3(4.5f, 3.2f, 0), 
    new Vector3(-4.5f, -2, 0), 
    new Vector3(0, -2, 0), 
    new Vector3(4.5f, -2, 0)
};

void SpawnRandomAnimals(int numSpawns)
{
    int[] indexes = GetIndexesToSpawn(breedingPhase.randomPrefabs, numSpawns);
    
    for (int i = 0; i < indexes.Length; i++)
    {
        GameObject breeder = Instantiate(breedingPhase.randomPrefabs[indexes[i]], spawnPoints[i], Quaternion.identity);
        // ... Do Rest
    }
}

void int[] GetIndexesToSpawn(IEnumerable<GameObject> animalCollection, int numSpawns)
{
    // Get the number of animals to spawn
    int maxAnimals = animalCollection.Count();
    int numberToSpawn = numSpawns > maxAnimals ? maxAnimals : numSpawns;
    
    // TODO:
    //      Find a better way to get spawn point as it currently
    //      Limits the number of animals we can have.
    numberToSpawn = numSpawns > spawnPoints.Length ? spawnPoints.Length : numberToSpawn;
    
    // Create an array of unique indexes to pick from
    int[] indexes = CreateArray(numberToSpawn);
    
    // Suffle the indexes
    Shuffle(indexes);
    
    // Select the number of spawns
    return indexes.Take(numSpawns).ToArray();
}


public  int[] CreateArray(int size)
{
    if (size < 0)
    {
        throw new ArgumentException("Size cannot be negative");
    }

    int[] result = new int[size];
    for (int i = 0; i < size; i++)
    {
        result[i] = i;
    }

    return result;
}

public void Shuffle(int[] array)
{
    int n = array.Length;
    for (int i = 0; i < n; i++)
    {
        // Pick a random index from the remaining unshuffled elements (i to n-1)
        int randomIndex = i + rng.Next(n - i);

        // Swap element at i with element at randomIndex
        int temp = array[i];
        array[i] = array[randomIndex];
        array[randomIndex] = temp;
    }
}

这里的限制是,如果你想生成 8 只动物,但只有 6 个生成点,则只会生成 6 个。您将需要创建一个新方法来获取重生点。

© www.soinside.com 2019 - 2024. All rights reserved.