Tanoda
HSVPicker/UI/ColorSliderImage.cs
Go to the documentation of this file.
1using System;
2using UnityEngine;
3using UnityEngine.UI;
4
5[RequireComponent(typeof(RawImage))]
6[ExecuteInEditMode]
7public class ColorSliderImage : MonoBehaviour
8{
10
15
16 public Slider.Direction direction;
17
18 private RawImage image;
19
20 private RectTransform rectTransform => transform as RectTransform;
21
22 private void Awake()
23 {
24 image = GetComponent<RawImage>();
25
26 if (Application.isPlaying)
27 RegenerateTexture();
28 }
29
30 private void OnEnable()
31 {
32 if (picker != null && Application.isPlaying)
33 {
34 picker.onValueChanged.AddListener(ColorChanged);
35 picker.onHSVChanged.AddListener(HSVChanged);
36 }
37 }
38
39 private void OnDisable()
40 {
41 if (picker != null)
42 {
43 picker.onValueChanged.RemoveListener(ColorChanged);
44 picker.onHSVChanged.RemoveListener(HSVChanged);
45 }
46 }
47
48 private void OnDestroy()
49 {
50 if (image.texture != null)
51 DestroyImmediate(image.texture);
52 }
53
54 private void ColorChanged(Color newColor)
55 {
56 switch (type)
57 {
58 case ColorValues.R:
59 case ColorValues.G:
60 case ColorValues.B:
61 case ColorValues.Saturation:
62 case ColorValues.Value:
63 RegenerateTexture();
64 break;
65 case ColorValues.A:
66 case ColorValues.Hue:
67 default:
68 break;
69 }
70 }
71
72 private void HSVChanged(float hue, float saturation, float value)
73 {
74 switch (type)
75 {
76 case ColorValues.R:
77 case ColorValues.G:
78 case ColorValues.B:
79 case ColorValues.Saturation:
80 case ColorValues.Value:
81 RegenerateTexture();
82 break;
83 case ColorValues.A:
84 case ColorValues.Hue:
85 default:
86 break;
87 }
88 }
89
90 private void RegenerateTexture()
91 {
92 Color32 baseColor = picker != null ? picker.CurrentColor : Color.black;
93
94 var h = picker != null ? picker.H : 0;
95 var s = picker != null ? picker.S : 0;
96 var v = picker != null ? picker.V : 0;
97
98 Texture2D texture;
99 Color32[] colors;
100
101 var vertical = direction == Slider.Direction.BottomToTop || direction == Slider.Direction.TopToBottom;
102 var inverted = direction == Slider.Direction.TopToBottom || direction == Slider.Direction.RightToLeft;
103
104 int size;
105 switch (type)
106 {
107 case ColorValues.R:
108 case ColorValues.G:
109 case ColorValues.B:
110 case ColorValues.A:
111 size = 255;
112 break;
113 case ColorValues.Hue:
114 size = 360;
115 break;
116 case ColorValues.Saturation:
117 case ColorValues.Value:
118 size = 100;
119 break;
120 default:
121 throw new NotImplementedException("");
122 }
123
124 if (vertical)
125 texture = new Texture2D(1, size);
126 else
127 texture = new Texture2D(size, 1);
128
129 texture.hideFlags = HideFlags.DontSave;
130 colors = new Color32[size];
131
132 switch (type)
133 {
134 case ColorValues.R:
135 for (byte i = 0; i < size; i++)
136 colors[inverted ? size - 1 - i : i] = new Color32(i, baseColor.g, baseColor.b, 255);
137 break;
138 case ColorValues.G:
139 for (byte i = 0; i < size; i++)
140 colors[inverted ? size - 1 - i : i] = new Color32(baseColor.r, i, baseColor.b, 255);
141 break;
142 case ColorValues.B:
143 for (byte i = 0; i < size; i++)
144 colors[inverted ? size - 1 - i : i] = new Color32(baseColor.r, baseColor.g, i, 255);
145 break;
146 case ColorValues.A:
147 for (byte i = 0; i < size; i++) colors[inverted ? size - 1 - i : i] = new Color32(i, i, i, 255);
148 break;
149 case ColorValues.Hue:
150 for (var i = 0; i < size; i++)
151 colors[inverted ? size - 1 - i : i] = HSVUtil.ConvertHsvToRgb(i, 1, 1, 1);
152 break;
153 case ColorValues.Saturation:
154 for (var i = 0; i < size; i++)
155 colors[inverted ? size - 1 - i : i] = HSVUtil.ConvertHsvToRgb(h * 360, (float) i / size, v, 1);
156 break;
157 case ColorValues.Value:
158 for (var i = 0; i < size; i++)
159 colors[inverted ? size - 1 - i : i] = HSVUtil.ConvertHsvToRgb(h * 360, s, (float) i / size, 1);
160 break;
161 default:
162 throw new NotImplementedException("");
163 }
164
165 texture.SetPixels32(colors);
166 texture.Apply();
167
168 if (image.texture != null)
169 DestroyImmediate(image.texture);
170 image.texture = texture;
171
172 switch (direction)
173 {
174 case Slider.Direction.BottomToTop:
175 case Slider.Direction.TopToBottom:
176 image.uvRect = new Rect(0, 0, 2, 1);
177 break;
178 case Slider.Direction.LeftToRight:
179 case Slider.Direction.RightToLeft:
180 image.uvRect = new Rect(0, 0, 1, 2);
181 break;
182 default:
183 break;
184 }
185 }
186}
UnityEngine.Color Color
Definition: TestScript.cs:32
ColorChangedEvent onValueChanged
Definition: ColorPicker.cs:19
Color CurrentColor
Definition: ColorPicker.cs:23
HSVChangedEvent onHSVChanged
Definition: ColorPicker.cs:20
ColorValues type
Which value this slider can edit.