当前位置:网站首页>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 ~~
边栏推荐
- The worse the AI performance, the higher the bonus? Doctor of New York University offered a reward for the task of making the big model perform poorly
- 内网穿透zerotier 外网(手机、电脑等)访问内网设备(树莓派、NAS、电脑等)
- Isomorphism + cross end, knowing applet +kbone+finclip is enough!
- 短链的设计
- Design a red envelope grabbing system
- Wasserstein Slim GAIN with Gradient Penalty(WSGAIN-GP)介绍及代码实现——基于生成对抗网络的缺失数据填补
- B站大佬用我的世界搞出卷积神经网络,LeCun转发!爆肝6个月,播放破百万
- leetcode:236. The nearest common ancestor of binary tree
- Entropy information entropy cross entropy
- Where does this "judge the operation type according to the op value and assemble SQL by yourself" mean? It means simply using Flink tab
猜你喜欢
Can online reload system software be used safely? Test use experience to share with you
Cloud native (32) | kubernetes introduction to platform storage system
传统企业要为 Web3 和去中心化做的 11 个准备
Résumé des connaissances de gradle
【OFDM通信】基于深度学习的OFDM系统信号检测附matlab代码
11 preparations for Web3 and Decentralization for traditional enterprises
matplotlib画柱状图并添加数值到图中
谁说新消费品牌大溃败?背后有人赢麻了
《数字经济全景白皮书》保险数字化篇 重磅发布
B站大佬用我的世界搞出卷积神经网络,LeCun转发!爆肝6个月,播放破百万
随机推荐
MySQL数据库之JDBC编程
Station B boss used my world to create convolutional neural network, Lecun forwarding! Burst the liver for 6 months, playing more than one million
mysql-cdc 的jar包 ,在flink运行模式下,是不是要放在不同的地方呢?
内网穿透zerotier 外网(手机、电脑等)访问内网设备(树莓派、NAS、电脑等)
设计一个抢红包系统
请问oracle-cdc用JsonDebeziumDeserializationSchema反序列化
Daily question brushing record (XV)
Zero code and high return. How to use 40 sets of templates to meet 95% of the reporting needs in the work
公链与私链在数据隐私和吞吐量上的竞争
氢创未来 产业加速 | 2022氢能专精特新创业大赛报名通道开启!
Wasserstein Slim GAIN with Gradient Penalty(WSGAIN-GP)介绍及代码实现——基于生成对抗网络的缺失数据填补
[communication] optimal power allocation in the uplink of two-layer wireless femtocell network with matlab code
同一个作业有两个source,同一链接不同数据库账号,为何第二个链接查出来的数据库列表是第一个账号的
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
The problem of ASP reading Oracle Database
人均瑞数系列,瑞数 4 代 JS 逆向分析
使用MitmProxy离线缓存360度全景网页
自动更新Selenium驱动chromedriver