using UnityEngine; using System.Collections.Generic; using System.Linq; public class UI_MailPlaceholder : MonoBehaviour { // Вспомогательная структура для инспектора [System.Serializable] public struct MailPrefabMap { public string prefabKey; // Имя, которое приходит в JSON (например, "standard", "special", "reward") public GameObject prefab; // Ссылка на сам префаб } [Header("Settings")] [SerializeField] private GameObject defaultPrefab; // Префаб по умолчанию, если в JSON пусто или ошибка [SerializeField] private List prefabMappings; // Список всех типов писем [SerializeField] private Transform mailListContainer; private Dictionary _prefabCache; private void Awake() { // Для быстрого поиска превращаем список в словарь при старте _prefabCache = prefabMappings.ToDictionary(x => x.prefabKey, x => x.prefab); } private void OnEnable() { if (MANAGER_GameEvents.OnUIUpdateNeeded != null) MANAGER_GameEvents.OnUIUpdateNeeded += RefreshUI; RefreshUI(); } private void OnDisable() { if (MANAGER_GameEvents.OnUIUpdateNeeded != null) MANAGER_GameEvents.OnUIUpdateNeeded -= RefreshUI; } private void RefreshUI() { if (MANAGER_Mail.Instance == null || !MANAGER_Mail.Instance.IsDataLoaded) { return; } // Очистка контейнера foreach (Transform child in mailListContainer) { Destroy(child.gameObject); } // 1. Получаем список // 2. Сортируем: OrderByDescending (от 100 к 0) или OrderBy (от 0 к 100) var sortedMails = MANAGER_Mail.Instance.GetAvailableMails() .OrderByDescending(mail => mail.priority) // Здесь укажи точный путь к полю priority .ToList(); foreach (var mail in sortedMails) { GameObject prefabToSpawn = GetPrefabByType(mail.visuals.prefab); GameObject mailGO = Instantiate(prefabToSpawn, mailListContainer); UI_MailItem itemUI = mailGO.GetComponent(); if (itemUI != null) { // Передаем данные в UI itemUI.Setup(mail); } } } // Метод для поиска префаба private GameObject GetPrefabByType(string key) { if (string.IsNullOrEmpty(key)) return defaultPrefab; if (_prefabCache.TryGetValue(key, out GameObject foundPrefab)) { return foundPrefab; } return defaultPrefab; } // Кнопки взаимодействия public void OnMailOpened(string mailId) => MANAGER_Mail.Instance.MarkAsRead(mailId); public void OnClaimClicked(string mailId) => MANAGER_Mail.Instance.ClaimReward(mailId); }