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

首先找找有没有什么接口可调,木有找到,找到一些调用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. hdu5666 BestCoder Round #80

    Segment  Accepts: 418  Submissions: 2020  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 6553 ...

  2. VK-Cup2017 Wild Card Round 2

    来自FallDream的博客,未经允许,请勿转载,谢谢. Cf的Vkcup外卡赛2  上次round2和ditoly翻车了 所以只好来打打了  规则是给一道比较特殊的题目,你要找出较优的解 Unive ...

  3. Windows、Unix、Linux是什么类型的操作系统?

    Windows:具有图形用户界面的视窗操作系统. Unix:多用户分时操作系统. Linux:类似Unix操作系统,用于个人计算机.

  4. Linux之软链接与硬链接

    什么是链接? 链接简单说实际上是一种文件共享的方式,是 POSIX 中的概念,主流文件系统都支持链接文件. 它是用来干什么的? 你可以将链接简单地理解为 Windows 中常见的快捷方式(或是 OS ...

  5. linux下磁盘分区详解 图文(fdisk;mkfs)

    linux分区不同于windows,linux下硬盘设备名为(IDE硬盘为hdx(x为从a-d)因为IDE硬盘最多四个,SCSI,SATA,USB硬盘为sdx(x为a-z)),硬盘主分区最多为4个,不 ...

  6. CSS之绝对定位

    w3school定义: 绝对定位的元素的位置相对于最近的已定位祖先元素(这里的已定位指的是绝对定位或者相对定位),如果元素没有已定位的祖先元素,那么它的位置相对于最初的包含块. 对于定位的主要问题是要 ...

  7. jquery选择器选取class

  8. JAVA的Date类与Calendar类(常用方法)

    http://blog.csdn.net/xiaopihai86/article/details/50827945 1.用Java.util.Calender来实现      Calendar cal ...

  9. 解决Spring Boot 使用RedisTemplate 存储键值出现乱码 \xac\xed\x00\x05t\x00

    spring-data-redis的RedisTemplate<K, V>模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化解决方法 ...

  10. svg和css实现波浪动效

    效果: 截图有点模糊~ 实现: <svg教程> //html <body> <svg class="wave-container" xmlns=&qu ...