RoleManager.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.Networking;
  6. using UnityEngine.UI;
  7. namespace AppUI.Manager.Role
  8. {
  9. /// <summary>
  10. /// 角色管理器,AppUI中涉及角色信息的界面都通过这个类来获取角色信息(昵称和头像),以保证信息的一致性
  11. /// </summary>
  12. public class RoleManager
  13. {
  14. public readonly static string prefix = "Wonderfitter/";
  15. public const int NullAvatarID = int.MinValue;
  16. /// <summary>AppUI 预设头像在 <see cref="AvatarGroup"/> 中的起始 avatarID(index 0 → 7 → avatar_01)。</summary>
  17. public const int AppUIPresetAvatarIdBase = 7;
  18. /// <summary>AppUI 可选预设数量,与 <see cref="GetAvatarListLen"/> 中 7+32 一致。</summary>
  19. public const int AppUIPresetAvatarCount = 32;
  20. /// <summary><see cref="AvatarGroup"/> 网格下标 → 服务端 <c>user_info.avatarID</c>。</summary>
  21. public static int PresetGridIndexToAvatarId(int gridIndex) => AppUIPresetAvatarIdBase + gridIndex;
  22. public static bool IsAppUIPresetAvatarId(int avatarId) =>
  23. avatarId >= AppUIPresetAvatarIdBase && avatarId < AppUIPresetAvatarIdBase + AppUIPresetAvatarCount;
  24. // 腾讯云 COS 域名后缀
  25. private const string COS_DOMAIN_SUFFIX = ".myqcloud.com";
  26. /// <summary>
  27. /// 判断是否是 COS 资源
  28. /// </summary>
  29. public static bool IsCosResource(string url)
  30. {
  31. if (string.IsNullOrEmpty(url))
  32. return false;
  33. // 简单字符串匹配 host 是否包含 cos 域名
  34. return url.IndexOf(COS_DOMAIN_SUFFIX, StringComparison.OrdinalIgnoreCase) >= 0;
  35. }
  36. public static bool IsRoleAvatar(int id)
  37. {
  38. return id >= 1 && id <= 6;
  39. }
  40. public static int GetAvatarListLen()
  41. {
  42. return 7 + 32;
  43. }
  44. public static void SetAvatarToImage(Image image, int avatarID, string avatarUrl)
  45. {
  46. SetAvatarToImage(image, image, avatarID, avatarUrl);
  47. }
  48. public static void SetAvatarToImage(Image image, MonoBehaviour coroutineStarter, int avatarID, string avatarUrl)
  49. {
  50. if (avatarID == NullAvatarID)
  51. {
  52. if (image) image.sprite = null;
  53. }
  54. else if (avatarID < 0) coroutineStarter.StartCoroutine(LoadAvatar(avatarUrl, image));
  55. else
  56. {
  57. string path = "";
  58. if (avatarID < 7)
  59. {
  60. //Player1-6是PK模式的默认头像,AppUI也沿用这个资源,所以路径不变
  61. path += "Textures/Avatar/Player" + avatarID;
  62. }
  63. else {
  64. //AppUI的资源路径和PK模式不一样,avatarID需要-7才能对应上
  65. //因为新头像 下标从1开始,所以avatarID - 6 刚好对应上新头像的资源命名
  66. path += prefix + "Textures/Avatar/images/avatar_" + (avatarID - 6).ToString("00");
  67. }
  68. if (image) image.sprite = Resources.Load<Sprite>(path);
  69. }
  70. }
  71. //缓存网络图片,避免重复加载
  72. private static Dictionary<string, Sprite> remoteAvatarMap = new Dictionary<string, Sprite>();
  73. private static IEnumerator LoadAvatar(string url, Image image)
  74. {
  75. if (string.IsNullOrWhiteSpace(url))
  76. {
  77. if (image) image.sprite = null;
  78. yield break;
  79. }
  80. if (remoteAvatarMap.ContainsKey(url))
  81. {
  82. if (image) image.sprite = remoteAvatarMap[url];
  83. yield break;
  84. }
  85. if (image) image.sprite = null;
  86. else yield break;
  87. using (UnityWebRequest uwr = new UnityWebRequest(url, UnityWebRequest.kHttpVerbGET))
  88. {
  89. uwr.downloadHandler = new DownloadHandlerTexture();
  90. yield return uwr.SendWebRequest();
  91. if (uwr.result != UnityWebRequest.Result.Success) yield break;
  92. Texture2D texture = DownloadHandlerTexture.GetContent(uwr);
  93. Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
  94. remoteAvatarMap[url] = sprite;
  95. if (image) image.sprite = sprite;
  96. }
  97. }
  98. }
  99. }