如何随机生成2种颜色?

时间:2017-04-23 07:28:48

标签: c# unity3d random colors sprite

enter image description here我正在组织一场风险游戏。我有42个国家的精灵,我必须为每个国家生成随机颜色,例如 2个玩家21个绿色和21个红色

如何随机生成颜色?

{
    this.GetComponent<SpriteRenderer>().color = Color.green;
}
    else
{

    this.GetComponent<SpriteRenderer>().color = Color.red;
}

2 个答案:

答案 0 :(得分:2)

这可以通过Unity的UnityEngine.Random.Range功能轻松完成。 在 0 1 之间生成随机数。将 0 设为红色,将 1 设为绿色。

Color getRandomColor()
{
    //0 = red
    //1 = green
    if (UnityEngine.Random.Range(0, 2) == 0)
        return Color.red;
    else
        return Color.green;
}

<强>用法:

this.GetComponent<SpriteRenderer>().color = getRandomColor();

修改

  

我同样部署它们

我猜你的意思是平均生成随机数。 12红色和12绿色随机相同。

使用此课程:

public class EquallyColorGen
{
    const int totalNumber = 24;

    static bool[] randomNumbers = new bool[totalNumber];
    static Color[] randomColor = new Color[totalNumber];

    public static Color[] generateRandomNumbers()
    {
        const int halfOfTotalNumber = totalNumber / 2;

        int firstRandom = UnityEngine.Random.Range(0, 2);

        bool first12;
        bool last12;

        if (firstRandom == 0)
        {
            first12 = true;
            last12 = false;
        }
        else
        {
            first12 = false;
            last12 = true;
        }

        //Generate Even Random number. The first 12 are the-same. The last 12 are different but the-same
        for (int i = 0; i < randomNumbers.Length; i++)
        {
            randomNumbers[i] = (i < halfOfTotalNumber) ? first12 : last12;
        }

        //Shuff Amount
        const int shuffleAmount = 1;

        for (int j = 0; j < shuffleAmount; j++)
        {
            for (int i = 0; i < halfOfTotalNumber; i++)
            {
                //0 = flip color
                int randColor = UnityEngine.Random.Range(0, 2);
                bool flip = false;

                flip = (randColor == 0) ? true : false;

                //Also flip the 1 to 12
                randomNumbers[i] = (flip == true) ? !randomNumbers[i] : randomNumbers[i];

                //Also flip the other side 12 t0 24
                int lIndex = i + halfOfTotalNumber;
                randomNumbers[lIndex] = (flip == true) ? !randomNumbers[lIndex] : randomNumbers[lIndex];
            }
        }

        //Finally Make color from the list
        for (int i = 0; i < randomNumbers.Length; i++)
        {
            //Red = false
            //Green = true
            randomColor[i] = (randomNumbers[i] == false) ? Color.red : Color.green;
        }

        return randomColor;
    }
}

<强>用法

Color[] randomPlayerColors = EquallyColorGen.generateRandomNumbers();

randomPlayerColors变量中有 24 随机颜色,它们是相同生成的。如果您想要42种随机颜色,只需将const int totalNumber = 24;更改为const int totalNumber = 42;

即可

答案 1 :(得分:0)

好吧,我会采取不同的方法。

一个控制器对象(不是一个精灵,只是一个不可见的对象,它将在编辑器游戏逻辑接口中保存一些必要的脚本)应该有一个脚本,它将获取所有国家的GameObjects并在列表中随机地随机播放它们并在有多少球员(比如上半场球员1,第二球员......)

改组清单:

ion-infinite-scroll

在这结束时,你有一个空的 countryList 和完整的 shuffledCountryList 。您可以在foreach循环中执行任何划分:

List<CountryScript> countryList = new  List<CountryScript>();
countryList.AddRange(GetComponents<CountryScript>());
List<CountryScript> shuffledCountryList = new  List<CountryScript>();
while(countryList.Count > 0) {
    CountryScript c = countryList[Random.Range(0, countryList.Count)];
    shuffledCountryList.Add(c);
    countryList.Remove(c);
}

CountryScript 应该有一个 public void SetPlayer(int Num){} 方法,该方法将通过 int Num 价值。您是否会将此列表存储在属性中的Controller脚本中,以便能够在编辑器中对其进行调整,或者在 CountryScript 中进行硬编码是您的选择。我是第一种方式,因为这样你就可以轻松添加更多玩家+编辑而无需编码。或者像程序员写道:

int playerCount = 2;
int maxNum = shuffledCountryList.Count / playerCount;
//It can be 2 or whatever you'll have it later
for(int i = 0; i < shuffledCountryList.Count; i++) {
    shuffledCountryList[i].SetPlayer(i/maxNum);
}

希望这有助于你。