当前位置:网站首页>Unity color palette | color palette | stepless color change function
Unity color palette | color palette | stepless color change function
2022-07-06 23:42:00 【Fuuyg】
effect
Unity adopt UGUI Realize the palette function of stepless color change , It's very simple and easy to use .
project git Address
https://github.com/zrzhang76/UnityColorBoard
Code ( This is written entirely because CSDN Don't think I have a few words , It is suggested to look directly at the project )
Color board part
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace CSharp.UI.ColorBoard
{
public class ColorBoard : MonoBehaviour, IPointerClickHandler, IDragHandler
{
// Display color Texture
Texture2D tex2d;
//RawImage Components
RawImage ri;
// Pixel width height 256( The default value is )
int TexPixelLength = 256;
int TexPixelHeight = 256;
// Common components
public Slider sliderCRGB;
public ColorHue colorHue;
// Color array
UnityEngine.Color[,] arrayColor;
// Self Transform
RectTransform rt;
// Circle of color focus
public RectTransform circleRect;
public delegate void ColorChangeDelegate(Color color);
public event ColorChangeDelegate OnColorChanged;
private void Awake()
{
ri = GetComponent<RawImage>();
rt = GetComponent<RectTransform>();
circleRect = transform.Find("img_cursor").GetComponent<RectTransform>();
TexPixelLength = (int)rt.sizeDelta.x;
TexPixelHeight = (int)rt.sizeDelta.y;
// Initialize the color array
arrayColor = new UnityEngine.Color[TexPixelLength, TexPixelHeight];
// Create a fixed length and width Texture
tex2d = new Texture2D(TexPixelLength, TexPixelHeight, TextureFormat.RGB24, true);
// Component assignment picture
ri.texture = tex2d;
ri.texture.wrapMode = TextureWrapMode.Clamp;
// Initialize and set the color of the board to red
SetColorPanel(UnityEngine.Color.red);
sliderCRGB.onValueChanged.AddListener(OnCRGBValueChanged);
}
// Monitoring of color changes
void OnCRGBValueChanged(float value)
{
UnityEngine.Color endColor=colorHue.GetColorBySliderValue(value);
SetColorPanel(endColor);
var color = GetColorByPosition(circleRect.anchoredPosition);
OnColorChanged?.Invoke(color);
}
// Set the color of the board
public void SetColorPanel(UnityEngine.Color endColor)
{
UnityEngine.Color[] CalcArray = CalcArrayColor(endColor);
// Fill the color board with color , And apply
tex2d.SetPixels(CalcArray);
tex2d.Apply();
}
// Through a final color value , Calculate the color of all pixels on the board , And return an array
UnityEngine.Color[] CalcArrayColor(UnityEngine.Color endColor)
{
// Calculate the average value of the difference between the final value and white in the horizontal direction , Used to calculate the color value of each horizontal pixel
UnityEngine.Color value = (endColor - UnityEngine.Color.white) / (TexPixelLength - 1);
for (int i = 0; i < TexPixelLength; i++)
{
arrayColor[i, TexPixelHeight - 1] = UnityEngine.Color.white + value * i;
}
// Empathy , vertical direction
for (int i = 0; i < TexPixelLength; i++)
{
value = (arrayColor[i, TexPixelHeight - 1] - UnityEngine.Color.black) / (TexPixelHeight - 1);
for (int j = 0; j < TexPixelHeight; j++)
{
arrayColor[i, j] = UnityEngine.Color.black + value * j;
}
}
// Returns an array , Save all color values
List<UnityEngine.Color> listColor = new List<UnityEngine.Color>();
for (int i = 0; i < TexPixelHeight; i++)
{
for (int j = 0; j < TexPixelLength; j++)
{
listColor.Add(arrayColor[j, i]);
}
}
return listColor.ToArray();
}
/// <summary>
/// Get the color by coordinate , Coordinates are Texture The two-dimensional coordinates above
/// </summary>
/// <param name="pos"></param>
/// <returns></returns>
public UnityEngine.Color GetColorByPosition(Vector2 pos)
{
Texture2D tempTex2d = (Texture2D)ri.texture;
UnityEngine.Color getColor = tempTex2d.GetPixel((int)pos.x, (int)pos.y);
return getColor;
}
public Vector2 GetClampPosition(Vector2 touchPos)
{
Vector2 vector2 = new Vector2(touchPos.x, touchPos.y);
vector2.x = Mathf.Clamp(vector2.x, 0.001f, rt.sizeDelta.x);
vector2.y = Mathf.Clamp(vector2.y, 0.001f, rt.sizeDelta.y);
return vector2;
}
// Click event
public void OnPointerClick(PointerEventData eventData)
{
Vector3 wordPos;
// take UGUI The coordinates of are transformed into world coordinates
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, eventData.position, eventData.pressEventCamera, out wordPos))
circleRect.position = wordPos;
circleRect.anchoredPosition = GetClampPosition(circleRect.anchoredPosition);
var color = GetColorByPosition(circleRect.anchoredPosition);
OnColorChanged?.Invoke(color);
}
// Drag events
public void OnDrag(PointerEventData eventData)
{
Vector3 wordPos;
// take UGUI The coordinates of are transformed into world coordinates
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(rt, eventData.position, eventData.pressEventCamera, out wordPos))
circleRect.position = wordPos;
circleRect.anchoredPosition = GetClampPosition(circleRect.anchoredPosition);
var color = GetColorByPosition(circleRect.anchoredPosition);
OnColorChanged?.Invoke(color);
}
}
}
Hue bar section
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ColorHue : MonoBehaviour
{
// Paint color Texture
Texture2D tex2d;
// Picture display components
RawImage ri;
// Length and width
int TexPixelWdith = 952;
int TexPixelHeight = 16;
// An array of colors
UnityEngine.Color[,] arrayColor;
private void Awake()
{
ri = gameObject.GetComponent<RawImage>();
// Initialize colors and Texture
arrayColor = new UnityEngine.Color[TexPixelWdith, TexPixelHeight];
tex2d = new Texture2D(TexPixelWdith, TexPixelHeight, TextureFormat.RGB24,true);
// Calculate color
UnityEngine.Color[] calcArray = CalcArrayColor();
// display
tex2d.SetPixels(calcArray);
tex2d.Apply();
ri.texture = tex2d;
ri.texture.wrapMode = TextureWrapMode.Clamp;
}
// Calculate the color array to be displayed on the hue bar
UnityEngine.Color[] CalcArrayColor()
{
// Calculate the equal increment of horizontal pixels
int addValue = (TexPixelWdith - 1) / 3;
//
for (int i = 0; i < TexPixelHeight; i++)
{
arrayColor[0, i] = UnityEngine.Color.red;
arrayColor[addValue, i] = UnityEngine.Color.green;
arrayColor[addValue+addValue, i] = UnityEngine.Color.blue;
arrayColor[TexPixelHeight - 1, i] = UnityEngine.Color.red;
}
UnityEngine.Color value = (UnityEngine.Color.green - UnityEngine.Color.red)/addValue;
for (int i = 0; i < TexPixelHeight; i++)
{
for (int j = 0; j < addValue; j++)
{
arrayColor[j, i] = UnityEngine.Color.red + value * j;
}
}
value = (UnityEngine.Color.blue - UnityEngine.Color.green)/ addValue;
for (int i = 0; i < TexPixelHeight; i++)
{
for (int j = addValue; j < addValue*2; j++)
{
arrayColor[j, i] = UnityEngine.Color.green + value * (j-addValue);
}
}
value = (UnityEngine.Color.red - UnityEngine.Color.blue) / ((TexPixelWdith - 1)-addValue-addValue);
for (int i = 0; i < TexPixelHeight; i++)
{
for (int j = addValue*2; j < TexPixelWdith - 1; j++)
{
arrayColor[j, i] = UnityEngine.Color.blue + value * (j- addValue * 2);
}
}
List<UnityEngine.Color> listColor = new List<UnityEngine.Color>();
for (int i = 0; i < TexPixelHeight; i++)
{
for (int j = 0; j < TexPixelWdith; j++)
{
listColor.Add(arrayColor[j, i]);
}
}
return listColor.ToArray();
}
/// <summary>
/// Get the color According to height
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public Color GetColorBySliderValue(float value)
{
float clampValue = Mathf.Clamp(value, 0.001f, 0.999f);
Color getColor=tex2d.GetPixel((int)((TexPixelWdith-1)*clampValue),0);
return getColor;
}
}
It's not easy to make , Give me a compliment ~~
边栏推荐
- [system analyst's road] Chapter 7 double disk system design (service-oriented development method)
- 吴恩达2022机器学习课程评测来了!
- A few suggestions for making rust library more beautiful! Have you learned?
- GPT-3当一作自己研究自己,已投稿,在线蹲一个同行评议
- 传统企业要为 Web3 和去中心化做的 11 个准备
- Example code of MySQL split string as query condition
- Docker starts MySQL and -emysql_ ROOT_ Password = my secret PW problem solving
- Wasserstein slim gain with gradient poverty (wsgain-gp) introduction and code implementation -- missing data filling based on generated countermeasure network
- How can Oracle CDC deserialize with jsondebeziumdeserializationschema
- Cloud native (32) | kubernetes introduction to platform storage system
猜你喜欢
The method of reinstalling win10 system is as simple as that
使用MitmProxy离线缓存360度全景网页
The intranet penetrates the zerotier extranet (mobile phone, computer, etc.) to access intranet devices (raspberry pie, NAS, computer, etc.)
B站大佬用我的世界搞出卷积神经网络,LeCun转发!爆肝6个月,播放破百万
达晨史上最大单笔投资,今天IPO了
STM32通过串口进入和唤醒停止模式
Efficient ETL Testing
B 站弹幕 protobuf 协议还原分析
Use mitmproxy to cache 360 degree panoramic web pages offline
js对JSON数组的增删改查
随机推荐
使用MitmProxy离线缓存360度全景网页
自动更新Selenium驱动chromedriver
英国都在试行4天工作制了,为什么BAT还对996上瘾?
Detailed explanation of regular expression (regexp) in MySQL
Huawei cloud gaussdb (for redis) unveils issue 21: using Gauss redis to achieve secondary indexing
flinksql select id ,count(*) from a group by id .
Restoration analysis of protobuf protocol of bullet screen in station B
MySQL数据库之JDBC编程
The best sister won the big factory offer of 8 test posts at one go, which made me very proud
Microsoft win11 is still "unsatisfactory". Multi user feedback will cause frequent MSI crashes
Leetcode problem solving - 889 Construct binary tree according to preorder and postorder traversal
传统企业要为 Web3 和去中心化做的 11 个准备
Example code of MySQL split string as query condition
Let me ask you if there are any documents or cases of flynk SQL generation jobs. I know that flynk cli can create tables and specify items
The method of reinstalling win10 system is as simple as that
【系统分析师之路】第七章 复盘系统设计(面向服务开发方法)
Résumé des connaissances de gradle
机器人材料整理中的套-假-大-空话
Wu Enda 2022 machine learning course evaluation is coming!
Asset security issues or constraints on the development of the encryption industry, risk control + compliance has become the key to breaking the platform