这是我的代码:
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];
}
}
答案 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]);
}
}
我没有测试这段代码,但是逻辑已经存在。