WX-Game1/Assets/Scripts/Component/FriendItemComponent.cs

240 lines
7.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using Cysharp.Threading.Tasks;
using DefaultNamespace;
using TMPro;
namespace DefaultNamespace.Component
{
/// <summary>
/// 好友项组件 - 负责单个好友项的显示和头像下载
/// </summary>
public class FriendItemComponent : MonoBehaviour
{
[Header("UI组件引用")]
[SerializeField] private RawImage avatarImage; // 头像图片组件
[SerializeField] private TMP_Text usernameText; // 用户名文本组件
[SerializeField] private TMP_Text levelText; // 等级文本组件
[Header("调试设置")]
[SerializeField] private bool enableDebugLog = true; // 是否启用调试日志
// 私有字段
private FriendData friendData; // 好友数据
private static readonly Dictionary<string, Texture2D> imageCache = new Dictionary<string, Texture2D>(); // 图片缓存
/// <summary>
/// 初始化好友项数据
/// </summary>
/// <param name="data">好友数据</param>
public void InitializeFriendItem(FriendData data)
{
if (data == null)
{
LogDebug("好友数据为空,无法初始化");
return;
}
friendData = data;
LogDebug($"开始初始化好友项: {data.user_username}");
// 设置用户名和等级
SetUserInfo(data);
// 异步下载头像
DownloadAvatarAsync(data.user_image).Forget();
}
/// <summary>
/// 设置用户信息(用户名和等级)
/// </summary>
/// <param name="data">好友数据</param>
private void SetUserInfo(FriendData data)
{
try
{
// 设置用户名
if (usernameText != null)
{
usernameText.text = string.IsNullOrEmpty(data.user_username) ? "未知用户" : data.user_username;
LogDebug($"设置用户名: {usernameText.text}");
}
else
{
LogDebug("用户名文本组件未设置");
}
// 设置等级
if (levelText != null)
{
levelText.text = $"等级: {data.user_honor_level}";
LogDebug($"设置等级: {levelText.text}");
}
else
{
LogDebug("等级文本组件未设置");
}
}
catch (Exception ex)
{
LogDebug($"设置用户信息时发生异常: {ex.Message}");
}
}
/// <summary>
/// 异步下载头像
/// </summary>
/// <param name="imageUrl">头像URL</param>
/// <returns>UniTask</returns>
private async UniTask DownloadAvatarAsync(string imageUrl)
{
try
{
// 检查URL是否有效
if (string.IsNullOrEmpty(imageUrl))
{
LogDebug("头像URL为空使用默认头像");
return;
}
LogDebug($"开始下载头像: {imageUrl}");
// 检查缓存中是否已存在该图片
if (imageCache.ContainsKey(imageUrl))
{
LogDebug("从缓存中获取头像");
SetAvatarTexture(imageCache[imageUrl]);
return;
}
// 使用UnityWebRequest下载图片
using (UnityWebRequest request = UnityWebRequestTexture.GetTexture(imageUrl))
{
// 设置超时时间
request.timeout = 10;
LogDebug("发送头像下载请求");
await request.SendWebRequest();
// 检查请求结果
if (request.result == UnityWebRequest.Result.Success)
{
LogDebug("头像下载成功");
// 获取下载的纹理
Texture2D texture = DownloadHandlerTexture.GetContent(request);
if (texture != null)
{
// 添加到缓存
imageCache[imageUrl] = texture;
// 设置头像
SetAvatarTexture(texture);
LogDebug($"头像设置完成,尺寸: {texture.width}x{texture.height}");
}
else
{
LogDebug("下载的纹理为空,使用默认头像");
}
}
else
{
LogDebug($"头像下载失败: {request.error}");
}
}
}
catch (Exception ex)
{
LogDebug($"下载头像时发生异常: {ex.Message}");
}
}
/// <summary>
/// 设置头像纹理
/// </summary>
/// <param name="texture">要设置的纹理</param>
private void SetAvatarTexture(Texture2D texture)
{
try
{
if (avatarImage != null && texture != null)
{
avatarImage.texture = texture;
LogDebug("头像纹理设置成功");
}
else
{
LogDebug("头像图片组件未设置或纹理为空");
}
}
catch (Exception ex)
{
LogDebug($"设置头像纹理时发生异常: {ex.Message}");
}
}
/// <summary>
/// 记录调试日志
/// </summary>
/// <param name="message">日志消息</param>
private void LogDebug(string message)
{
if (enableDebugLog)
{
Debug.Log($"[FriendItemComponent] {message}");
}
}
/// <summary>
/// 获取当前好友数据
/// </summary>
/// <returns>好友数据</returns>
public FriendData GetFriendData()
{
return friendData;
}
/// <summary>
/// 清理缓存(静态方法,可在需要时调用)
/// </summary>
public static void ClearCache()
{
try
{
// 清理纹理缓存
foreach (var texture in imageCache.Values)
{
if (texture != null)
{
DestroyImmediate(texture);
}
}
imageCache.Clear();
Debug.Log("[FriendItemComponent] 图片缓存已清理");
}
catch (Exception ex)
{
Debug.LogError($"[FriendItemComponent] 清理缓存时发生异常: {ex.Message}");
}
}
/// <summary>
/// 获取缓存统计信息
/// </summary>
/// <returns>缓存统计信息</returns>
public static string GetCacheStats()
{
return $"纹理缓存: {imageCache.Count} 个";
}
}
}