Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections.Generic;
- using System.Linq;
- using TMPro;
- using UnityEngine;
- using UnityEngine.Tilemaps;
- using UnityEngine.UI;
- public class ColourPaletteSprite : MonoBehaviour
- {
- public enum ColourType
- {
- Primary = 0,
- PrimaryAlpha = 7,
- PrimaryBeta = 8,
- PrimaryBright = 11,
- Secondary = 1,
- Tertiary = 2,
- SecondaryAlpha = 3,
- SecondaryBeta = 4,
- SecondaryDark = 9,
- TertiaryAlpha = 5,
- TertiaryBeta = 6,
- TertiaryDark = 10,
- White = 12,
- Black = 13,
- }
- public ColourType Colour;
- private Color CachedColour;
- private static List<ColourPaletteSprite> AllSprites = new List<ColourPaletteSprite>();
- public static Dictionary<ColourType, Color> Colours = new Dictionary<ColourType, Color>();
- public static float ColourHValue;
- public static float GeneratePalette()
- {
- float H = (Random.Range(0.1f, 0.9f) + ColourHValue) % 1f; //do something different from last time
- SetPalette(H);
- return H;
- }
- public static void SetPalette(float H)
- {
- //const float Offset = 0.118f;
- //const float SubOffset = 0.02f;
- System.Random rng = new System.Random((int)(H * int.MaxValue));
- ColourHValue = H;
- Colours[ColourType.Primary] = Color.HSVToRGB(H, 1, 0.3f);
- //intensity values are typically in (0.3,0.6) for this method
- float intensity_modifier = (1 - Intensity(Colours[ColourType.Primary])) + 0.6f; //remap to (1.3, 1)
- intensity_modifier = (intensity_modifier - 1) * 2f + 1;
- float Offset = (float)rng.Range(0.1, 0.3) * intensity_modifier;
- float SubOffset = (float)rng.Range(0.02, 0.04) * intensity_modifier;
- //"bad" range: (0.60, 0.76), specifically ugly blues and purples
- float badMin = 0.58f;
- float badMax = 0.8f;
- float badRange = (badMax - badMin);
- float badMid = badMin + badRange / 2;
- float[] checkedValues = new float[] { H, H + Offset, H - Offset };
- if(checkedValues.Any(val => Mathf.Abs(FixRange(val) - badMid) < badRange / 2f))
- {
- GeneratePalette();
- return;
- }
- Colours[ColourType.PrimaryAlpha] = Color.HSVToRGB(FixRange(H + SubOffset), 1, 0.3f);
- Colours[ColourType.PrimaryBeta] = Color.HSVToRGB(FixRange(H - SubOffset), 1, 0.3f);
- Colours[ColourType.PrimaryBright] = Color.HSVToRGB(FixRange(H), 1, 1f);
- Colours[ColourType.Secondary] = Color.HSVToRGB(FixRange(H + Offset), 1, 1);
- Colours[ColourType.SecondaryAlpha] = Color.HSVToRGB(FixRange(H + Offset + SubOffset), 1, 1);
- Colours[ColourType.SecondaryBeta] = Color.HSVToRGB(FixRange(H + Offset - SubOffset), 1, 1);
- Colours[ColourType.SecondaryDark] = Color.HSVToRGB(FixRange(H + Offset), 0.7f, 0.45f);
- Colours[ColourType.Tertiary] = Color.HSVToRGB(FixRange(H - Offset), 1, 1);
- Colours[ColourType.TertiaryAlpha] = Color.HSVToRGB(FixRange(H - Offset + SubOffset), 1, 1);
- Colours[ColourType.TertiaryBeta] = Color.HSVToRGB(FixRange(H - Offset - SubOffset), 1, 1);
- Colours[ColourType.TertiaryDark] = Color.HSVToRGB(FixRange(H - Offset), 0.7f, 0.45f);
- Colours[ColourType.White] = Color.white;
- Colours[ColourType.Black] = Color.black;
- //swap secondary and tertiary sometimes
- if (rng.NextDouble() < 0.5)
- {
- Swap(ColourType.Secondary, ColourType.Tertiary);
- Swap(ColourType.SecondaryAlpha, ColourType.TertiaryAlpha);
- Swap(ColourType.SecondaryBeta, ColourType.TertiaryBeta);
- Swap(ColourType.SecondaryDark, ColourType.TertiaryDark);
- }
- CommitChanges();
- FancyQualitySettings.SaveSettings();
- }
- private static float Intensity(Color colour)
- {
- return .3f * colour.a + .59f * colour.g + .11f * colour.b;
- }
- //make sure num is in range (0, 1)
- private static float FixRange(float val)
- {
- while (val < 0 || val > 1)
- {
- if (val < 0)
- {
- val += 1;
- }
- if (val > 1)
- {
- val -= 1;
- }
- }
- return val;
- }
- private static void Swap(ColourType a, ColourType b)
- {
- Color colour = Colours[a];
- Colours[a] = Colours[b];
- Colours[b] = colour;
- }
- public static void CommitChanges()
- {
- AllSprites.ForEach(item => item.UpdateColour());
- }
- private void OnEnable()
- {
- AllSprites.Add(this);
- UpdateColour();
- }
- private void OnDisable()
- {
- AllSprites.Remove(this);
- }
- private void UpdateColour()
- {
- if (Colours.ContainsKey(Colour))
- {
- Color colourVal = Colours[Colour];
- SpriteRenderer renderer = GetComponent<SpriteRenderer>();
- if (renderer != null)
- {
- renderer.color = colourVal.SetAlpha(renderer.color.a);
- }
- TMP_Text text = GetComponent<TMP_Text>();
- if (text != null)
- {
- text.color = colourVal.SetAlpha(text.color.a);
- }
- ParticleSystem particles = GetComponent<ParticleSystem>();
- if (particles)
- {
- Renderer particlerenderer = particles.GetComponent<Renderer>();
- particlerenderer.material.color = colourVal.SetAlpha(particlerenderer.material.color.a);
- }
- Image image = GetComponent<Image>();
- if (image != null)
- {
- image.color = colourVal.SetAlpha(image.color.a);
- }
- TrailRenderer trail = GetComponent<TrailRenderer>();
- if (trail != null)
- {
- trail.startColor = colourVal.SetAlpha(trail.startColor.a);
- trail.endColor = colourVal.SetAlpha(trail.endColor.a);
- }
- Tilemap tilemap = GetComponent<Tilemap>();
- if (tilemap != null)
- {
- tilemap.color = colourVal.SetAlpha(tilemap.color.a);
- }
- if (TryGetComponent(out LineRenderer line))
- {
- line.startColor = line.endColor = colourVal.SetAlpha(line.startColor.a);
- }
- CachedColour = colourVal;
- }
- }
- private void Update()
- {
- if (Colours.Count == 0)
- {
- GeneratePalette();
- }
- if (Colours.TryGetValue(Colour, out Color retrievedVal) == false || retrievedVal != CachedColour)
- {
- UpdateColour();
- }
- }
- #if UNITY_EDITOR
- [UnityEditor.MenuItem("Fancy/Override Palette")]
- private static void OverridePalette()
- {
- if (Application.isPlaying == false)
- {
- return;
- }
- ColorUtility.TryParseHtmlString("#1c004c", out Color colour);
- Colours[ColourType.Primary] = colour;
- ColorUtility.TryParseHtmlString("#2a004c", out colour);
- Colours[ColourType.PrimaryAlpha] = colour;
- ColorUtility.TryParseHtmlString("#0d004c", out colour);
- Colours[ColourType.PrimaryBeta] = colour;
- ColorUtility.TryParseHtmlString("#ff005a", out colour);
- Colours[ColourType.Secondary] = colour;
- ColorUtility.TryParseHtmlString("#ff002a", out colour);
- Colours[ColourType.SecondaryAlpha] = colour;
- ColorUtility.TryParseHtmlString("#ff008a", out colour);
- Colours[ColourType.SecondaryBeta] = colour;
- ColorUtility.TryParseHtmlString("#80193d", out colour);
- Colours[ColourType.SecondaryDark] = colour;
- ColorUtility.TryParseHtmlString("#00ecff", out colour);
- Colours[ColourType.Tertiary] = colour;
- ColorUtility.TryParseHtmlString("#00bcff", out colour);
- Colours[ColourType.TertiaryAlpha] = colour;
- ColorUtility.TryParseHtmlString("#00ffe2", out colour);
- Colours[ColourType.TertiaryBeta] = colour;
- ColorUtility.TryParseHtmlString("#197890", out colour);
- Colours[ColourType.TertiaryDark] = colour;
- CommitChanges();
- }
- #endif
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement