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

首先找找有没有什么接口可调,木有找到,找到一些调用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里的一样呢

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的调色面板做一个出来,也应该够用了。

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

unity使用ugui自制调色面板的更多相关文章

  1. Unity 3D UGUI Toggle用法教程

    UGUI Toggle用法教程 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  2. Unity GUI(uGUI)使用心得与性能总结

    Unity GUI(uGUI)使用心得与性能总结 作者 kingshijie 关注 2015.09.26 15:35 字数 3686 阅读 28031评论 10喜欢 49 背景和目的 小哈接触Unit ...

  3. 在Unity中用UGUI制作可输入下拉框

    Unity中UGUI制作可输入下拉框 目录 Unity中UGUI制作可输入下拉框 前言 组件分析 制作流程 总结 前言 在搜索引擎以及一些网页中我们常常可以看见这样一种UI控件,看上去是一个输入框,在 ...

  4. Unity引擎 UGUI

    Unity UGUI讲解 1.导入UI图片资源 2.设置参数: TextureType(纹理类型) 精灵 2D and UI SpriteMode(精灵模式)  Single(单) multiple( ...

  5. Unity的UGUI在SetParent后修改UI的localposition问题

    正常情况下,UGUI设置UI的localposition可以直接赋值 UIxxx.rectTransform.localPosition = ] / 2f, , ); 运行后在Unity的Inspec ...

  6. 【Unity Shader】自定义材质面板的小技巧

    写在前面 之前遇到过一些朋友问怎么在材质面板里定义类似于bool这种变量,控制一些代码的执行.我们当然可以写一个C#文件来自定义材质面板,就像Unity为Standard Shader写材质面板一样( ...

  7. unity使用UGUI创建摇杆

    1.现在unity做一个项目,各种插件各种包,于是项目资源就无限变大了,其实一些简单的功能可以自己写,这里就是试着使用UGUI编写一个摇杆功能 2.脚本如下: using UnityEngine; u ...

  8. Unity 利用UGUI打包图集,动态加载sprite资源

    今天做了一个UI界面,这个界面是好友界面,该界面上有若干个好友item. 需要对每个tem的头像对象(image)动态显示对应的头像.尝试利用UGUI的图集来加载,具体实现如下: 1.首先,需要知道S ...

  9. 【Unity】UGUI聊天消息气泡 随文本内容自适应

    游戏中需要用做UGUI做聊天界面.其中聊天气泡ChatItem的UI要求能随着聊天内容文本的长度自适应的. 网上搜了一下聊天气泡的UI,发现都不太符合咱的需求,具体来说是文本宽度不足一行时,文本宽度自 ...

随机推荐

  1. 【QAQ的Minecraft】

    树套树被QAQ用木斧挖了,只剩二维RMQ了. 题目:      QAQ最近爱上了一款很平凡的游戏,叫做<Minecraft>.目前游戏更新到了1.12版本,他发现了一条新的指令:/fill ...

  2. bzoj1493[NOI2007]项链工厂 线段树

    1493: [NOI2007]项链工厂 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 1712  Solved: 723[Submit][Status] ...

  3. Android Activity的任务栈和四大启动模式

    在安卓系统中默认每次启动一个Activity时,系统会创建一个实例,并按照先进后出的原则放入任务栈中,当我们按back键时,就会有一个activity从任务栈顶移除,重复下去,直到任务栈为空,系统就会 ...

  4. 如何在Windows系统中设置Python程序定时运行

    文章出处:http://blog.csdn.net/wwy11/article/details/51100432 首先,我们肯定是要用到Windows下的[计划任务]功能 之后点击右侧的[创建基本任务 ...

  5. Android SDK下载安装及配置教程

    2017年12月07日 13:33:32 4942 转载自:http://blog.csdn.net/dr_neo/article/details/49870587 Android开发环境搭建可以分为 ...

  6. Python从入门到实践 学习笔记(二)元祖686gffs

    列表是可以修改的,而不可变的列表被称为元组 . 定义 * 用圆括号来标识.定义元组后,使用索引来访问其元素,就像访问列表元素一样 修改变量 * 不能修改元组的元素,但可以给存储元组的变量赋值 修改元素 ...

  7. WUOJ-ACM :1003: 零起点学算法78——牛牛

    武汉科技大学ACM :1003: 零起点学算法78--牛牛Problem Description牛牛是一种纸牌游戏,总共5张牌,规则如下: 如果找不到3张牌的点数之和是10的倍数,则为没牛: 如果其中 ...

  8. ubuntu查看IO

    在命令行直接 cp 一个比较大的文件时,由于没有提示信息,总感觉很不放心,可以通过查看IO的方式确认cp操作的进展程度. 查看IO可以使用iostat命令,但是前提是要安装sysstat sudo a ...

  9. 全局变量&局部变量,global&nonlocal

    ###全局变量与局部变量 1.函数内部的变量名如果第一次出现,且出现在=前面,即被视为定义一个局部变量,不管全局域中有没有用到该变量名,函数中使用的将是局部变量 2.函数内部的变量名如果第一次出现,且 ...

  10. 推荐几种PHP实现页面跳转的方法

    1.PHP实现页面跳转第一种方法 <?php header("Location:http://www.baidu.com"); ?> header()是php内置函数, ...