Генерация случайного цвета с одним значением RGB, равным 255

#c# #unity3d

#c# #unity3d

Вопрос:

Я хочу получить случайный цвет для своего фона. Только одна вещь, одно из значений должно быть 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. Спасибо, что поделились! О … подождите, у вас где-то возникла проблема …? Нет? Отлично! ;-P

2. Какой вопрос вы хотите задать?

3. @elgonzo да, мне нужно это отредактировать. В принципе, это не работает.

4. @Sweeper Это не работает

5. Имейте в виду, Random.Range использование целых чисел не является максимально инклюзивным. Таким образом, вы никогда не получите 3 в switch.

Ответ №1:

Ладно, пара проблем. Во-первых, 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] through 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 (оттенок, насыщенность, значение) с помощью 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);
  

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

 Camera.main.backgroundColor = Random.ColorHSV(0f, 1f, 1f, 1f, 1f, 1f);
  

Комментарии:

1. Большое вам спасибо, я только что понял, насколько глупым на самом деле был мой вопрос. Вы только что превратили 11 строк кода в одну строку. Большое спасибо.

2. Есть ли какой-либо способ игнорировать определенный диапазон цветов? Мой проигрыватель красного цвета, поэтому я хочу, чтобы мой фон не был красным. Как я могу этого добиться?

3. Ну, оттенок красного при высоких и низких значениях, так что вы могли бы просто изменить первые два параметра на что-то вроде 0,2 f и 0,8 f. В качестве альтернативы, вы могли бы установить два средних значения равными 0,5 f, чтобы вы всегда получали ненасыщенные цвета, на фоне которых выделяются другие ярко окрашенные объекты. Но, может быть, сейчас самое время выбрать определенный цвет для вашего фона? Это бремя дизайнера: делать трудный выбор!