PJ/Assets/scripts/dotfs_scripts/UI_MailPlaceholder.cs

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);
}