Advertisement
leomovskii

GradientLevel

Dec 7th, 2024 (edited)
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.11 KB | None | 0 0
  1. using System.Linq;
  2. using UnityEngine;
  3.  
  4. // Важливо! Розмісти його у батьківському об'єкті до квадратов рівня
  5. // там повинні бути тільки квадрати рівня. Всі інші об'єкти окремо.
  6.  
  7. public class GradientLevel : MonoBehaviour {
  8.  
  9.     // Перерахування для напрямку градієнта: горизонтальний або вертикальний
  10.     public enum Direction2D {
  11.         Horizontal, // Горизонтальний напрямок
  12.         Vertical    // Вертикальний напрямок
  13.     }
  14.  
  15.     // Поле для градієнта, який буде використовуватись
  16.     [SerializeField] private Gradient _gradient;
  17.  
  18.     // Поле для вибору напрямку градієнта
  19.     [SerializeField] private Direction2D _direction;
  20.  
  21. #if UNITY_EDITOR
  22.     // Контекстне меню в редакторі для оновлення кольорів
  23.     [ContextMenu("Refresh")]
  24.     private void OnValidate() {
  25.         // Отримуємо всі спрайт-рендерери у дочірніх об'єктах
  26.         var renderers = GetComponentsInChildren<SpriteRenderer>();
  27.         if (renderers.Length == 0) // Перевіряємо, чи є рендерери
  28.             return;
  29.  
  30.         // Сортуємо рендерери за їх позицією (по осі X або Y, залежно від напрямку)
  31.         var sortedByPosition = renderers.OrderBy(e => _direction == Direction2D.Horizontal ?
  32.             e.transform.position.x : e.transform.position.y).ToList();
  33.  
  34.         // Знаходимо мінімальне значення позиції (початок градієнта)
  35.         float minPosition = _direction == Direction2D.Horizontal
  36.             ? sortedByPosition.First().transform.position.x
  37.             : sortedByPosition.First().transform.position.y;
  38.  
  39.         // Знаходимо максимальне значення позиції (кінець градієнта)
  40.         float maxPosition = _direction == Direction2D.Horizontal
  41.             ? sortedByPosition.Last().transform.position.x
  42.             : sortedByPosition.Last().transform.position.y;
  43.  
  44.         // Призначаємо кольори рендерерам залежно від їхньої позиції
  45.         foreach (var renderer in sortedByPosition) {
  46.             // Визначаємо поточну позицію
  47.             float position = _direction == Direction2D.Horizontal
  48.                 ? renderer.transform.position.x
  49.                 : renderer.transform.position.y;
  50.  
  51.             // Розраховуємо нормалізоване значення від 0 до 1 (відносна позиція в межах градієнта)
  52.             float t = Mathf.InverseLerp(minPosition, maxPosition, position);
  53.  
  54.             // Призначаємо колір з градієнта для поточного значення t
  55.             renderer.color = _gradient.Evaluate(t);
  56.         }
  57.     }
  58. #endif
  59. }
  60.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement