209 lines
5.9 KiB
C#
209 lines
5.9 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using GameServer.Client;
|
|
using UnityEngine;
|
|
using UnityEngine.Networking;
|
|
using UnityEngine.UI;
|
|
|
|
public class mailSlotPrefab : MonoBehaviour
|
|
{
|
|
private static readonly Dictionary<string, Sprite> RewardPreviewCache = new Dictionary<string, Sprite>(System.StringComparer.Ordinal);
|
|
private static readonly HashSet<string> RewardPreviewLoadsInFlight = new HashSet<string>(System.StringComparer.Ordinal);
|
|
|
|
[Header("buttons")]
|
|
public Button openButton;
|
|
public Button receivedButton;
|
|
[Header("basic infomations")]
|
|
public Image mailImage;
|
|
public Text mailTitle;
|
|
public Text mailSender;
|
|
public Text mailTime;
|
|
[Header("dots")]
|
|
public Image isRead_redDot;
|
|
public Image hasGift_icon;
|
|
[Header("select")]
|
|
public Image selectedImage;
|
|
[Header("gifts")]
|
|
public Text rewards_with_mail_text;
|
|
[Header("reward previews")]
|
|
public Transform rewardPreviewRoot;
|
|
public GameObject rewardPreviewPrefab;
|
|
public Sprite fallbackRewardPreviewSprite;
|
|
|
|
public void RefreshRewardsWithMailText(mail_so mailData)
|
|
{
|
|
if (rewards_with_mail_text == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
int rewardCount = GetRewardCount(mailData);
|
|
rewards_with_mail_text.text = rewardCount <= 0
|
|
? "\u4e0d\u5305\u542b\u9644\u4ef6"
|
|
: $"\u5305\u542b{rewardCount}\u4e2a\u9644\u4ef6";
|
|
}
|
|
|
|
public void RefreshRewardPreviews(mail_so mailData)
|
|
{
|
|
if (rewardPreviewRoot == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
for (int i = rewardPreviewRoot.childCount - 1; i >= 0; i--)
|
|
{
|
|
Destroy(rewardPreviewRoot.GetChild(i).gameObject);
|
|
}
|
|
|
|
if (mailData == null || mailData.rewardList == null || mailData.rewardList.Count == 0 || rewardPreviewPrefab == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
for (int i = 0; i < mailData.rewardList.Count; i++)
|
|
{
|
|
mail_so.rewardItem reward = mailData.rewardList[i];
|
|
if (reward == null)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
GameObject go = Instantiate(rewardPreviewPrefab, rewardPreviewRoot);
|
|
Image icon = go.GetComponent<Image>();
|
|
if (icon == null)
|
|
{
|
|
icon = go.GetComponentInChildren<Image>(true);
|
|
}
|
|
|
|
BindRewardPreviewIcon(icon, reward);
|
|
}
|
|
}
|
|
|
|
private void BindRewardPreviewIcon(Image icon, mail_so.rewardItem reward)
|
|
{
|
|
if (icon == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (reward != null && reward.reward_image != null)
|
|
{
|
|
icon.sprite = reward.reward_image;
|
|
icon.enabled = true;
|
|
return;
|
|
}
|
|
|
|
string url = NormalizeRewardIconUrl(reward != null ? (reward.reward_icon_url ?? string.Empty).Trim() : string.Empty);
|
|
if (string.IsNullOrWhiteSpace(url))
|
|
{
|
|
icon.sprite = fallbackRewardPreviewSprite;
|
|
icon.enabled = fallbackRewardPreviewSprite != null;
|
|
return;
|
|
}
|
|
|
|
if (RewardPreviewCache.TryGetValue(url, out Sprite cachedSprite) && cachedSprite != null)
|
|
{
|
|
icon.sprite = cachedSprite;
|
|
icon.enabled = true;
|
|
return;
|
|
}
|
|
|
|
icon.sprite = fallbackRewardPreviewSprite;
|
|
icon.enabled = icon.sprite != null;
|
|
|
|
if (!RewardPreviewLoadsInFlight.Add(url))
|
|
{
|
|
return;
|
|
}
|
|
|
|
StartCoroutine(LoadRewardPreviewSpriteRoutine(url, icon));
|
|
}
|
|
|
|
private IEnumerator LoadRewardPreviewSpriteRoutine(string imageUrl, Image icon)
|
|
{
|
|
using (UnityWebRequest request = UnityWebRequestTexture.GetTexture(imageUrl))
|
|
{
|
|
yield return request.SendWebRequest();
|
|
try
|
|
{
|
|
if (request.result != UnityWebRequest.Result.Success)
|
|
{
|
|
yield break;
|
|
}
|
|
|
|
Texture2D texture = DownloadHandlerTexture.GetContent(request);
|
|
if (texture == null)
|
|
{
|
|
yield break;
|
|
}
|
|
|
|
Sprite sprite = Sprite.Create(
|
|
texture,
|
|
new Rect(0f, 0f, texture.width, texture.height),
|
|
new Vector2(0.5f, 0.5f));
|
|
RewardPreviewCache[imageUrl] = sprite;
|
|
if (icon != null)
|
|
{
|
|
icon.sprite = sprite;
|
|
icon.enabled = true;
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
RewardPreviewLoadsInFlight.Remove(imageUrl);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static int GetRewardCount(mail_so mailData)
|
|
{
|
|
if (mailData == null || mailData.rewardList == null)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int count = 0;
|
|
for (int i = 0; i < mailData.rewardList.Count; i++)
|
|
{
|
|
mail_so.rewardItem reward = mailData.rewardList[i];
|
|
if (reward == null)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
count += Mathf.Max(0, reward.reward_ammount);
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
private static string NormalizeRewardIconUrl(string imageUrl)
|
|
{
|
|
string trimmed = imageUrl?.Trim() ?? string.Empty;
|
|
if (string.IsNullOrWhiteSpace(trimmed))
|
|
{
|
|
return string.Empty;
|
|
}
|
|
|
|
if (trimmed.StartsWith("http://", System.StringComparison.OrdinalIgnoreCase)
|
|
|| trimmed.StartsWith("https://", System.StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
return trimmed;
|
|
}
|
|
|
|
NetworkManager network = NetworkManager.Instance;
|
|
if (network == null || string.IsNullOrWhiteSpace(network.ServerUrl))
|
|
{
|
|
return trimmed;
|
|
}
|
|
|
|
string baseUrl = network.ServerUrl.TrimEnd('/');
|
|
if (!trimmed.StartsWith("/"))
|
|
{
|
|
trimmed = "/" + trimmed;
|
|
}
|
|
|
|
return baseUrl + trimmed;
|
|
}
|
|
}
|