Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Linq;
- using UnityEngine;
- // Важливо! Розмісти його у батьківському об'єкті до квадратов рівня
- // там повинні бути тільки квадрати рівня. Всі інші об'єкти окремо.
- public class GradientLevel : MonoBehaviour {
- // Перерахування для напрямку градієнта: горизонтальний або вертикальний
- public enum Direction2D {
- Horizontal, // Горизонтальний напрямок
- Vertical // Вертикальний напрямок
- }
- // Поле для градієнта, який буде використовуватись
- [SerializeField] private Gradient _gradient;
- // Поле для вибору напрямку градієнта
- [SerializeField] private Direction2D _direction;
- #if UNITY_EDITOR
- // Контекстне меню в редакторі для оновлення кольорів
- [ContextMenu("Refresh")]
- private void OnValidate() {
- // Отримуємо всі спрайт-рендерери у дочірніх об'єктах
- var renderers = GetComponentsInChildren<SpriteRenderer>();
- if (renderers.Length == 0) // Перевіряємо, чи є рендерери
- return;
- // Сортуємо рендерери за їх позицією (по осі X або Y, залежно від напрямку)
- var sortedByPosition = renderers.OrderBy(e => _direction == Direction2D.Horizontal ?
- e.transform.position.x : e.transform.position.y).ToList();
- // Знаходимо мінімальне значення позиції (початок градієнта)
- float minPosition = _direction == Direction2D.Horizontal
- ? sortedByPosition.First().transform.position.x
- : sortedByPosition.First().transform.position.y;
- // Знаходимо максимальне значення позиції (кінець градієнта)
- float maxPosition = _direction == Direction2D.Horizontal
- ? sortedByPosition.Last().transform.position.x
- : sortedByPosition.Last().transform.position.y;
- // Призначаємо кольори рендерерам залежно від їхньої позиції
- foreach (var renderer in sortedByPosition) {
- // Визначаємо поточну позицію
- float position = _direction == Direction2D.Horizontal
- ? renderer.transform.position.x
- : renderer.transform.position.y;
- // Розраховуємо нормалізоване значення від 0 до 1 (відносна позиція в межах градієнта)
- float t = Mathf.InverseLerp(minPosition, maxPosition, position);
- // Призначаємо колір з градієнта для поточного значення t
- renderer.color = _gradient.Evaluate(t);
- }
- }
- #endif
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement