c# - 一个 RGB 设置为 255 的随机颜色生成
问题描述
我想为我的背景获取随机颜色。只有一件事,其中一个值应该是 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;
}
解决方案
好的,有几个问题。首先是Color
该类使用从 0 到 1 的浮点值来表示其颜色。如果您希望明确地根据 0-255 比例设置值,那么您需要Color32
该类。也就是说,Color
可能为您提供了很好的服务并且有更多的功能可以启动,您只需要记住您想要使用的浮点版本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;
}
现在,我们实际上可以进一步压缩它。需要记住的是,您可以使用color[0]
through访问颜色的 RGBA 组件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);
推荐阅读
- php - 类 Illuminate\Database\Eloquent\Builder 的对象外键问题
- php - 如何最小化sql查询中的代码重复?
- java - Java集成kettle连接hive异常,在kettle中使用Hadoop Hive2,可以连接但不能查询
- html - html 导航菜单下拉菜单仅显示最后一个菜单项
- minikube - Minikube:从主机访问仪表板
- vb.net - 在 Accord.net 中设置约束(这应该很容易?)
- ios - 在iOS中,打印nil内存地址显示0x0意味着没有存储空间?
- c++ - 这个后增量语句是否会导致未定义的行为?
- git - 无法在 gitlab 中提交和推送
- android - 行为隐藏后更改时折叠工具栏上的 FAB 不显示图标