Procházet zdrojové kódy

支持微信网络头像

lvjincheng před 3 roky
rodič
revize
a8bdddb707

+ 15 - 11
Assets/BowArrow/Scripts/GameChallenge/LocalPK/HunterGameView_LocalPK.cs

@@ -20,22 +20,24 @@ public class HunterGameView_LocalPK : MonoBehaviour
         } else if (GlobalData.pkMatchType == PKMatchType.OnlinePK) {
             MatchPlayerInfo info0 = GlobalData.matchPlayerInfos[0];
             MatchPlayerInfo info1 = GlobalData.matchPlayerInfos[1];
-            InitRenderPlayerInfo_Online(0, info0.avatarID, info0.nickname, 0);
-            InitRenderPlayerInfo_Online(1, info1.avatarID, info1.nickname, 0);
+            InitRenderPlayerInfo_Online(0, info0.avatarID, info0.avatarUrl, info0.nickname, 0);
+            InitRenderPlayerInfo_Online(1, info1.avatarID, info1.avatarUrl, info1.nickname, 0);
         }
     }
 
     void Update() {
         if (gameModeLocalPK.GetCurrentPlayIndex() != curPlayerIndex) {
             curPlayerIndex = gameModeLocalPK.GetCurrentPlayIndex();
-            (Sprite avatar, string nickName) = (null, null);
+            string nickName = null;
+            Image avatarImage = this.transform.Find("CurrentPlayer/Avatar").GetComponent<Image>();
             if (GlobalData.pkMatchType == PKMatchType.LocalPK) {
-                (avatar, nickName) = RoleMgr.GetRoleInfo(GlobalData.localPK_playerRoleIDs[curPlayerIndex]);
+                nickName = RoleMgr.GetRoleInfo(GlobalData.localPK_playerRoleIDs[curPlayerIndex], avatarImage);
             } else if (GlobalData.pkMatchType == PKMatchType.OnlinePK) {
-                (avatar, nickName) = RoleMgr.GetRoleInfo(GlobalData.matchPlayerInfos[curPlayerIndex].avatarID);
+                int avatarID = GlobalData.matchPlayerInfos[curPlayerIndex].avatarID;
+                string avatarUrl = GlobalData.matchPlayerInfos[curPlayerIndex].avatarUrl;
+                RoleMgr.SetAvatarToImage(avatarImage, avatarID, avatarUrl);
                 nickName = GlobalData.matchPlayerInfos[curPlayerIndex].nickname;
             }
-            this.transform.Find("CurrentPlayer/Avatar").GetComponent<Image>().sprite = avatar;
             this.transform.Find("CurrentPlayer/Name").GetComponent<Text>().text = nickName;
         } else {
             //索引相同,则渲染对应的玩家时间
@@ -66,16 +68,18 @@ public class HunterGameView_LocalPK : MonoBehaviour
 
     void InitRenderPlayerInfo_Local(int posNum, int roleID, int score)
     {
-        (Sprite avatar, string nickName) = RoleMgr.GetRoleInfo(roleID);
-        this.transform.Find("ScoreBox/Item" + posNum + "/Avatar/Sprite").GetComponent<Image>().sprite = avatar;
+        string nickName = RoleMgr.GetRoleInfo(roleID, 
+            this.transform.Find("ScoreBox/Item" + posNum + "/Avatar/Sprite").GetComponent<Image>());
         this.transform.Find("ScoreBox/Item" + posNum + "/Name").GetComponent<Text>().text = nickName;
         RenderScore(posNum, score);
     }
 
-    void InitRenderPlayerInfo_Online(int posNum, int avatarID, string nickname, int score)
+    void InitRenderPlayerInfo_Online(int posNum, int avatarID, string avatarUrl, string nickname, int score)
     {
-        Sprite avatar = RoleMgr.GetAvatar(avatarID);
-        this.transform.Find("ScoreBox/Item" + posNum + "/Avatar/Sprite").GetComponent<Image>().sprite = avatar;
+        RoleMgr.SetAvatarToImage(
+            this.transform.Find("ScoreBox/Item" + posNum + "/Avatar/Sprite").GetComponent<Image>(),
+            avatarID, avatarUrl
+        );
         this.transform.Find("ScoreBox/Item" + posNum + "/Name").GetComponent<Text>().text = nickname;
         RenderScore(posNum, score);
     }

+ 7 - 2
Assets/BowArrow/Scripts/GameChallenge/Views/HuntGameSelectLevelView.cs

@@ -14,7 +14,6 @@ public class HuntGameSelectLevelView : MonoBehaviour
     {
         GameMgr.ins.addLockerForGamePause(this);
 
-        Sprite avatarSprite = RoleMgr.GetAvatar(LoginMgr.myUserInfo.avatarID);
         int myPassLevel = LoginMgr.myUserInfo.GetChallengeLevelPass(GameMgr.gameType);
         for (int level = 1; level <= 5; level++)
         {
@@ -34,7 +33,13 @@ public class HuntGameSelectLevelView : MonoBehaviour
             levelTF.Find("Icon0").gameObject.SetActive(isLock);
             levelTF.Find("Icon1").gameObject.SetActive(myPassLevel >= levelRecord);
             levelTF.Find("Icon2").gameObject.SetActive(levelRecord == myPassLevel + 1);
-            levelTF.Find("Icon2").GetComponent<Image>().sprite = avatarSprite;
+            if (levelTF.Find("Icon2").gameObject.activeSelf)
+            {
+                RoleMgr.SetAvatarToImage(
+                    levelTF.Find("Icon2").GetComponent<Image>(), 
+                    LoginMgr.myUserInfo.avatarID, 
+                    LoginMgr.myUserInfo.avatarUrl);
+            }
         }
     }
 

+ 3 - 1
Assets/BowArrow/Scripts/GlobalData.cs

@@ -29,11 +29,13 @@ public enum PKMatchType {
  public class MatchPlayerInfo {
     public int playerID;
     public int avatarID;
+    public string avatarUrl = "";
     public string nickname;
     public MatchPlayerInfo() {}
-    public MatchPlayerInfo(int playerID, int avatarID, string nickname) {
+    public MatchPlayerInfo(int playerID, int avatarID, string avatarUrl, string nickname) {
         this.playerID = playerID;
         this.avatarID = avatarID;
+        this.avatarUrl = avatarUrl;
         this.nickname = nickname;
     }
 }

+ 1 - 0
Assets/BowArrow/Scripts/Manager/LoginMgr/LoginMgr.cs

@@ -55,6 +55,7 @@ public class UserInfo
 {
     public int id;
     public int avatarID = 0;
+    public string avatarUrl = "";
     public string nickname = "超级射手";
     public int gender = 1;
     public string phone = "";

+ 2 - 2
Assets/BowArrow/Scripts/Manager/PopupMgr.cs

@@ -79,12 +79,12 @@ public class PopupMgr : MonoBehaviour
     }
 
     public void ShowPKInviteNotice(
-        int avatarID, string nickname, string tip, 
+        int avatarID, string avatarUrl, string nickname, string tip, 
         System.Action cbYes, System.Action cbNo, System.Action cbAutoCancel
     ) {
         GameObject o = GameObject.Instantiate(Resources.Load<GameObject>("Prefabs/Popups/PKInviteNotice"));
         PKInviteNotice script = o.AddComponent<PKInviteNotice>();
-        script.SetAvatarSprite(RoleMgr.GetAvatar(avatarID));
+        script.SetAvatarSprite(avatarID, avatarUrl);
         script.SetNameText(nickname);
         script.SetTipText(tip);
         script.eventOnAgree += cbYes;

+ 41 - 9
Assets/BowArrow/Scripts/Manager/RoleMgr.cs

@@ -1,6 +1,8 @@
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
+using UnityEngine.UI;
+using UnityEngine.Networking;
 /* 内置角色信息管理者,(PK模式用到的角色选择) */
 public class RoleMgr
 {
@@ -10,16 +12,17 @@ public class RoleMgr
             return roleNames.Length;
         }
     }
-    public static (Sprite, string) GetRoleInfo(int id)
+    //获取角色信息(适用于本地PK获取对手或者我的信息)
+    public static string GetRoleInfo(int id, Image image)
     {   
-        Sprite sprite = GetAvatar(id);
         string nickname = null;
         if (IsRoleAvatar(id)) {
             nickname = roleNames[id - 1];
         } else {
             nickname = LoginMgr.myUserInfo.nickname;
         }
-        return (sprite, nickname);
+        SetAvatarToImage(image, id, LoginMgr.myUserInfo.avatarUrl);
+        return nickname;
     }
 
     public static bool IsRoleAvatar(int id) {
@@ -28,11 +31,40 @@ public class RoleMgr
     public static int GetAvatarListLen() {
         return 7 + 24;
     }
-    public static Sprite GetAvatar(int id)
-    {   
-        string path = "Textures/Avatar/";
-        if (id < 7) path += "Player" + id;
-        else path += id - 7;
-        return Resources.Load<Sprite>(path);
+
+    public const int NullAvatarID = int.MinValue;
+    public static void SetAvatarToImage(Image image, int avatarID, string avatarUrl) {
+        if (avatarID == NullAvatarID) image.sprite = null;
+        else if (avatarID < 0) image.StartCoroutine(LoadAvatar(avatarUrl, image));
+        else 
+        {
+            string path = "Textures/Avatar/";
+            if (avatarID < 7) path += "Player" + avatarID;
+            else path += avatarID - 7;
+            image.sprite = Resources.Load<Sprite>(path);
+        }
+    }
+
+    //缓存网络图片,避免重复加载
+    private static Dictionary<string, Sprite> remoteAvatarMap = new Dictionary<string, Sprite>();
+    private static IEnumerator LoadAvatar(string url, Image image)
+    {
+        if (url == null) url = "";
+        Debug.Log(remoteAvatarMap.Count);
+        if (remoteAvatarMap.ContainsKey(url))
+        {
+            image.sprite = remoteAvatarMap[url];
+            yield break;
+        }
+        image.sprite = null;
+        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;
+            image.sprite = sprite;
+        }
     }
 }

+ 3 - 3
Assets/BowArrow/Scripts/Network/SocketComp/PKComp.cs

@@ -42,7 +42,7 @@ public class PKComp : JCUnityLib.Singleton<PKComp>
 
     private MatchPlayerInfo CreateMyMatchPlayerInfo() {
         UserInfo u = LoginMgr.myUserInfo;
-        MatchPlayerInfo playerInfo = new MatchPlayerInfo(u.id, u.avatarID, u.nickname);
+        MatchPlayerInfo playerInfo = new MatchPlayerInfo(u.id, u.avatarID, u.avatarUrl, u.nickname);
         return playerInfo;
     }
 
@@ -75,7 +75,7 @@ public class PKComp : JCUnityLib.Singleton<PKComp>
             rejectPKInvite(roomKey);
         };
         if (CanShowFriendInviteOrMatch()) {
-            PopupMgr.ins.ShowPKInviteNotice(matchPlayerInfo.avatarID, matchPlayerInfo.nickname, tip, cb, cbCancel, cbCancel);
+            PopupMgr.ins.ShowPKInviteNotice(matchPlayerInfo.avatarID, matchPlayerInfo.avatarUrl, matchPlayerInfo.nickname, tip, cb, cbCancel, cbCancel);
         }
     }
     public void onInviteOtherTryAgainGamePK(MatchPlayerInfo matchPlayerInfo, int gameType, string roomKey) {
@@ -97,7 +97,7 @@ public class PKComp : JCUnityLib.Singleton<PKComp>
             rejectPKInvite(roomKey);
         };
         if (CanShowTryAgainInviteOrMatch(matchPlayerInfo)) {
-            PopupMgr.ins.ShowPKInviteNotice(matchPlayerInfo.avatarID, matchPlayerInfo.nickname, tip, cb, cbCancel, cbCancel);
+            PopupMgr.ins.ShowPKInviteNotice(matchPlayerInfo.avatarID, matchPlayerInfo.avatarUrl, matchPlayerInfo.nickname, tip, cb, cbCancel, cbCancel);
         }
     }
 

+ 5 - 2
Assets/BowArrow/Scripts/Popup/PKInviteNotice.cs

@@ -53,8 +53,11 @@ public class PKInviteNotice : MonoBehaviour
     public Action eventOnReject;
     public Action eventOnAutoDestroy;
 
-    public void SetAvatarSprite(Sprite sprite) {
-        item.Find("Avatar/Sprite").GetComponent<Image>().sprite = sprite;
+    public void SetAvatarSprite(int avatarID, string avatarUrl) {
+        RoleMgr.SetAvatarToImage(
+            item.Find("Avatar/Sprite").GetComponent<Image>(),
+            avatarID, avatarUrl
+        );
     }
 
     public void SetNameText(string text) {

+ 18 - 4
Assets/BowArrow/Scripts/View/Home/FriendView.cs

@@ -88,13 +88,16 @@ public class FriendView : JCUnityLib.ViewBase, MenuBackInterface
                     foreach (var itemInfo in list) {
                         int friendID = itemInfo.Value<int>("friendID");
                         int avatarID = itemInfo.Value<int>("avatarID");
+                        string avatarUrl = itemInfo.Value<string>("avatarUrl");
                         string nickname = itemInfo.Value<string>("nickname");
                         bool online = itemInfo.Value<bool>("online");
                         long offlineTime = itemInfo.Value<long>("offlineTime");
                         GameObject o = GameObject.Instantiate(GetMyFriendItemPrefab(), GetMyFriendItemParent());
                         o.SetActive(true);
                         o.name = friendID.ToString();
-                        o.transform.Find("Avatar/Sprite").GetComponent<Image>().sprite = RoleMgr.GetAvatar(avatarID);
+                        RoleMgr.SetAvatarToImage(
+                            o.transform.Find("Avatar/Sprite").GetComponent<Image>(),
+                            avatarID, avatarUrl);
                         o.transform.Find("Name").GetComponent<Text>().text = nickname;
                         o.transform.Find("BG0").gameObject.SetActive(!online);
                         o.transform.Find("BG1").gameObject.SetActive(online);
@@ -147,13 +150,16 @@ public class FriendView : JCUnityLib.ViewBase, MenuBackInterface
                     foreach (var itemInfo in list) {
                         int otherID = itemInfo.Value<int>("otherID");
                         int avatarID = itemInfo.Value<int>("avatarID");
+                        string avatarUrl = itemInfo.Value<string>("avatarUrl");
                         string nickname = itemInfo.Value<string>("nickname");
                         bool online = itemInfo.Value<bool>("online");
                         long offlineTime = itemInfo.Value<long>("offlineTime");
                         GameObject o = GameObject.Instantiate(GetFriendRequestItemPrefab(), GetFriendRequestItemParent());
                         o.SetActive(true);
                         o.name = otherID.ToString();
-                        o.transform.Find("Avatar/Sprite").GetComponent<Image>().sprite = RoleMgr.GetAvatar(avatarID);
+                        RoleMgr.SetAvatarToImage(
+                            o.transform.Find("Avatar/Sprite").GetComponent<Image>(),
+                            avatarID, avatarUrl);
                         o.transform.Find("Name").GetComponent<Text>().text = nickname;
                         o.transform.Find("BG0").gameObject.SetActive(!online);
                         o.transform.Find("BG1").gameObject.SetActive(online);
@@ -211,6 +217,7 @@ public class FriendView : JCUnityLib.ViewBase, MenuBackInterface
                     foreach (var itemInfo in list) {
                         int userID = itemInfo.Value<int>("id");
                         int avatarID = itemInfo.Value<int>("avatarID");
+                        string avatarUrl = itemInfo.Value<string>("avatarUrl");
                         string nickname = itemInfo.Value<string>("nickname");
                         bool online = itemInfo.Value<bool>("online");
                         long offlineTime = itemInfo.Value<long>("offlineTime");
@@ -218,7 +225,10 @@ public class FriendView : JCUnityLib.ViewBase, MenuBackInterface
                         GameObject o = GameObject.Instantiate(GetFriendRecommendItemPrefab(), GetFriendRecommendItemParent());
                         o.SetActive(true);
                         o.name = userID.ToString();
-                        o.transform.Find("Avatar/Sprite").GetComponent<Image>().sprite = RoleMgr.GetAvatar(avatarID);
+                        RoleMgr.SetAvatarToImage(
+                            o.transform.Find("Avatar/Sprite").GetComponent<Image>(),
+                            avatarID, avatarUrl
+                        );
                         o.transform.Find("Name").GetComponent<Text>().text = nickname;
                         o.transform.Find("PlayCount").GetComponent<Text>().text = 
                             String.Format(
@@ -282,13 +292,17 @@ public class FriendView : JCUnityLib.ViewBase, MenuBackInterface
                     foreach (var itemInfo in list) {
                         int userID = itemInfo.Value<int>("id");
                         int avatarID = itemInfo.Value<int>("avatarID");
+                        string avatarUrl = itemInfo.Value<string>("avatarUrl");
                         string nickname = itemInfo.Value<string>("nickname");
                         bool online = itemInfo.Value<bool>("online");
                         long offlineTime = itemInfo.Value<long>("offlineTime");
                         GameObject o = GameObject.Instantiate(GetSearchPlayerItemPrefab(), GetSearchPlayerItemParent());
                         o.SetActive(true);
                         o.name = userID.ToString();
-                        o.transform.Find("Avatar/Sprite").GetComponent<Image>().sprite = RoleMgr.GetAvatar(avatarID);
+                        RoleMgr.SetAvatarToImage(
+                            o.transform.Find("Avatar/Sprite").GetComponent<Image>(),
+                            avatarID, avatarUrl
+                        );
                         o.transform.Find("Name").GetComponent<Text>().text = nickname;
                         o.transform.Find("BG0").gameObject.SetActive(!online);
                         o.transform.Find("BG1").gameObject.SetActive(online);

+ 7 - 3
Assets/BowArrow/Scripts/View/Home/HomeView.cs

@@ -110,7 +110,7 @@ public class HomeView : JCUnityLib.ViewBase
     }
 
     public void RenderMyAvatarSprite() {
-        myAvatarSprite.sprite = RoleMgr.GetAvatar(LoginMgr.myUserInfo.avatarID);
+        RoleMgr.SetAvatarToImage(myAvatarSprite, LoginMgr.myUserInfo.avatarID, LoginMgr.myUserInfo.avatarUrl);
     }
 
     public void RenderDeviceNames()
@@ -181,13 +181,15 @@ public class HomeView : JCUnityLib.ViewBase
             foreach (var itemInfo in list) {
                 int friendID = itemInfo.Value<int>("friendID");
                 int avatarID = itemInfo.Value<int>("avatarID");
+                string avatarUrl = itemInfo.Value<string>("avatarUrl");
                 string nickname = itemInfo.Value<string>("nickname");
                 bool online = itemInfo.Value<bool>("online");
                 long offlineTime = itemInfo.Value<long>("offlineTime");
                 GameObject o = GameObject.Instantiate(friendItemPrefab, friendBarContent);
                 o.SetActive(true);
                 o.name = friendID.ToString();
-                o.transform.Find("Avatar").GetComponent<Image>().sprite = RoleMgr.GetAvatar(avatarID);
+                Image avatarImage = o.transform.Find("Avatar").GetComponent<Image>();
+                RoleMgr.SetAvatarToImage(avatarImage, avatarID, avatarUrl);
                 o.transform.Find("Nickname").GetComponent<Text>().text = nickname;
                 TextAutoLanguage2 timeTip = o.transform.Find("Avatar/Line/Text").GetComponent<TextAutoLanguage2>();
                 TimeUtil.SetOfflineTimeTextKey(offlineTime, online, timeTip);
@@ -226,6 +228,7 @@ public class HomeView : JCUnityLib.ViewBase
             foreach (var itemInfo in list) {
                 int userID = itemInfo.Value<int>("id");
                 int avatarID = itemInfo.Value<int>("avatarID");
+                string avatarUrl = itemInfo.Value<string>("avatarUrl");
                 string nickname = itemInfo.Value<string>("nickname");
                 bool online = itemInfo.Value<bool>("online");
                 long offlineTime = itemInfo.Value<long>("offlineTime");
@@ -233,7 +236,8 @@ public class HomeView : JCUnityLib.ViewBase
                 GameObject o = GameObject.Instantiate(friendItemPrefab, friendBarContent);
                 o.SetActive(true);
                 o.name = userID.ToString();
-                o.transform.Find("Avatar").GetComponent<Image>().sprite = RoleMgr.GetAvatar(avatarID);
+                Image avatarImage = o.transform.Find("Avatar").GetComponent<Image>();
+                RoleMgr.SetAvatarToImage(avatarImage, avatarID, avatarUrl);
                 o.transform.Find("Nickname").GetComponent<Text>().text = nickname;
                 TextAutoLanguage2 timeTip = o.transform.Find("Avatar/Line/Text").GetComponent<TextAutoLanguage2>();
                 Action<Text> onApplyToNext = (t) => {

+ 5 - 4
Assets/BowArrow/Scripts/View/Home/MeView.cs

@@ -188,7 +188,7 @@ public class MeView : ViewBase, MenuBackInterface
             }
         }
         nameText.text = LoginMgr.myUserInfo.nickname;
-        avatarImage.sprite = RoleMgr.GetAvatar(LoginMgr.myUserInfo.avatarID);
+        RoleMgr.SetAvatarToImage(avatarImage, LoginMgr.myUserInfo.avatarID, LoginMgr.myUserInfo.avatarUrl);
         HomeView.ins.RenderNameOrGender();
     }
 
@@ -289,10 +289,11 @@ public class MeView : ViewBase, MenuBackInterface
                 avatarSelectView.Find("FrameBox/BtnClose").GetComponent<Button>().onClick.AddListener(CloseAvatarSelectView);
                 GridLayoutGroup gridLayoutGroup = this.transform.GetComponentInChildren<GridLayoutGroup>();
                 GameObject avatarPrefab = gridLayoutGroup.transform.Find("Avatar").gameObject;
-                for (int id = 0; id < RoleMgr.GetAvatarListLen(); id++) {
+                for (int id = -1; id < RoleMgr.GetAvatarListLen(); id++) {
                     if (RoleMgr.IsRoleAvatar(id)) continue;
                     GameObject avatar = GameObject.Instantiate(avatarPrefab, gridLayoutGroup.transform);
-                    avatar.transform.Find("Mask/Sprite").GetComponent<Image>().sprite = RoleMgr.GetAvatar(id);
+                    Image avatarImage = avatar.transform.Find("Mask/Sprite").GetComponent<Image>();
+                    RoleMgr.SetAvatarToImage(avatarImage, id, LoginMgr.myUserInfo.avatarUrl);
                     avatar.transform.Find("Check").gameObject.SetActive(id == curAvatarSelectID);
                     avatar.gameObject.name = id.ToString();
                     int aid = id; //记录该值
@@ -317,7 +318,7 @@ public class MeView : ViewBase, MenuBackInterface
             if (curAvatarSelectID != LoginMgr.myUserInfo.avatarID) {
                 LoginMgr.myUserInfo.avatarID = curAvatarSelectID;
                 //render
-                avatarImage.sprite = RoleMgr.GetAvatar(curAvatarSelectID);
+                RoleMgr.SetAvatarToImage(avatarImage, curAvatarSelectID, LoginMgr.myUserInfo.avatarUrl);
                 HomeView.ins.RenderMyAvatarSprite();
                 //save data
                 LoginMgr.myUserInfo.Save();

+ 15 - 9
Assets/BowArrow/Scripts/View/Home/PKMatchView.cs

@@ -21,9 +21,8 @@ public class PKMatchView : JCUnityLib.ViewBase, MenuBackInterface
         PersistenHandler.ins?.menuBackCtr.views.Add(this);
         TopBarView.NeedShowIt(this);
 
-        Sprite avatar = RoleMgr.GetAvatar(LoginMgr.myUserInfo.avatarID);
         string nickname = LoginMgr.myUserInfo.nickname;
-        RenderPlayerInfo(1, avatar, nickname, true);
+        RenderPlayerInfo(1, LoginMgr.myUserInfo.avatarID, LoginMgr.myUserInfo.avatarUrl, nickname, true);
         SetBtnTabSelected(btnTabs[0]);
     }
 
@@ -114,24 +113,27 @@ public class PKMatchView : JCUnityLib.ViewBase, MenuBackInterface
 
     void RefreshOtherPlayerInfoRender() {
         if (curBtnTabIndex == 0) {
-            RenderPlayerInfo(2, null, "", false);
+            RenderPlayerInfo(2, RoleMgr.NullAvatarID, "", "", false);
         } else if (curBtnTabIndex == 1) {
             if (selectedFriendInfo != null) {
-                RenderPlayerInfo(2, RoleMgr.GetAvatar(selectedFriendInfo.avatarID), selectedFriendInfo.nickname, true);
+                RenderPlayerInfo(2, selectedFriendInfo.avatarID, selectedFriendInfo.avatarUrl, selectedFriendInfo.nickname, true);
             } else {
-                RenderPlayerInfo(2, null, "", false);
+                RenderPlayerInfo(2, RoleMgr.NullAvatarID, "", "", false);
             }
         }
     }
 
-    void RenderPlayerInfo(int playerID, Sprite avatar, string nickname, bool active) {
+    void RenderPlayerInfo(int playerID, int avatarID, string avatarUrl, string nickname, bool active) {
         this.transform.Find($"BoxRight/Player{playerID}/NameBox")
             .GetComponentInChildren<Text>().text = active 
                 ? nickname 
                 : TextAutoLanguage2.GetTextByKey("pk-match_wait-to-join");
         Transform avatarT = this.transform.Find($"BoxRight/Player{playerID}/MatchHeadBG/Avatar");
         avatarT.gameObject.SetActive(active);
-        avatarT.Find("Sprite").GetComponent<Image>().sprite = avatar;
+        RoleMgr.SetAvatarToImage(
+            avatarT.Find("Sprite").GetComponent<Image>(),
+            avatarID, avatarUrl
+        );
     }
 
     public void Back() {
@@ -164,13 +166,17 @@ public class PKMatchView : JCUnityLib.ViewBase, MenuBackInterface
                     foreach (var itemInfo in list) {
                         int friendID = itemInfo.Value<int>("friendID");
                         int avatarID = itemInfo.Value<int>("avatarID");
+                        string avatarUrl = itemInfo.Value<string>("avatarUrl");
                         string nickname = itemInfo.Value<string>("nickname");
                         bool online = itemInfo.Value<bool>("online");
                         long offlineTime = itemInfo.Value<long>("offlineTime");
                         GameObject o = GameObject.Instantiate(GetFriendSelectItemPrefab(), GetFriendSelectItemParent());
                         o.SetActive(true);
                         o.name = friendID.ToString();
-                        o.transform.Find("Avatar/Sprite").GetComponent<Image>().sprite = RoleMgr.GetAvatar(avatarID);
+                        RoleMgr.SetAvatarToImage(
+                            o.transform.Find("Avatar/Sprite").GetComponent<Image>(),
+                            avatarID, avatarUrl
+                        );
                         o.transform.Find("Name").GetComponent<Text>().text = nickname;
                         o.transform.Find("Point").GetComponent<Image>().color = online ? Color.green : Color.red;
                         Text onlineTip = o.transform.Find("OnlineTip").GetComponent<Text>();
@@ -180,7 +186,7 @@ public class PKMatchView : JCUnityLib.ViewBase, MenuBackInterface
                         btnPK.onClick.RemoveAllListeners();
                         btnPK.onClick.AddListener(delegate() {
                             btnEvent_CloseFriendSelectView();
-                            selectedFriendInfo = new MatchPlayerInfo(friendID, avatarID, nickname);
+                            selectedFriendInfo = new MatchPlayerInfo(friendID, avatarID, avatarUrl, nickname);
                             RefreshBtnMatch();
                             RefreshOtherPlayerInfoRender();
                         });

+ 10 - 2
Assets/BowArrow/Scripts/View/Home/RankView.cs

@@ -77,6 +77,7 @@ public class RankView : JCUnityLib.ViewBase, MenuBackInterface
                     int userID = itemInfo.Value<int>("userID");
                     int score = itemInfo.Value<int>("score");
                     int avatarID = itemInfo.Value<int>("avatarID");
+                    string avatarUrl = itemInfo.Value<string>("avatarUrl");
                     string nickname = itemInfo.Value<string>("nickname");
                     string country = itemInfo.Value<string>("country");
                     GameObject o = GameObject.Instantiate(GetRankListItemPrefab(), GetRankListItemParent());
@@ -88,7 +89,10 @@ public class RankView : JCUnityLib.ViewBase, MenuBackInterface
                     if (rankNum >= 4) {
                         o.transform.Find("RankNum").GetComponent<Text>().text = rankNum.ToString();
                     }
-                    o.transform.Find("Avatar/Sprite").GetComponent<Image>().sprite = RoleMgr.GetAvatar(avatarID);
+                    RoleMgr.SetAvatarToImage(
+                        o.transform.Find("Avatar/Sprite").GetComponent<Image>(),
+                        avatarID, avatarUrl 
+                    );
                     o.transform.Find("Name").GetComponent<Text>().text = nickname;
                     o.transform.Find("Score").GetComponent<Text>().text = score.ToString();
                     if (rankArea == 0) {
@@ -106,6 +110,7 @@ public class RankView : JCUnityLib.ViewBase, MenuBackInterface
                     int userID = itemInfo.Value<int>("userID");
                     int score = itemInfo.Value<int>("score");
                     int avatarID = itemInfo.Value<int>("avatarID");
+                    string avatarUrl = itemInfo.Value<string>("avatarUrl");
                     string nickname = itemInfo.Value<string>("nickname");
                     string country = itemInfo.Value<string>("country");
                     GameObject o = GetMyRankItem();
@@ -117,7 +122,10 @@ public class RankView : JCUnityLib.ViewBase, MenuBackInterface
                     if (rankNum >= 4) {
                         o.transform.Find("RankNum").GetComponent<Text>().text = rankNum.ToString();
                     }
-                    o.transform.Find("Avatar/Sprite").GetComponent<Image>().sprite = RoleMgr.GetAvatar(avatarID);
+                    RoleMgr.SetAvatarToImage(
+                        o.transform.Find("Avatar/Sprite").GetComponent<Image>(),
+                        avatarID, avatarUrl
+                    );
                     o.transform.Find("Name").GetComponent<Text>().text = nickname;
                     o.transform.Find("Score").GetComponent<Text>().text = score.ToString();
                     if (rankArea == 0) {

+ 1 - 2
Assets/BowArrow/Scripts/View/Home/RoleSelectView.cs

@@ -46,8 +46,7 @@ public class RoleSelectView : JCUnityLib.ViewBase, MenuBackInterface
                 RenderPlayer(playerIndex);
             });
         }
-        (Sprite sprite, string name) = RoleMgr.GetRoleInfo(roleID);
-        root.Find("Avatar").GetComponent<Image>().sprite = sprite;
+        string name = RoleMgr.GetRoleInfo(roleID, root.Find("Avatar").GetComponent<Image>());
         root.Find("Name").GetComponent<Text>().text = name;
     }
 

+ 10 - 5
Assets/BowArrow/Scripts/View/PKGameReadyView.cs

@@ -46,15 +46,20 @@ public class PKGameReadyView : MonoBehaviour
 
     void RenderPlayerInfo() {
         if (GlobalData.pkMatchType == PKMatchType.LocalPK) {
-            (Sprite avatar, string nickName) = RoleMgr.GetRoleInfo(PKGameMode.playerRoleIDs[pKGameMode.currentPlayerIndex]);
-            this.transform.Find("Panel/Avatar/Sprite").GetComponent<Image>().sprite = avatar;
+            string nickName = RoleMgr.GetRoleInfo(PKGameMode.playerRoleIDs[pKGameMode.currentPlayerIndex],
+                this.transform.Find("Panel/Avatar/Sprite").GetComponent<Image>());
             this.transform.Find("Panel/Name").GetComponent<Text>().text = nickName;
         }
         else if (GlobalData.pkMatchType == PKMatchType.OnlinePK) {
             int curPlayerIndex = pKGameMode_OnlinePK.gameLogic.currentPlayerIndex;
-            (Sprite avatar, string nickName) = RoleMgr.GetRoleInfo(GlobalData.matchPlayerInfos[curPlayerIndex].avatarID);
-            this.transform.Find("Panel/Avatar/Sprite").GetComponent<Image>().sprite = avatar;
-            this.transform.Find("Panel/Name").GetComponent<Text>().text = GlobalData.matchPlayerInfos[curPlayerIndex].nickname;
+            int avatarID = GlobalData.matchPlayerInfos[curPlayerIndex].avatarID;
+            string avatarUrl = GlobalData.matchPlayerInfos[curPlayerIndex].avatarUrl;
+            string nickname = GlobalData.matchPlayerInfos[curPlayerIndex].nickname;
+            RoleMgr.SetAvatarToImage(
+                this.transform.Find("Panel/Avatar/Sprite").GetComponent<Image>(),
+                avatarID, avatarUrl
+            );
+            this.transform.Find("Panel/Name").GetComponent<Text>().text = nickname;
         }
     }
 

+ 8 - 4
Assets/BowArrow/Scripts/View/PKGameReadyView_Challenge.cs

@@ -34,15 +34,19 @@ public class PKGameReadyView_Challenge : MonoBehaviour
     void RenderPlayerInfo() {
         if (GlobalData.pkMatchType == PKMatchType.LocalPK) {
             int curPlayerIndex = ((ChallengeGameModeLocalPK) gameMode).GetCurrentPlayIndex();
-            (Sprite avatar, string nickName) = RoleMgr.GetRoleInfo(GlobalData.localPK_playerRoleIDs[curPlayerIndex]);
-            this.transform.Find("Panel/Avatar/Sprite").GetComponent<Image>().sprite = avatar;
+            string nickName = RoleMgr.GetRoleInfo(GlobalData.localPK_playerRoleIDs[curPlayerIndex],
+                this.transform.Find("Panel/Avatar/Sprite").GetComponent<Image>());
             this.transform.Find("Panel/Name").GetComponent<Text>().text = nickName;
         }
         else if (GlobalData.pkMatchType == PKMatchType.OnlinePK) {
             int curPlayerIndex = ((ChallengeGameModeLocalPK) gameMode).GetCurrentPlayIndex();
-            Sprite avatar = RoleMgr.GetAvatar(GlobalData.matchPlayerInfos[curPlayerIndex].avatarID);
+            int avatarID = GlobalData.matchPlayerInfos[curPlayerIndex].avatarID;
+            string avatarUrl = GlobalData.matchPlayerInfos[curPlayerIndex].avatarUrl;
             string nickname = GlobalData.matchPlayerInfos[curPlayerIndex].nickname;
-            this.transform.Find("Panel/Avatar/Sprite").GetComponent<Image>().sprite = avatar;
+            RoleMgr.SetAvatarToImage(
+                this.transform.Find("Panel/Avatar/Sprite").GetComponent<Image>(),
+                avatarID, avatarUrl
+            );
             this.transform.Find("Panel/Name").GetComponent<Text>().text = nickname;
         }
     }

+ 7 - 5
Assets/BowArrow/Scripts/View/PKGameSettleView.cs

@@ -16,13 +16,15 @@ public class PKGameSettleView : MonoBehaviour
         for (int i = 1; i <= 2; i++) {
             if (GlobalData.pkMatchType == PKMatchType.OnlinePK) {
                 int playerIndex = i - 1;
-                (Sprite avatar, string nickName) = RoleMgr.GetRoleInfo(GlobalData.matchPlayerInfos[playerIndex].avatarID);
-                nickName = GlobalData.matchPlayerInfos[playerIndex].nickname;
-                this.transform.Find("Avatar" + i + "/Sprite").GetComponent<Image>().sprite = avatar;
+                int avatarID = GlobalData.matchPlayerInfos[playerIndex].avatarID;
+                string avatarUrl = GlobalData.matchPlayerInfos[playerIndex].avatarUrl;
+                string nickName = GlobalData.matchPlayerInfos[playerIndex].nickname;
+                RoleMgr.SetAvatarToImage(this.transform.Find("Avatar" + i + "/Sprite").GetComponent<Image>(),
+                    avatarID, avatarUrl);
                 this.transform.Find("Name" + i).GetComponent<Text>().text = nickName;
             } else if (GlobalData.pkMatchType == PKMatchType.LocalPK) {
-                (Sprite avatar, string nickName) = RoleMgr.GetRoleInfo(PKGameMode.playerRoleIDs[i - 1]);
-                this.transform.Find("Avatar" + i + "/Sprite").GetComponent<Image>().sprite = avatar;
+                string nickName = RoleMgr.GetRoleInfo(PKGameMode.playerRoleIDs[i - 1],
+                    this.transform.Find("Avatar" + i + "/Sprite").GetComponent<Image>());
                 this.transform.Find("Name" + i).GetComponent<Text>().text = nickName;
             }
             this.transform.Find("Win" + i).gameObject.SetActive(results[i - 1] == "胜利");

+ 25 - 12
Assets/BowArrow/Scripts/View/PKGameView.cs

@@ -43,23 +43,31 @@ public class PKGameView : MonoBehaviour
         }
         else if (GlobalData.pkMatchType == PKMatchType.OnlinePK) {
             if (GlobalData.matchPlayerInfos != null) {
-                RenderPlayerInfo_OnlinePK(1, GlobalData.matchPlayerInfos[0].avatarID, GlobalData.matchPlayerInfos[0].nickname);
-                RenderPlayerInfo_OnlinePK(2, GlobalData.matchPlayerInfos[1].avatarID, GlobalData.matchPlayerInfos[1].nickname);
+                RenderPlayerInfo_OnlinePK(1, 
+                    GlobalData.matchPlayerInfos[0].avatarID, 
+                    GlobalData.matchPlayerInfos[0].avatarUrl, 
+                    GlobalData.matchPlayerInfos[0].nickname);
+                RenderPlayerInfo_OnlinePK(2, 
+                    GlobalData.matchPlayerInfos[1].avatarID, 
+                    GlobalData.matchPlayerInfos[1].avatarUrl, 
+                    GlobalData.matchPlayerInfos[1].nickname);
             }
         }
     }
 
     void RenderPlayerInfo_LockPK(int posNum, int roleID)
     {
-        (Sprite avatar, string nickName) = RoleMgr.GetRoleInfo(roleID);
-        this.transform.Find("TotalScore/Avatar" + posNum + "/Sprite").GetComponent<Image>().sprite = avatar;
+        string nickName = RoleMgr.GetRoleInfo(roleID,
+            this.transform.Find("TotalScore/Avatar" + posNum + "/Sprite").GetComponent<Image>());
         this.transform.Find("TotalScore/Name" + posNum).GetComponent<Text>().text = nickName;
     }
 
-    void RenderPlayerInfo_OnlinePK(int posNum, int roleID, string nickname)
+    void RenderPlayerInfo_OnlinePK(int posNum, int avatarID, string avatarUrl, string nickname)
     {
-        (Sprite avatar, string _) = RoleMgr.GetRoleInfo(roleID);
-        this.transform.Find("TotalScore/Avatar" + posNum + "/Sprite").GetComponent<Image>().sprite = avatar;
+        RoleMgr.SetAvatarToImage(
+            this.transform.Find("TotalScore/Avatar" + posNum + "/Sprite").GetComponent<Image>(),
+            avatarID, avatarUrl
+        );
         this.transform.Find("TotalScore/Name" + posNum).GetComponent<Text>().text = nickname;
     }
 
@@ -84,8 +92,8 @@ public class PKGameView : MonoBehaviour
         if (currentPlayerIndex != pKGameMode.currentPlayerIndex)
         {
             currentPlayerIndex = pKGameMode.currentPlayerIndex;
-            (Sprite avatar, string nickName) = RoleMgr.GetRoleInfo(PKGameMode.playerRoleIDs[currentPlayerIndex]);
-            this.transform.Find("CurrentPlayer/Avatar").GetComponent<Image>().sprite = avatar;
+            string nickName = RoleMgr.GetRoleInfo(PKGameMode.playerRoleIDs[currentPlayerIndex],
+                this.transform.Find("CurrentPlayer/Avatar").GetComponent<Image>());
             this.transform.Find("CurrentPlayer/Name").GetComponent<Text>().text = nickName;
         }
         if (currentPlayerIndex == pKGameMode.currentPlayerIndex) 
@@ -107,9 +115,14 @@ public class PKGameView : MonoBehaviour
         {
             currentPlayerIndex = pKGameMode_OnlinePK.gameLogic.currentPlayerIndex;
             if (GlobalData.matchPlayerInfos != null) {
-                (Sprite avatar, string nickName) = RoleMgr.GetRoleInfo(GlobalData.matchPlayerInfos[currentPlayerIndex].avatarID);
-                this.transform.Find("CurrentPlayer/Avatar").GetComponent<Image>().sprite = avatar;
-                this.transform.Find("CurrentPlayer/Name").GetComponent<Text>().text = GlobalData.matchPlayerInfos[currentPlayerIndex].nickname;
+                int avatarID = GlobalData.matchPlayerInfos[currentPlayerIndex].avatarID;
+                string avatarUrl = GlobalData.matchPlayerInfos[currentPlayerIndex].avatarUrl;
+                string nickName = GlobalData.matchPlayerInfos[currentPlayerIndex].nickname;
+                RoleMgr.SetAvatarToImage(
+                    this.transform.Find("CurrentPlayer/Avatar").GetComponent<Image>(),
+                    avatarID, avatarUrl
+                );
+                this.transform.Find("CurrentPlayer/Name").GetComponent<Text>().text = nickName;
             }
         }
         if (currentPlayerIndex == pKGameMode_OnlinePK.gameLogic.currentPlayerIndex) 

+ 10 - 6
Assets/BowArrow/Scripts/View/PKMatchingView.cs

@@ -55,10 +55,11 @@ public class PKMatchingView : MonoBehaviour, MenuBackInterface
     {
         PersistenHandler.ins?.menuBackCtr.views.Add(this);
 
-        Sprite avatar = RoleMgr.GetAvatar(LoginMgr.myUserInfo.avatarID);
+        int avatarID = LoginMgr.myUserInfo.avatarID;
+        string avatarUrl = LoginMgr.myUserInfo.avatarUrl;
         string nickname = LoginMgr.myUserInfo.nickname;
-        RenderPlayerInfo(1, avatar, nickname, true);
-        RenderPlayerInfo(2, null, "", false);
+        RenderPlayerInfo(1, avatarID, avatarUrl, nickname, true);
+        RenderPlayerInfo(2, RoleMgr.NullAvatarID, "", "", false);
 
         if (isFriendPKInviter || isFriendPKInvitee) {
             RenderTip(TextAutoLanguage2.GetTextByKey("pk-match_match-waiting1"));
@@ -90,7 +91,7 @@ public class PKMatchingView : MonoBehaviour, MenuBackInterface
     public void EnterGameSceneOnMatchSuccess() {
         int otherIndex = (GlobalData.playerIndexInRoom + 1) % 2;
         MatchPlayerInfo info = GlobalData.matchPlayerInfos[otherIndex];
-        RenderPlayerInfo(2, RoleMgr.GetAvatar(info.avatarID), info.nickname, true);
+        RenderPlayerInfo(2, info.avatarID, info.avatarUrl, info.nickname, true);
         RenderTip(TextAutoLanguage2.GetTextByKey("pk-match_match-success"));
         HideBtnBack();
         PauseWaitingTime();
@@ -118,14 +119,17 @@ public class PKMatchingView : MonoBehaviour, MenuBackInterface
         waitingTime = -1;
     }
 
-    void RenderPlayerInfo(int playerID, Sprite avatar, string nickname, bool active) {
+    void RenderPlayerInfo(int playerID, int avatarID, string avatarUrl, string nickname, bool active) {
         this.transform.Find($"BoxRight/Player{playerID}/NameBox")
             .GetComponentInChildren<Text>().text = active
                 ? nickname 
                 : TextAutoLanguage2.GetTextByKey("pk-match_wait-to-join");
         Transform avatarT = this.transform.Find($"BoxRight/Player{playerID}/MatchHeadBG/Avatar");
         avatarT.gameObject.SetActive(active);
-        avatarT.Find("Sprite").GetComponent<Image>().sprite = avatar;
+        RoleMgr.SetAvatarToImage(
+            avatarT.Find("Sprite").GetComponent<Image>(),
+            avatarID, avatarUrl       
+        );
     }
 
     void ChangeMatchHeadBG(int typeIndex) {

+ 4 - 1
Assets/BowArrow/Scripts/View/TimeLimitGameView.cs

@@ -20,7 +20,10 @@ public class TimeLimitGameView : MonoBehaviour
 
         gameMode = (TimeLimitGameMode) GameMgr.ins.gameMode;
         nickNameTxt.text = LoginMgr.myUserInfo.nickname;
-        this.transform.Find("Avatar/Image/Sprite").GetComponent<Image>().sprite = RoleMgr.GetAvatar(LoginMgr.myUserInfo.avatarID);
+        RoleMgr.SetAvatarToImage(
+            transform.Find("Avatar/Image/Sprite").GetComponent<Image>(),
+            LoginMgr.myUserInfo.avatarID, LoginMgr.myUserInfo.avatarUrl
+        );
 
         if (GlobalData.pkMatchType == PKMatchType.None && UserSettings.ins.trainMode) {
             timeTxt.transform.parent.gameObject.SetActive(false);

+ 4 - 3
Assets/HeartRateBand/Views/Me/HRB_MeView.cs

@@ -123,7 +123,7 @@ public class HRB_MeView : JCUnityLib.ViewBase, MenuBackInterface
             }
         }
         nameText.text = HRB_UserInfo.current.nickname;
-        avatarImage.sprite = RoleMgr.GetAvatar(HRB_UserInfo.current.avatarID);
+        RoleMgr.SetAvatarToImage(avatarImage, HRB_UserInfo.current.avatarID, "");
         // HomeView.ins.RenderNameOrGender();
     }
 
@@ -186,7 +186,8 @@ public class HRB_MeView : JCUnityLib.ViewBase, MenuBackInterface
                 for (int id = 0; id < RoleMgr.GetAvatarListLen(); id++) {
                     if (RoleMgr.IsRoleAvatar(id)) continue;
                     GameObject avatar = GameObject.Instantiate(avatarPrefab, gridLayoutGroup.transform);
-                    avatar.transform.Find("Mask/Sprite").GetComponent<Image>().sprite = RoleMgr.GetAvatar(id);
+                    Image avatarImage = avatar.transform.Find("Mask/Sprite").GetComponent<Image>();
+                    RoleMgr.SetAvatarToImage(avatarImage, id, "");
                     avatar.transform.Find("Check").gameObject.SetActive(id == curAvatarSelectID);
                     avatar.gameObject.name = id.ToString();
                     int aid = id; //记录该值
@@ -211,7 +212,7 @@ public class HRB_MeView : JCUnityLib.ViewBase, MenuBackInterface
             if (curAvatarSelectID != HRB_UserInfo.current.avatarID) {
                 HRB_UserInfo.current.avatarID = curAvatarSelectID;
                 //render
-                avatarImage.sprite = RoleMgr.GetAvatar(curAvatarSelectID);
+                RoleMgr.SetAvatarToImage(avatarImage, curAvatarSelectID, "");
                 // HomeView.ins.RenderMyAvatarSprite();
                 //save data
                 HRB_UserInfo.current.Save();