Advertisement
Guest User

Untitled

a guest
May 13th, 2022
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.56 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5.  
  6. [RequireComponent(typeof(LineRenderer))]
  7. public class LineRendererColors : MonoBehaviour
  8. {
  9. public enum AnimationType { None, SingleColorMorph, MultiColorMorph, Shuffle, Shift };
  10. LineRenderer myLineRenderer;
  11. Coroutine _animationInProgress;
  12. public float morphTime;
  13.  
  14. [SerializeField]
  15. AnimationType _animationType;
  16.  
  17. #if UNITY_EDITOR
  18. AnimationType _cachedAnimationType;
  19. void OnValidate()
  20. {
  21. if (_animationType != _cachedAnimationType)
  22. {
  23. if (_animationInProgress == null)
  24. _cachedAnimationType = _animationType;
  25. else
  26. StartAnimation(_animationType);
  27. }
  28. }
  29. #endif
  30.  
  31. void StartAnimation(AnimationType animType)
  32. {
  33. _animationType = animType;
  34. #if UNITY_EDITOR
  35. _cachedAnimationType = animType;
  36. #endif
  37.  
  38. if (_animationInProgress != null)
  39. StopCoroutine(_animationInProgress);
  40.  
  41. _animationInProgress = StartCoroutine(SelectAnimation(animType));
  42. }
  43.  
  44. IEnumerator SelectAnimation(AnimationType animType)
  45. {
  46. switch (animType)
  47. {
  48. case AnimationType.SingleColorMorph:
  49. return RandomSingleColorMorphing(myLineRenderer, morphTime);
  50. case AnimationType.MultiColorMorph:
  51. return RandomMultiColorMorphing(myLineRenderer, morphTime);
  52. case AnimationType.Shuffle:
  53. return ShuffleGradient(myLineRenderer, .5f);
  54. case AnimationType.Shift:
  55. return AnimateLoop(myLineRenderer);
  56. default:
  57. return null;
  58. }
  59. }
  60.  
  61. private void ggg()
  62. {
  63.  
  64. }
  65.  
  66. void Start()
  67. {
  68. myLineRenderer = GetComponent<LineRenderer>();
  69. StartAnimation(_animationType);
  70. }
  71.  
  72. void SetSingleColor(LineRenderer lineRendererToChange, Color newColor)
  73. {
  74. lineRendererToChange.startColor = newColor;
  75. lineRendererToChange.endColor = newColor;
  76. }
  77.  
  78. void SetSingleColor2(LineRenderer lineRendererToChange, Color newColor)
  79. {
  80. Gradient tempGradient = new Gradient();
  81.  
  82. GradientColorKey[] tempColorKeys = new GradientColorKey[2];
  83. tempColorKeys[0] = new GradientColorKey(newColor, 0);
  84. tempColorKeys[1] = new GradientColorKey(newColor, 1);
  85.  
  86. tempGradient.colorKeys = tempColorKeys;
  87.  
  88. lineRendererToChange.colorGradient = tempGradient;
  89. }
  90.  
  91. void SetSingleColor3(LineRenderer lineRendererToChange, Color newColor)
  92. {
  93. Gradient tempGradient = lineRendererToChange.colorGradient;
  94.  
  95. GradientColorKey[] tempColorKeys = tempGradient.colorKeys;
  96. for (int i = 0; i < tempColorKeys.Length; i++)
  97. {
  98. tempColorKeys[i].color = newColor;
  99. }
  100.  
  101. tempGradient.colorKeys = tempColorKeys;
  102.  
  103. lineRendererToChange.colorGradient = tempGradient;
  104. }
  105.  
  106. IEnumerator ShuffleGradient(LineRenderer targetLineRenderer, float waitTime)
  107. {
  108. while (true)
  109. {
  110. ShuffleGradient(targetLineRenderer);
  111. yield return new WaitForSeconds(waitTime);
  112. }
  113. }
  114.  
  115. void ShuffleGradient(LineRenderer targetLineRenderer)
  116. {
  117. GradientColorKey[] newColorKeys = targetLineRenderer.colorGradient.colorKeys;
  118. for (int i = 0; i < newColorKeys.Length; i++)
  119. {
  120. Color tempColor = newColorKeys[i].color;
  121. int randomIndex = Random.Range(0, newColorKeys.Length - 1);
  122. newColorKeys[i].color = newColorKeys[randomIndex].color;
  123. newColorKeys[randomIndex].color = tempColor;
  124. }
  125. Gradient tempGradient = targetLineRenderer.colorGradient;
  126. tempGradient.colorKeys = newColorKeys;
  127. targetLineRenderer.colorGradient = tempGradient;
  128. }
  129.  
  130.  
  131. IEnumerator RandomMultiColorMorphing(LineRenderer lineRendererToChange, float timeToMorph)
  132. {
  133. float time = 0;
  134.  
  135. while (true)
  136. {
  137. GradientColorKey[] initialColorKeys = lineRendererToChange.colorGradient.colorKeys;
  138. GradientColorKey[] newColorKeys = GenerateRandomColorKeys(initialColorKeys);
  139. time = 0;
  140. while (time < timeToMorph)
  141. {
  142. time += Time.deltaTime;
  143. float progress = time / timeToMorph;
  144. GradientColorKey[] currentColorKeys = GradientColorKeyLerp(initialColorKeys, newColorKeys, progress);
  145. Gradient tempGradient = lineRendererToChange.colorGradient;
  146. tempGradient.colorKeys = currentColorKeys;
  147. lineRendererToChange.colorGradient = tempGradient;
  148. yield return null;
  149. }
  150. yield return null;
  151. }
  152. }
  153.  
  154. GradientColorKey[] GradientColorKeyLerp(GradientColorKey[] initialColorKeys, GradientColorKey[] endColorKeys, float progress)
  155. {
  156. GradientColorKey[] newColorKeys = new GradientColorKey[initialColorKeys.Length];
  157. for (int i = 0; i < newColorKeys.Length; i++)
  158. {
  159. newColorKeys[i].color = Color.Lerp(initialColorKeys[i].color, endColorKeys[i].color, progress);
  160. newColorKeys[i].time = initialColorKeys[i].time;
  161. }
  162. return newColorKeys;
  163. }
  164.  
  165. //assigns new color to each colorkey and uses Time from incomingColorKeys
  166. GradientColorKey[] GenerateRandomColorKeys(GradientColorKey[] incomingColorKeys)
  167. {
  168. GradientColorKey[] newColorKeys = new GradientColorKey[incomingColorKeys.Length];
  169. for (int i = 0; i < newColorKeys.Length; i++)
  170. {
  171. newColorKeys[i].color = RandomColor();
  172. newColorKeys[i].time = incomingColorKeys[i].time;
  173. }
  174. return newColorKeys;
  175. }
  176.  
  177. //asumes Single color, 2 colorkeys
  178. IEnumerator RandomSingleColorMorphing(LineRenderer lineRendererToChange, float timeToMorph)
  179. {
  180. float time = 0;
  181. Color initialColor = lineRendererToChange.colorGradient.colorKeys[0].color;
  182. //this reduces colorkey amount to 2 just in case.
  183. SetSingleColor2(lineRendererToChange, initialColor);
  184.  
  185. while (true)
  186. {
  187. initialColor = lineRendererToChange.colorGradient.colorKeys[0].color;
  188. Color targetColor = RandomColor();
  189. time = 0;
  190. while (time < timeToMorph)
  191. {
  192. time += Time.deltaTime;
  193. float progress = time / timeToMorph;
  194. Color currentColor = Color.Lerp(initialColor, targetColor, progress);
  195. SetSingleColor(lineRendererToChange, currentColor);
  196. yield return null;
  197. }
  198. yield return null;
  199. }
  200. }
  201.  
  202. //Basically Color.Lerp?
  203. Color ColorLerpMath(Color firstColor, Color secondColor, float progress)
  204. {
  205. Vector3 firstRGB = new Vector3(firstColor.r, firstColor.g, firstColor.b);
  206. Vector3 secondRGB = new Vector3(secondColor.r, secondColor.g, secondColor.b);
  207. Vector3 difference = secondRGB - firstRGB;
  208. Vector3 lerpedRGB = firstRGB + (progress * difference);
  209. return new Color(lerpedRGB.x, lerpedRGB.y, lerpedRGB.z);
  210. }
  211.  
  212. Color RandomColor()
  213. {
  214. return new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f));
  215. }
  216.  
  217. //returns the gradient with a copy of the first key for intersection purposes.
  218. Gradient AddInitialCopy(Gradient incomingGradient)
  219. {
  220. List<GradientColorKey> newColorKeys = new List<GradientColorKey>(incomingGradient.colorKeys);
  221. Color interSectionColor = newColorKeys[0].color;
  222. newColorKeys.Insert(0, new GradientColorKey(interSectionColor, 0));
  223. Gradient newInitGradient = new Gradient();
  224. newInitGradient.colorKeys = newColorKeys.ToArray();
  225. return newInitGradient;
  226. }
  227.  
  228. //remove first and last keys since they dont shift.
  229. List<GradientColorKey> RemoveFirstAndLast(Gradient incomingGradient)
  230. {
  231. List<GradientColorKey> currentColorKeys = new List<GradientColorKey>(incomingGradient.colorKeys);
  232. currentColorKeys.RemoveAt(currentColorKeys.Count - 1);
  233. currentColorKeys.RemoveAt(0);
  234. return currentColorKeys;
  235. }
  236.  
  237. Color GetIntersectionColor(List<GradientColorKey> incomingKeys, int lowestIndex, int highestIndex)
  238. {
  239. Color firstColor = incomingKeys[lowestIndex].color;
  240. Color lastColor = incomingKeys[highestIndex].color;
  241. float distance = 1 - (incomingKeys[highestIndex].time - incomingKeys[lowestIndex].time);
  242. float colorLerpAmount = (1f - incomingKeys[highestIndex].time) / distance; ;
  243. Color newIntersectionColor = Color.Lerp(lastColor, firstColor, colorLerpAmount);
  244. return newIntersectionColor;
  245. }
  246.  
  247. //accepts max 7 colors, 1st and last should be at 0 and 1
  248. IEnumerator AnimateLoop(LineRenderer lineRendererToChange, float movementPerTick = .001f)
  249. {
  250. lineRendererToChange.colorGradient = AddInitialCopy(lineRendererToChange.colorGradient);
  251.  
  252. while (true)
  253. {
  254. List<GradientColorKey> currentColorKeys = RemoveFirstAndLast(lineRendererToChange.colorGradient);
  255. float highestTime = 0;
  256. float lowestTime = 1;
  257. int highestIndex = currentColorKeys.Count - 1;
  258. int lowestIndex = 0;
  259. //Move all inner ones.
  260. for (int i = 0; i < currentColorKeys.Count; i++)
  261. {
  262. GradientColorKey tempColorKey = currentColorKeys[i];
  263. float newTime = tempColorKey.time + movementPerTick;
  264.  
  265. if (newTime > 1)
  266. {
  267. newTime = newTime - 1;
  268. }
  269. tempColorKey.time = newTime;
  270. currentColorKeys[i] = tempColorKey;
  271. if (newTime < lowestTime)
  272. {
  273. lowestTime = newTime;
  274. lowestIndex = i;
  275. }
  276. if (newTime > highestTime)
  277. {
  278. highestTime = newTime;
  279. highestIndex = i;
  280. }
  281. }
  282. Color newIntersectionColor = GetIntersectionColor(currentColorKeys, lowestIndex, highestIndex);
  283. currentColorKeys.Insert(0, new GradientColorKey(newIntersectionColor, 0));
  284. currentColorKeys.Add(new GradientColorKey(newIntersectionColor, 1));
  285. Gradient tempGradient = lineRendererToChange.colorGradient;
  286. tempGradient.colorKeys = currentColorKeys.ToArray();
  287. lineRendererToChange.colorGradient = tempGradient;
  288. yield return null;
  289. }
  290. }
  291.  
  292. void AssignGradient(LineRenderer targetLineRenderer, Gradient newGradient)
  293. {
  294. targetLineRenderer.colorGradient = newGradient;
  295. }
  296.  
  297. void DrawTestLine()
  298. {
  299. Vector3 firstPos = new Vector3(-5, 0, 0);
  300. Vector3 secondPos = new Vector3(5, 0, 0);
  301. int resolution = 100;
  302. myLineRenderer.positionCount = resolution;
  303. myLineRenderer.SetPositions(MakeLine(firstPos, secondPos, 100));
  304. }
  305.  
  306. //makes a line from point A to point B with resolution of size points
  307. Vector3[] MakeLine(Vector3 initPos, Vector3 endPos, int points)
  308. {
  309. Vector3 difference = endPos - initPos;
  310. Vector3[] newLine = new Vector3[points];
  311. Vector3 differencePerPoint = difference / (float)(points - 1);
  312. for (int i = 0; i < points; i++)
  313. {
  314. newLine[i] = initPos + (differencePerPoint * i);
  315. }
  316. return newLine;
  317. }
  318. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement