Advertisement
Sharkfists

Untitled

Jul 4th, 2020
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.96 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using TMPro;
  4. using UnityEngine;
  5. using UnityEngine.Tilemaps;
  6. using UnityEngine.UI;
  7.  
  8. public class ColourPaletteSprite : MonoBehaviour
  9. {
  10.     public enum ColourType
  11.     {
  12.         Primary = 0,
  13.         PrimaryAlpha = 7,
  14.         PrimaryBeta = 8,
  15.         PrimaryBright = 11,
  16.         Secondary = 1,
  17.         Tertiary = 2,
  18.         SecondaryAlpha = 3,
  19.         SecondaryBeta = 4,
  20.         SecondaryDark = 9,
  21.         TertiaryAlpha = 5,
  22.         TertiaryBeta = 6,
  23.         TertiaryDark = 10,
  24.         White = 12,
  25.         Black = 13,
  26.     }
  27.     public ColourType Colour;
  28.     private Color CachedColour;
  29.     private static List<ColourPaletteSprite> AllSprites = new List<ColourPaletteSprite>();
  30.     public static Dictionary<ColourType, Color> Colours = new Dictionary<ColourType, Color>();
  31.     public static float ColourHValue;
  32.  
  33.     public static float GeneratePalette()
  34.     {
  35.         float H = (Random.Range(0.1f, 0.9f) + ColourHValue) % 1f; //do something different from last time
  36.  
  37.         SetPalette(H);
  38.  
  39.         return H;
  40.     }
  41.  
  42.     public static void SetPalette(float H)
  43.     {
  44.         //const float Offset = 0.118f;
  45.         //const float SubOffset = 0.02f;
  46.         System.Random rng = new System.Random((int)(H * int.MaxValue));
  47.        
  48.         ColourHValue = H;
  49.  
  50.         Colours[ColourType.Primary] = Color.HSVToRGB(H, 1, 0.3f);
  51.        
  52.         //intensity values are typically in (0.3,0.6) for this method
  53.         float intensity_modifier = (1 - Intensity(Colours[ColourType.Primary])) + 0.6f; //remap to (1.3, 1)
  54.         intensity_modifier = (intensity_modifier - 1) * 2f + 1;
  55.  
  56.         float Offset = (float)rng.Range(0.1, 0.3) * intensity_modifier;
  57.         float SubOffset = (float)rng.Range(0.02, 0.04) * intensity_modifier;
  58.  
  59.         //"bad" range: (0.60, 0.76), specifically ugly blues and purples
  60.         float badMin = 0.58f;
  61.         float badMax = 0.8f;
  62.         float badRange = (badMax - badMin);
  63.         float badMid = badMin + badRange / 2;
  64.  
  65.         float[] checkedValues = new float[] { H, H + Offset, H - Offset };
  66.         if(checkedValues.Any(val => Mathf.Abs(FixRange(val) - badMid) < badRange / 2f))
  67.         {
  68.             GeneratePalette();
  69.             return;
  70.         }
  71.  
  72.         Colours[ColourType.PrimaryAlpha] = Color.HSVToRGB(FixRange(H + SubOffset), 1, 0.3f);
  73.         Colours[ColourType.PrimaryBeta] = Color.HSVToRGB(FixRange(H - SubOffset), 1, 0.3f);
  74.         Colours[ColourType.PrimaryBright] = Color.HSVToRGB(FixRange(H), 1, 1f);
  75.        
  76.         Colours[ColourType.Secondary] = Color.HSVToRGB(FixRange(H + Offset), 1, 1);
  77.         Colours[ColourType.SecondaryAlpha] = Color.HSVToRGB(FixRange(H + Offset + SubOffset), 1, 1);
  78.         Colours[ColourType.SecondaryBeta] = Color.HSVToRGB(FixRange(H + Offset - SubOffset), 1, 1);
  79.         Colours[ColourType.SecondaryDark] = Color.HSVToRGB(FixRange(H + Offset), 0.7f, 0.45f);
  80.         Colours[ColourType.Tertiary] = Color.HSVToRGB(FixRange(H - Offset), 1, 1);
  81.         Colours[ColourType.TertiaryAlpha] = Color.HSVToRGB(FixRange(H - Offset + SubOffset), 1, 1);
  82.         Colours[ColourType.TertiaryBeta] = Color.HSVToRGB(FixRange(H - Offset - SubOffset), 1, 1);
  83.         Colours[ColourType.TertiaryDark] = Color.HSVToRGB(FixRange(H - Offset), 0.7f, 0.45f);
  84.         Colours[ColourType.White] = Color.white;
  85.         Colours[ColourType.Black] = Color.black;
  86.  
  87.         //swap secondary and tertiary sometimes
  88.         if (rng.NextDouble() < 0.5)
  89.         {
  90.             Swap(ColourType.Secondary, ColourType.Tertiary);
  91.             Swap(ColourType.SecondaryAlpha, ColourType.TertiaryAlpha);
  92.             Swap(ColourType.SecondaryBeta, ColourType.TertiaryBeta);
  93.             Swap(ColourType.SecondaryDark, ColourType.TertiaryDark);
  94.         }
  95.  
  96.         CommitChanges();
  97.         FancyQualitySettings.SaveSettings();
  98.     }
  99.  
  100.     private static float Intensity(Color colour)
  101.     {
  102.         return .3f * colour.a + .59f * colour.g + .11f * colour.b;
  103.     }
  104.    
  105.     //make sure num is in range (0, 1)
  106.     private static float FixRange(float val)
  107.     {
  108.         while (val < 0 || val > 1)
  109.         {
  110.             if (val < 0)
  111.             {
  112.                 val += 1;
  113.             }
  114.             if (val > 1)
  115.             {
  116.                 val -= 1;
  117.             }
  118.         }
  119.         return val;
  120.     }
  121.  
  122.     private static void Swap(ColourType a, ColourType b)
  123.     {
  124.         Color colour = Colours[a];
  125.         Colours[a] = Colours[b];
  126.         Colours[b] = colour;
  127.     }
  128.  
  129.     public static void CommitChanges()
  130.     {
  131.         AllSprites.ForEach(item => item.UpdateColour());
  132.     }
  133.  
  134.     private void OnEnable()
  135.     {
  136.         AllSprites.Add(this);
  137.         UpdateColour();
  138.     }
  139.  
  140.     private void OnDisable()
  141.     {
  142.         AllSprites.Remove(this);
  143.     }
  144.  
  145.     private void UpdateColour()
  146.     {
  147.         if (Colours.ContainsKey(Colour))
  148.         {
  149.             Color colourVal = Colours[Colour];
  150.             SpriteRenderer renderer = GetComponent<SpriteRenderer>();
  151.             if (renderer != null)
  152.             {
  153.                 renderer.color = colourVal.SetAlpha(renderer.color.a);
  154.             }
  155.             TMP_Text text = GetComponent<TMP_Text>();
  156.             if (text != null)
  157.             {
  158.                 text.color = colourVal.SetAlpha(text.color.a);
  159.             }
  160.             ParticleSystem particles = GetComponent<ParticleSystem>();
  161.             if (particles)
  162.             {
  163.                 Renderer particlerenderer = particles.GetComponent<Renderer>();
  164.                 particlerenderer.material.color = colourVal.SetAlpha(particlerenderer.material.color.a);
  165.             }
  166.             Image image = GetComponent<Image>();
  167.             if (image != null)
  168.             {
  169.                 image.color = colourVal.SetAlpha(image.color.a);
  170.             }
  171.             TrailRenderer trail = GetComponent<TrailRenderer>();
  172.             if (trail != null)
  173.             {
  174.                 trail.startColor = colourVal.SetAlpha(trail.startColor.a);
  175.                 trail.endColor = colourVal.SetAlpha(trail.endColor.a);
  176.             }
  177.             Tilemap tilemap = GetComponent<Tilemap>();
  178.             if (tilemap != null)
  179.             {
  180.                 tilemap.color = colourVal.SetAlpha(tilemap.color.a);
  181.             }
  182.             if (TryGetComponent(out LineRenderer line))
  183.             {
  184.                 line.startColor = line.endColor = colourVal.SetAlpha(line.startColor.a);
  185.             }
  186.             CachedColour = colourVal;
  187.         }
  188.     }
  189.  
  190.     private void Update()
  191.     {
  192.         if (Colours.Count == 0)
  193.         {
  194.             GeneratePalette();
  195.         }
  196.         if (Colours.TryGetValue(Colour, out Color retrievedVal) == false || retrievedVal != CachedColour)
  197.         {
  198.             UpdateColour();
  199.         }
  200.     }
  201.  
  202. #if UNITY_EDITOR
  203.     [UnityEditor.MenuItem("Fancy/Override Palette")]
  204.     private static void OverridePalette()
  205.     {
  206.         if (Application.isPlaying == false)
  207.         {
  208.             return;
  209.         }
  210.  
  211.         ColorUtility.TryParseHtmlString("#1c004c", out Color colour);
  212.         Colours[ColourType.Primary] = colour;
  213.         ColorUtility.TryParseHtmlString("#2a004c", out colour);
  214.         Colours[ColourType.PrimaryAlpha] = colour;
  215.         ColorUtility.TryParseHtmlString("#0d004c", out colour);
  216.         Colours[ColourType.PrimaryBeta] = colour;
  217.         ColorUtility.TryParseHtmlString("#ff005a", out colour);
  218.         Colours[ColourType.Secondary] = colour;
  219.         ColorUtility.TryParseHtmlString("#ff002a", out colour);
  220.         Colours[ColourType.SecondaryAlpha] = colour;
  221.         ColorUtility.TryParseHtmlString("#ff008a", out colour);
  222.         Colours[ColourType.SecondaryBeta] = colour;
  223.         ColorUtility.TryParseHtmlString("#80193d", out colour);
  224.         Colours[ColourType.SecondaryDark] = colour;
  225.         ColorUtility.TryParseHtmlString("#00ecff", out colour);
  226.         Colours[ColourType.Tertiary] = colour;
  227.         ColorUtility.TryParseHtmlString("#00bcff", out colour);
  228.         Colours[ColourType.TertiaryAlpha] = colour;
  229.         ColorUtility.TryParseHtmlString("#00ffe2", out colour);
  230.         Colours[ColourType.TertiaryBeta] = colour;
  231.         ColorUtility.TryParseHtmlString("#197890", out colour);
  232.         Colours[ColourType.TertiaryDark] = colour;
  233.  
  234.         CommitChanges();
  235.     }
  236. #endif
  237. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement