using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
namespace AppUI.Manager.Role
{
///
/// 角色管理器,AppUI中涉及角色信息的界面都通过这个类来获取角色信息(昵称和头像),以保证信息的一致性
///
public class RoleManager
{
public readonly static string prefix = "Wonderfitter/";
public const int NullAvatarID = int.MinValue;
/// AppUI 预设头像在 中的起始 avatarID(index 0 → 7 → avatar_01)。
public const int AppUIPresetAvatarIdBase = 7;
/// AppUI 可选预设数量,与 中 7+32 一致。
public const int AppUIPresetAvatarCount = 32;
/// 网格下标 → 服务端 user_info.avatarID。
public static int PresetGridIndexToAvatarId(int gridIndex) => AppUIPresetAvatarIdBase + gridIndex;
public static bool IsAppUIPresetAvatarId(int avatarId) =>
avatarId >= AppUIPresetAvatarIdBase && avatarId < AppUIPresetAvatarIdBase + AppUIPresetAvatarCount;
// 腾讯云 COS 域名后缀
private const string COS_DOMAIN_SUFFIX = ".myqcloud.com";
///
/// 判断是否是 COS 资源
///
public static bool IsCosResource(string url)
{
if (string.IsNullOrEmpty(url))
return false;
// 简单字符串匹配 host 是否包含 cos 域名
return url.IndexOf(COS_DOMAIN_SUFFIX, StringComparison.OrdinalIgnoreCase) >= 0;
}
public static bool IsRoleAvatar(int id)
{
return id >= 1 && id <= 6;
}
public static int GetAvatarListLen()
{
return 7 + 32;
}
public static void SetAvatarToImage(Image image, int avatarID, string avatarUrl)
{
SetAvatarToImage(image, image, avatarID, avatarUrl);
}
public static void SetAvatarToImage(Image image, MonoBehaviour coroutineStarter, int avatarID, string avatarUrl)
{
if (avatarID == NullAvatarID)
{
if (image) image.sprite = null;
}
else if (avatarID < 0) coroutineStarter.StartCoroutine(LoadAvatar(avatarUrl, image));
else
{
string path = "";
if (avatarID < 7)
{
//Player1-6是PK模式的默认头像,AppUI也沿用这个资源,所以路径不变
path += "Textures/Avatar/Player" + avatarID;
}
else {
//AppUI的资源路径和PK模式不一样,avatarID需要-7才能对应上
//因为新头像 下标从1开始,所以avatarID - 6 刚好对应上新头像的资源命名
path += prefix + "Textures/Avatar/images/avatar_" + (avatarID - 6).ToString("00");
}
if (image) image.sprite = Resources.Load(path);
}
}
//缓存网络图片,避免重复加载
private static Dictionary remoteAvatarMap = new Dictionary();
private static IEnumerator LoadAvatar(string url, Image image)
{
if (string.IsNullOrWhiteSpace(url))
{
if (image) image.sprite = null;
yield break;
}
if (remoteAvatarMap.ContainsKey(url))
{
if (image) image.sprite = remoteAvatarMap[url];
yield break;
}
if (image) image.sprite = null;
else yield break;
using (UnityWebRequest uwr = new UnityWebRequest(url, UnityWebRequest.kHttpVerbGET))
{
uwr.downloadHandler = new DownloadHandlerTexture();
yield return uwr.SendWebRequest();
if (uwr.result != UnityWebRequest.Result.Success) yield break;
Texture2D texture = DownloadHandlerTexture.GetContent(uwr);
Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
remoteAvatarMap[url] = sprite;
if (image) image.sprite = sprite;
}
}
}
}