Генерация случайных цветов с одним RGB, установленным на 255 - PullRequest
0 голосов
/ 30 марта 2019

Я хочу получить случайный цвет для моего фона. Только одно, одно из значений должно быть 255. Как (234,85,38) не хорошо, но (33,255,82) хорошо.

В настоящее время я пытаюсь сначала переключить случайное число, для которого значение (R, G или B) должно быть 255. Затем в каждом случае я определяю другие значения случайным образом. Но это не работает.

void setBackgroundColor(){
        Color color = new Color();
        switch(Random.Range(1,3)){
            case 1:
                color = new Color(255, Random.Range(1,255), Random.Range(1,255));
                break;
            case 2:
                color = new Color(Random.Range(1,255), 255, Random.Range(1,255));
                break;
            case 3:
                color = new Color(Random.Range(1,255), Random.Range(1,255), 255);
                break;
        }
        Camera.main.backgroundColor = color;
    }

1 Ответ

0 голосов
/ 30 марта 2019

Хорошо, пара вопросов. Во-первых, класс Color использует значения с плавающей запятой от 0 до 1 для представления своих цветов. Если вы явно хотите установить значения по шкале 0-255, вам нужен класс Color32. Тем не менее, Color, вероятно, хорошо вам подходит и имеет больше возможностей для загрузки, вам просто нужно помнить, что вы хотите использовать float версию Random.Range(), а не целочисленную версию. Задание параметров в виде чисел с плавающей точкой исправляет следующее:

void setBackgroundColor(){
    Color color = new Color();
    switch(Random.Range(1,3)){
        case 1:
            color = new Color(1f, Random.Range(0f ,1f), Random.Range(0f, 1f));
            break;
        case 2:
            color = new Color(Random.Range(0f, 1f), 1f, Random.Range(0f, 1f));
            break;
        case 3:
            color = new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), 1f);
            break;
    }
    Camera.main.backgroundColor = color;
}

Теперь мы можем сжать это дальше. Следует помнить, что вы можете получить доступ к компонентам RGBA цвета, используя color[0] - color[3]. Таким образом, вы можете упростить код для генерации случайного цвета, а затем переписать случайный индекс:

void setBackgroundColor() {
    Color color = new Color(Random.Range(0f, 1f), Random.Range(0f ,1f), Random.Range(0f, 1f));
    color[Random.Range(0,2)] = 1f;
    Camera.main.backgroundColor = color;
}

Теперь это лучше, но подумав о том, что вы пытаетесь сделать, я рискну догадаться и скажу, что вам нужен цвет, который не слишком темный или ненасыщенный. Рассмотрим явное создание цвета из значений HSV (Hue, Saturation, Value) с помощью функции Color.HSVToRGB():

void setBackgroundColor() {
    Camera.main.backgroundColor = Color.HSVToRGB(Random.Range(0f, 1f), 1f, 1f);
}

При этом мы просто указываем, что это оттенок цвета, который мы хотим рандомизировать, а не что-либо еще. И на самом деле, есть еще одна оптимизация: это однострочная функция, и она, вероятно, вызывается только в одном месте. Скорее всего, вы можете полностью удалить вызов функции и заменить его содержимым функции:

Camera.main.backgroundColor = Color.HSVToRGB(Random.Range(0f, 1f), 1f, 1f);

EDIT: Знаешь что? Есть даже более чистый способ сделать это. Оказывается, у Random есть функция с именем Random.ColorHSV():

Camera.main.backgroundColor = Random.ColorHSV(0f, 1f, 1f, 1f, 1f, 1f);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...