This commit is contained in:
2026-06-21 18:20:55 +08:00
parent 68c5482be8
commit 5f2c6d8ecd
110 changed files with 8080 additions and 532 deletions
@@ -23,6 +23,20 @@ public class GameManager : MonoSingleton<GameManager>
public UserData user;
public GameData gameData = new GameData();
public Scene scene;
/// <summary>
/// 头像更新事件(换了头像后触发,所有头像控件统一刷新)
/// </summary>
public event Action<Sprite> OnAvatarChanged;
/// <summary>头像字典(name → sprite),从 Resources/Avatar 加载</summary>
private Dictionary<string, Sprite> avatarSpriteDict = new Dictionary<string, Sprite>();
/// <summary>触发头像更新事件</summary>
public void TriggerAvatarChanged(Sprite sprite)
{
OnAvatarChanged?.Invoke(sprite);
}
public CameraShaker cameraShake;
public Camera ZhuCam;
@@ -42,6 +56,43 @@ public class GameManager : MonoSingleton<GameManager>
// });
//#endif
// }
/// <summary>
/// 初始化头像缓存(从 Resources/Avatar 加载所有Sprite)
/// </summary>
public void InitAvatarCache()
{
avatarSpriteDict.Clear();
var sprites = Resources.LoadAll<Sprite>("Avatar");
foreach (var s in sprites)
avatarSpriteDict[s.name] = s;
}
/// <summary>
/// 根据名称获取头像 Sprite
/// </summary>
public Sprite GetAvatarSprite(string avatarName)
{
if (avatarSpriteDict.Count == 0) InitAvatarCache();
avatarSpriteDict.TryGetValue(avatarName, out var sprite);
return sprite;
}
/// <summary>
/// 更换头像:上传服务端 → 更新本地 → 触发全局刷新
/// </summary>
public void ApplyAvatar(string avatarUrl)
{
APIRequestList.UpdateAvatar(avatarUrl, (result) =>
{
user.BaseInfo.avatarUrl = avatarUrl;
user.BaseInfo.avatarSprite = null;
var sprite = GetAvatarSprite(avatarUrl);
TriggerAvatarChanged(sprite);
});
}
public void UpdataUserData(UserData user)
{
this.user = user;
@@ -42,4 +42,14 @@ namespace Assets.MyGame.Scripts.Net.APIRequest.Params
/// <summary>邮件 ID(type=1 时必填)</summary>
public string id;
}
/// <summary>
/// 更新头像参数(GET)
/// </summary>
[Serializable]
public class UpdateAvatarParam : RequestParamBase
{
/// <summary>头像地址或ID</summary>
public string avatarUrl;
}
}
@@ -81,6 +81,19 @@ namespace Assets.MyGame.Scripts.Net
userid=userID
}, callback);
}
/// <summary>
/// 更新头像(GET)
/// 参数:avatarUrl(头像地址或ID)
/// </summary>
public static void UpdateAvatar(string avatarUrl, Action<string> callback = null)
{
APIManager.Response<string>(APIType.User_UpdateAvatar, new UpdateAvatarParam
{
avatarUrl = avatarUrl
}, callback);
}
#endregion
#region Notice_公告
@@ -10,16 +10,38 @@ public class UserBaseInfo
public Sprite avatarSprite;
public IEnumerator DownSprite(System.Action<Sprite> action)
{
string url = avatarUrl;
int downCount = 5;
if (avatarSprite != null)
{
action?.Invoke(avatarSprite);
yield break;
}
if (!string.IsNullOrEmpty(avatarUrl))
{
// 优先从 GameManager 头像缓存读取(兼容图集切片命名)
avatarSprite = GameManager.Instance.GetAvatarSprite(avatarUrl);
if (avatarSprite != null)
{
action?.Invoke(avatarSprite);
yield break;
}
// 回退:数字ID用 Resources.Load(单图PNG)
if (int.TryParse(avatarUrl, out int id) && id > 0)
{
avatarSprite = Resources.Load<Sprite>($"Avatar/{id}");
if (avatarSprite != null)
{
action?.Invoke(avatarSprite);
yield break;
}
}
}
// 网络URL下载
string url = avatarUrl;
int downCount = 5;
Texture2D avatarTexture2D = new Texture2D(100, 100);
//if (avatarTexture2D == null)
for (int i = 0; i < downCount; i++)
{
using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(url))
@@ -30,29 +52,17 @@ public class UserBaseInfo
{
Debug.LogError("下载失败: " + www.error);
downCount--;
if (downCount == 0)
{
yield break;
//action.Invoke(Sprite.Create(new Texture2D(100, 100), new Rect(0, 0, 100, 100), new Vector2(0.5f, 0.5f)));
}
if (downCount == 0) yield break;
}
else
{
avatarTexture2D = DownloadHandlerTexture.GetContent(www);
avatarSprite = Sprite.Create(avatarTexture2D, new Rect(0, 0, avatarTexture2D.width, avatarTexture2D.height), new Vector2(0.5f, 0.5f));
break;
}
}
}
action?.Invoke(avatarSprite);
}
public void UpdateAvatar(System.Action<Sprite> action)
{