Рубрики
Unity.LIB

Unity&С# «Цветовой Редактор»

using UnityEngine;
using UnityEditor;
namespace LIB.cs2307211400
{
    public interface IClass
    {
        void ПоказатьТестовыйЦвет();
    }
    /// <summary>
    /// Редактируемый цвет
    /// </summary>
    public class Class : IClass
    {
        public Class()
        {
            СозданиеТекстуры();
        }
        #region Static
        static private readonly GUILayoutOption[] w = new GUILayoutOption[] { GUILayout.Width(20) };
        static private readonly Color[] МассивЦветов = new Color[] {
            Color.black,
            Color.gray,
            Color.green,
            Color.blue,
            Color.cyan,
            Color.yellow,
            Color.magenta,
            Color.red,
            new Color32(165, 130, 82, 255),//коричневый
            new Color(0.85f, 0.7f, 0.4f),//коричневый
        };
        #endregion
        #region Текстура
        static private byte РазмерТекстуры2 = 16;
        private Texture2D texture2d;
        private Vector2Int КоординатаЦвета = Vector2Int.zero;
        public void СозданиеТекстуры()
        {
            texture2d = new Texture2D(РазмерТекстуры2, РазмерТекстуры2, TextureFormat.RGB24, false);
            texture2d.wrapMode = TextureWrapMode.Repeat;
            texture2d.filterMode = FilterMode.Point;
        }
        public void ОбновитьПиксельТекстуры()=> texture2d.SetPixel(КоординатаЦвета.x, КоординатаЦвета.y, Цвет);
        public void ВыборПикселя()
        {
            for (var y = texture2d.height - 1; y >= 0; y--)
            {
                GUILayout.BeginHorizontal(w);
                for (var x = 0; x < texture2d.width; x++)
                {
                    var Этот = x == КоординатаЦвета.x && y == КоординатаЦвета.y;
                    GUI.color = texture2d.GetPixel(x, y);
                    if (GUILayout.Button("", new GUILayoutOption[] { GUILayout.Width(Этот ? 15 : 20), GUILayout.Height(Этот ? 15 : 20) }))
                    {
                        КоординатаЦвета = new Vector2Int(x, y);
                        if (!Event.current.control) 
                            Цвет = GUI.color;
                        else ОбновитьПиксельТекстуры();
                    }
                    GUI.color = Color.white;
                }
                GUILayout.EndHorizontal();
            }
        }
        public void ФормаВыборПикселя()
        {
            GUILayout.BeginVertical(new GUILayoutOption[] { GUILayout.Height(200) });
            ВыборПикселя();
            GUILayout.EndVertical();
        }
        #endregion
        #region Color
        private Color Цвет = Color.white;
        public void ПоказатьТестовыйЦвет()
        {
            ФормаВыборПикселя();
            GUILayout.BeginHorizontal();
            ВыборЦвета();
            Цвет = EditorGUILayout.ColorField(Цвет);
            ВыборЯркостиЦвета();
            GUILayout.EndHorizontal();
        }
        public void ВыборЦвета()
        {
            foreach (var c in МассивЦветов)
                ВыбратьЯркостьЦвета(c);
            GUI.color = Color.white; ;
        } 
        #endregion
        #region Яркость
        int bright = 0;
        public void ВыборЯркостиЦвета()
        {
            var new_bright = EditorGUILayout.IntSlider(bright, 0, byte.MaxValue);
            if (new_bright != bright)
            {
                bright = new_bright;
                Яркость();
            }
        }
        public void ВыбратьЯркостьЦвета(Color new_color)
        {
            GUI.color = new_color;
            if (GUILayout.Button("", w))
            {
                Цвет = new_color;
                ОбновитьПиксельТекстуры();
                ОбновитьЯркостьЦвета();
            }
        }
        public void ОбновитьЯркостьЦвета()
        {
            float h = 0;
            float s = 0;
            float v = 0;
            Color.RGBToHSV(Цвет, out h, out s, out v);
            bright = (int)(v * 255.0f);
        }
        public bool Яркость()
        {
            float h = 0;
            float s = 0;
            float v = 0;

            Color.RGBToHSV(Цвет, out h, out s, out v);
            v = bright / 255.0f;

            Цвет = Color.HSVToRGB(h, s, v);
            ОбновитьПиксельТекстуры();
            return true;
        } 
        #endregion
    }
}