92 lines
No EOL
3.1 KiB
C#
92 lines
No EOL
3.1 KiB
C#
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<MailPrefabMap> prefabMappings; // Список всех типов писем
|
|
[SerializeField] private Transform mailListContainer;
|
|
|
|
private Dictionary<string, GameObject> _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<UI_MailItem>();
|
|
|
|
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);
|
|
} |