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

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

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

下面来说说,具体步骤:

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

  1. Texture2D tex2d;
  2. public RawImage ri;
  3.  
  4. int TexPixelLength = 256;
  5. Color[,] arrayColor;
  6. // Use this for initialization
  7. void Start () {
  8. arrayColor = new Color[TexPixelLength, TexPixelLength];
  9. tex2d = new Texture2D(TexPixelLength, TexPixelLength, TextureFormat.RGB24,true);
  10. ri.texture = tex2d;
  11. }

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

  1. Color[] CalcArrayColor(Color endColor)
  2.     {
  3.         Color value = (endColor - Color.white) / (TexPixelLength - 1);
  4.         for (int i = 0; i < TexPixelLength; i++)
  5.         {
  6.             arrayColor[i, TexPixelLength - 1] = Color.white + value * i;
  7.         }
  8.         for (int i = 0; i < TexPixelLength; i++)
  9.         {
  10.             value = (arrayColor[i, TexPixelLength - 1] - Color.black) / (TexPixelLength - 1);
  11.             for (int j = 0; j < TexPixelLength; j++)
  12.             {
  13.                 arrayColor[i, j] = Color.black + value * j;
  14.             }
  15.         }
  16.         List<Color> listColor = new List<Color>();
  17.         for (int i = 0; i < TexPixelLength; i++)
  18.         {
  19.             for (int j = 0; j < TexPixelLength; j++)
  20.             {
  21.                 listColor.Add(arrayColor[j, i]);
  22.             }
  23.         }
  24.         
  25.         return listColor.ToArray();
  26.     }

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

  1. public void SetColorPanel(Color endColor)
  2. {
  3. Color[] CalcArray = CalcArrayColor(endColor);
  4. tex2d.SetPixels(CalcArray);
  5. tex2d.Apply();
  6. }

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

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

  1. Color[] CalcArrayColor()
  2. {
  3. int addValue = (TexPixelHeight - 1) / 3;
  4. for (int i = 0; i < TexPixelWdith; i++)
  5. {
  6. arrayColor[i, 0] = Color.red;
  7. arrayColor[i, addValue] = Color.green;
  8. arrayColor[i, addValue+addValue] = Color.blue;
  9. arrayColor[i, TexPixelHeight - 1] = Color.red;
  10. }
  11. Color value = (Color.green - Color.red)/addValue;
  12. for (int i = 0; i < TexPixelWdith; i++)
  13. {
  14. for (int j = 0; j < addValue; j++)
  15. {
  16. arrayColor[i, j] = Color.red + value * j;
  17. }
  18. }
  19. value = (Color.blue - Color.green)/ addValue;
  20. for (int i = 0; i < TexPixelWdith; i++)
  21. {
  22. for (int j = addValue; j < addValue*2; j++)
  23. {
  24. arrayColor[i, j] = Color.green + value * (j-addValue);
  25. }
  26. }
  27.  
  28. value = (Color.red - Color.blue) / ((TexPixelHeight - 1)-addValue-addValue);
  29. for (int i = 0; i < TexPixelWdith; i++)
  30. {
  31. for (int j = addValue*2; j < TexPixelHeight - 1; j++)
  32. {
  33. arrayColor[i, j] = Color.blue + value * (j- addValue * 2);
  34. }
  35. }
  36.  
  37. List<Color> listColor = new List<Color>();
  38. for (int i = 0; i < TexPixelHeight; i++)
  39. {
  40. for (int j = 0; j < TexPixelWdith; j++)
  41. {
  42. listColor.Add(arrayColor[j, i]);
  43. }
  44. }
  45.  
  46. return listColor.ToArray();
  47. }

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. java的泛型

    泛型概述 先看下面的代码: ArrayList al1 = new ArrayList(); ArrayList al2 = new ArrayList(); al1.add("hello& ...

  2. ubuntu 系统应用安装方式

    转载   ubuntu系统软件安装 来源:http://www.linuxidc.com/Linux/2011-02/32211.htm 首先说明一下 ubuntu 的软件安装大概有几种方式:1. d ...

  3. 微信小程序-参数传递与事件处理

    前言 开发过程中经常会遇到从一个页面携带数据到另一个页面的情况,所以需要知道以下信息,什么是事件?有哪些传递方式?如果传递数组呢?如果传递对象呢? 一.事件 什么是事件 事件是视图层到逻辑层的通讯方式 ...

  4. Hash算法入门指南(聊点不一样的算法人生)

    前言 很多人到现在为止都总是问我算法该怎么学啊,数据结构好难啊怎么的,学习难度被莫名的夸大了,其实不然.对于一个学计算机相关专业的人都知道,数据结构是大学的一门必修课,数据结构与算法是基础,却常常容易 ...

  5. c语言3种链接属性: 外部(external), 内部(internal),无设置(none)

    c语言中,多个文件组合的时候,有可能标示名相同,那么这个时候编译器如何判别的呢?    c语言中有3种链接属性: 外部(external), 内部(internal),无设置(none)    外部( ...

  6. python2.7练习小例子(二)

        2):题目:企业发放的奖金根据利润提成.利润(I)低于或等于10万元时,奖金可提10%:利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%:2 ...

  7. SQL之排序

    1.按多个列排序 经常需要按不止一个列进行数据排序.例如,如果要显示雇员名单,可能希望按姓和名排序(首先按姓排序,然后在每个姓中再按名排序).如果多个雇员有相同的姓,这样做很有用. 要按多个列排序,简 ...

  8. localeCompare() 方法实现中文的拼音排序

    google了很多次才发现在国外网站上有提示如何比较中文,原文地址:http://www.webdeveloper.com/forum/showthread.php?t=9365 前提:使用Unico ...

  9. CSS(一)解析浮动塌陷与清除浮动

    清除浮动方法 1.对父级设置适合CSS高度,父级元素撑开并且包含子元素. <p>固定高度</p> <div style="height: 50px;" ...

  10. 13.QT-QMainWindow组件使用

    QMainWindow介绍 主窗口是与用户进行长时间交互的顶层窗口,比如记事本 主窗口通常是应用程序启动后显示的第一个窗口 QMainWindow是Qt中主窗口的基类,继承于QWidget,如下图所示 ...