如何统一分配随机颜色?

时间:2020-06-10 10:12:06

标签: c# unity3d

我想用随机的颜色生成5个游戏对象,但是我不想重复这些颜色。 enter image description here

这是我的代码:

void RandomColor()
{
    colors = new[] {
    Color.blue,
    Color.magenta,
    Color.red,
    Color.green,
    Color.yellow};

    int rand = Random.Range(0, colors.Length);
    for (int i = 0; i <= colors.Length; i++)
    {
        PickUp.GetComponent<SpriteRenderer>().color = colors[rand];

    }
}

2 个答案:

答案 0 :(得分:2)

一种实现此目的的方法是将颜色数组随机排列,然后正常访问它们。


示例

这是一个用于整理数组的辅助函数。

public static void Shuffle(Color[] array)
{
    Random rand = new Random();

    for (int i = array.Length-1; i > 0; i--)
    {
        int j = rand.Next(0, i+1);
        Color temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}

这是您可以使用的方式:

colors = ...;

Shuffle(colors);

for (int i = 0; i < colors.Length; i++)
{
    ... = colors[i];
}

这将Durstenfeld version of the Fisher-Yates shuffle用于O(N)复杂度。

答案 1 :(得分:0)

我建议两个选择。首先是您在分配项目后从数组中删除该项目,以确保没有重复。为此,您需要将颜色设置为列表,以便删除元素。 如果要生成5个具有不同颜色的游戏对象,但又不想重复,那么您将需要在函数外部分配一些变量,或者为同一函数中的所有游戏对象设置颜色。在以下示例中,一个函数用于为所有不同的gameObjects分配随机颜色

void RandomColor()
{
    List<Color> colors = new List<Color>(); // make this list contain the colors you want

    while (colors.Count > 0) // will do the following code 5 times if you assign 5 colors to 5 new game objects
    {
        int rand = Random.Range(0, colors.Length); // get a random color from the lists
        GameObject pickUp = Instantiate (PICKUPGAMEOBJECT, WHERE YOU WANT TO SPAWN IT, Quaternion.identity); // Instantiate/spawn your pickup here
        pickUp.GetComponent<SpriteRenderer>().color = colors[rand]; // assign the gameObject a random color from the list
        colors.Remove (colors[rand]); // remove the item from the list so it can't be called again
    }
}

另一种方法是具有另一个数组,并添加您在其中使用过的所有颜色。与其他示例一样,您将需要使用一个函数为所有不同的gameObjects分配随机颜色

void RandomColor()
{
    Color[] colors = {
    Color.blue,
    Color.magenta,
    Color.red,
    Color.green,
    Color.yellow};
    List<Color> usedColors = new List<Color>(); 

    for (int i = 0; i <= colors.Length; i++)
    {
        bool foundNewColor = false; 
        while (!foundNewColor)
        {
            int rand = Random.Range(0, colors.Length);
            if (!usedColors.Contains(colors[rand])
                foundNewColor = true; 
        }
        GameObject pickUp = Instantiate (PICKUPGAMEOBJECT, WHERE YOU WANT TO SPAWN IT, Quaternion.identity); // Instantiate/spawn your pickup here
        pickUp.GetComponent<SpriteRenderer>().color = colors[rand]; // assign the gameObject a random color from the list
        usedColors.Add (color[rand]); 
    }
}

我没有测试这段代码,但是逻辑已经存在。