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