首页 > 其他分享 >unity使用ugui自制调色面板

unity使用ugui自制调色面板

时间:2022-12-13 14:31:09浏览次数:84  
标签:Color ++ int unity TexPixelLength addValue 调色 ugui arrayColor


突然想实现一个调色面板,然后开工...

首先找找有没有什么接口可调,木有找到,找到一些调用win32实现的本地颜色面板的调用,感觉不科学,反正多平台肯定是搞不定的。

既然没找到,还是老老实实的自己写吧,看看Texture2D的相关函数,可以绘制像素,这样就行了,基本搞定,​​http://docs.unity3d.com/ScriptReference/Texture2D.html​

下面来说说,具体步骤:

1.创建一个颜色面板的脚本,初始化一些相关属性,Texture2D,RawImage,颜色数组等

Texture2D tex2d;
public RawImage ri;

int TexPixelLength = 256;
Color[,] arrayColor;
// Use this for initialization
void Start () {
arrayColor = new Color[TexPixelLength, TexPixelLength];
tex2d = new Texture2D(TexPixelLength, TexPixelLength, TextureFormat.RGB24,true);
ri.texture = tex2d;
}


2.开始计算像素的颜色,这里有一点定义需要先自己去观察一下,我看了一下ps和unity自身的调色面板,他们都是地下为黑色,左上为白色,右上为自定义颜色,我这里称他为endColor。知道四个角落的颜色后就开始计算中间像素的颜色,规律嘛,看代码或者自己看ps的调色板也能找出来。因为Texture2D建议用数组绘制像素,我就没有一个个去绘制,先把颜色装数组里吧

Color[] CalcArrayColor(Color endColor)
{
Color value = (endColor - Color.white) / (TexPixelLength - 1);
for (int i = 0; i < TexPixelLength; i++)
{
arrayColor[i, TexPixelLength - 1] = Color.white + value * i;
}
for (int i = 0; i < TexPixelLength; i++)
{
value = (arrayColor[i, TexPixelLength - 1] - Color.black) / (TexPixelLength - 1);
for (int j = 0; j < TexPixelLength; j++)
{
arrayColor[i, j] = Color.black + value * j;
}
}
List<Color> listColor = new List<Color>();
for (int i = 0; i < TexPixelLength; i++)
{
for (int j = 0; j < TexPixelLength; j++)
{
listColor.Add(arrayColor[j, i]);
}
}

return listColor.ToArray();
}

3.获取到颜色数组后,就可以将他绘制tex2d上,然后显示在RawImage上,看一下绘制函数

public void SetColorPanel(Color endColor)
{
Color[] CalcArray = CalcArrayColor(endColor);
tex2d.SetPixels(CalcArray);
tex2d.Apply();
}


4.在获取到相关数据后,然后可以在调用一下SetColorPanel设置为endColor设置一个颜色,比如我这里初始化为红色,感觉跟ps里的一样呢


unity使用ugui自制调色面板_颜色面板


5.除了红色我们肯定还需要调用其他颜色,于是就需要右边的颜色作为endColor的值,右边的值呢,就是RGB三原色,其他颜色也是他们的混合出来的,然后选择一个endColor左边的颜色面板就会更新新的颜色,大概看一下计算代码,其他显示都类似

Color[] CalcArrayColor()
{
int addValue = (TexPixelHeight - 1) / 3;
for (int i = 0; i < TexPixelWdith; i++)
{
arrayColor[i, 0] = Color.red;
arrayColor[i, addValue] = Color.green;
arrayColor[i, addValue+addValue] = Color.blue;
arrayColor[i, TexPixelHeight - 1] = Color.red;
}
Color value = (Color.green - Color.red)/addValue;
for (int i = 0; i < TexPixelWdith; i++)
{
for (int j = 0; j < addValue; j++)
{
arrayColor[i, j] = Color.red + value * j;
}
}
value = (Color.blue - Color.green)/ addValue;
for (int i = 0; i < TexPixelWdith; i++)
{
for (int j = addValue; j < addValue*2; j++)
{
arrayColor[i, j] = Color.green + value * (j-addValue);
}
}

value = (Color.red - Color.blue) / ((TexPixelHeight - 1)-addValue-addValue);
for (int i = 0; i < TexPixelWdith; i++)
{
for (int j = addValue*2; j < TexPixelHeight - 1; j++)
{
arrayColor[i, j] = Color.blue + value * (j- addValue * 2);
}
}

List<Color> listColor = new List<Color>();
for (int i = 0; i < TexPixelHeight; i++)
{
for (int j = 0; j < TexPixelWdith; j++)
{
listColor.Add(arrayColor[j, i]);
}
}

return listColor.ToArray();
}

6.然后写一个Manager类,来管理一下相关的操作。

哎呀,略懒,写了基本思路就够了,代码都写得很粗糙,也没有去优化操作之类的东西。有兴趣,加一个alpha值,照着unity的调色面板做一个出来,也应该够用了。

unity使用ugui自制调色面板_ugui_02


工程:https://github.com/coding2233/UnityColor

标签:Color,++,int,unity,TexPixelLength,addValue,调色,ugui,arrayColor
From: https://blog.51cto.com/u_15911199/5934062

相关文章

  • Unity 自定义创建脚本模板
    Unity自定义创建脚本模板原理:以模板代码为底板,通过关键字替换来实现代码创建两种实现方案方案11.先准备好对应的代码模板,放到Assets\ScriptTemplates目录下usingSys......
  • Unity中实现A*寻路
    前言:最近没事儿没工作,计划每天写一篇博客,防止对Unity生疏,也可以记录学习的点点滴滴。A*寻路在很多面试里都会问到,但实际工作中根本用不着自己写,网上有成熟的插件,不容易错......
  • Unity 脚本基础
    Unity官方手册是最好的教程书,只是偶尔限于冗长ScriptingconceptsAlthoughUnityusesanimplementationofthestandardMonoruntimeforscripting,itstillh......
  • [SIGMOD 2022]DMCS Density Modularity based Community Search
    [SIGMOD2022]DMCS:DensityModularitybasedCommunitySearch介绍目标是找到含有查询点的社区。文章的切入点是高质量的社区一定也是高模块化的,及社区内密度高,且社......
  • unity 实现物体空间距离音量远小近大的效果
    需要两个组件一 AudioListener需要添加到摄像机,一般默认都有 二 AudioSource需要添加到需要发出声音的物体对象上将AudioSource中空间混合SpatialBlend设置为1......
  • 在Unity3D软件中将图片转换为UI图片
    在Unity3D软件中将图片转换为UI图片,先将图片拖进Unity3D中,然后在右侧栏Inspector->TextureType下选择Sprite(2DandUI),点击apply,图片变为UI图片(显示播放键)。 ......
  • 菜鸡学Unity 之 坑神之路 (记录坑点,不断更新中~)
    LZ-Says:万事儿开头难,枪在手,不得不发~前言最近在了解Unity这块的内容,不得不说,新的领域,陌生的代码世界,初入茅庐,太多的陌生与不适,唯有咬紧牙关,坚持下去,到最后,会发现,一切不过......
  • unity 判断当前点击的按钮对象是谁
    ①将以下代码复制到新建c#脚本中,名称可以随意改,挂载到屏幕空间的画布上usingUnityEngine;//地下城副本管理器publicclassDungeonLairManager:MonoBehaviour{//......
  • Unity 包管理器窗口 无法执行 upm 操作: connect ETIMEDOUT 172.81.232.209:443 的解
    [包管理器窗口]无法执行upm操作:connectETIMEDOUT172.81.232.209:443问题描述:无法刷新包管理器无法安装Unity注册表中的包Cannotperformupmoperation:con......
  • Unity调用摄像头拍照及保存图片
    可能大家在使用Unity开发项目的时候,会碰到这样一个需求,就是去调用摄像头拍照或者保存图片,其中摄像头拍照方式也有多种,这里就给大家简单介绍下。usingSystem.Collections;......