Files
5.24BuYu/Assets/MyGame/aa/UI/Home/Sub/UserInfoPanel.cs
T
2026-07-01 14:40:41 +08:00

219 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 Assets.Framework.Tool;
using Assets.MyGame.Scripts.Net;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 用户信息面板(设置已分离至 SettingPanel)
/// </summary>
public class UserInfoPanel : SubUIBase
{
[Header("基础信息")]
public Image sprite_Avatar; // 显示已保存的用户头像(点使用后更新)
public Button btn_ChangeUser;
public TextMeshProUGUI tMPText_Name;
public TextMeshProUGUI tMPText_ID;
public TextMeshProUGUI tMPText_UserNumber;
public TextMeshProUGUI tMPText_LabelQM;
public TextMeshProUGUI tMPText_IP;
public TextMeshProUGUI tMPText_VIPLeave;
public TextMeshProUGUI tMPText_PhoneNumber;
[Header("头像选择")]
public Image img_ShowAvatar; // 预览头像(选中即更新)
public Toggle prefab_AvatarItem; // 头像选项预制体(child0=Image, child2=选中对号)
public Button btn_UseAvatar; // 确认使用按钮
public Transform parent_AvatarList;
GameManager gameManager => GameManager.Instance;
private List<Toggle> _avatarToggles = new List<Toggle>();
private string _pendingAvatarName; // 选中的待确认头像名
public override void Awake()
{
base.Awake();
btn_ChangeUser.onClick.AddListener(() =>
{
gameManager.Logout();
});
btn_UseAvatar.onClick.AddListener(OnClickUseAvatar);
}
protected override void OnShow(object args = null)
{
base.OnShow(args);
InitInformation();
BuildAvatarList();
// 监听头像变更
gameManager.OnAvatarChanged += OnAvatarChanged;
}
protected override void OnHide()
{
base.OnHide();
gameManager.OnAvatarChanged -= OnAvatarChanged;
// 清理 toggle 列表
_avatarToggles.Clear();
}
// ==================== 基础信息 ====================
private void InitInformation()
{
tMPText_Name.color = gameManager.user.BaseInfo.isRedName ? Color.red : Color.white;
// 初始化两个头像(正式头像 和 预览头像)都为当前已保存的头像
LoadAvatarImage(sprite_Avatar, gameManager.user.BaseInfo.avatarUrl);
LoadAvatarImage(img_ShowAvatar, gameManager.user.BaseInfo.avatarUrl);
tMPText_Name.text = gameManager.user.BaseInfo.userName;
tMPText_ID.text = gameManager.user.BaseInfo.number;
tMPText_UserNumber.text = gameManager.user.BaseInfo.mobile;
tMPText_LabelQM.text = PlayerPrefs.GetString("QM", "我比较懒,什么都没写");
tMPText_IP.text = gameManager.user.@static.lastLoginIp;
tMPText_VIPLeave.text = gameManager.user.assets.vipLevel.ToString();
tMPText_PhoneNumber.text = MaskPhone(gameManager.user.BaseInfo.mobile);
}
// ==================== 头像加载 ====================
private void LoadAvatarImage(Image target, string avatarUrl)
{
if (target == null) return;
var sprite = gameManager.GetAvatarSprite(avatarUrl);
if (sprite != null)
{
target.sprite = sprite;
}
else if (!int.TryParse(avatarUrl, out _))
{
WebTool.DownImage(avatarUrl, (texture) =>
{
if (texture != null && target != null)
target.sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.one * 0.5f);
});
}
}
// ==================== 头像列表 ====================
/// <summary>当前装备的头像名(从服务器数据读取)</summary>
private string _equippedAvatarName;
private void BuildAvatarList()
{
if (prefab_AvatarItem == null || parent_AvatarList == null) return;
for (int i = parent_AvatarList.childCount - 1; i >= 0; i--)
Destroy(parent_AvatarList.GetChild(i).gameObject);
_avatarToggles.Clear();
gameManager.InitAvatarCache();
var allSprites = Resources.LoadAll<Sprite>("Avatar");
_equippedAvatarName = gameManager.user.BaseInfo.avatarUrl;
_pendingAvatarName = _equippedAvatarName;
foreach (var sprite in allSprites)
{
var obj = Instantiate(prefab_AvatarItem, parent_AvatarList);
string avatarName = sprite.name;
// child(0) = 头像图片
if (obj.transform.childCount > 0)
{
var img = obj.transform.GetChild(0).GetComponent<Image>();
if (img != null) img.sprite = sprite;
}
// child(2) = 装备中对号(只在已装备的头像上显示,不跟随选中状态)
Transform checkMark = obj.transform.childCount > 2 ? obj.transform.GetChild(2) : null;
if (checkMark != null)
checkMark.gameObject.SetActive(avatarName == _equippedAvatarName);
var toggle = obj.GetComponent<Toggle>();
if (toggle == null) continue;
// 禁用 Toggle 自带的过渡效果(面板上已设置好选中高亮)
toggle.transition = Selectable.Transition.None;
// 初始选中已装备的头像
toggle.isOn = (avatarName == _equippedAvatarName);
_avatarToggles.Add(toggle);
toggle.onValueChanged.AddListener(isOn =>
{
if (!isOn) return;
_pendingAvatarName = avatarName;
// 预览头像实时更新
if (img_ShowAvatar != null)
img_ShowAvatar.sprite = sprite;
// 单选:关闭其他 toggle(对号不动,只到点"使用"才切换)
foreach (var t in _avatarToggles)
{
if (t == toggle) continue;
t.SetIsOnWithoutNotify(false);
}
});
}
}
/// <summary>点击"使用"按钮 → 确认切换装备头像</summary>
private void OnClickUseAvatar()
{
if (string.IsNullOrEmpty(_pendingAvatarName))
{
Debug.Log("[UserInfoPanel] 未选中头像");
return;
}
if (_pendingAvatarName == _equippedAvatarName)
{
Debug.Log("[UserInfoPanel] 未改变头像");
return;
}
// 更新正式头像显示
LoadAvatarImage(sprite_Avatar, _pendingAvatarName);
// 上传到服务器(成功后 OnAvatarChanged 会切换对号)
gameManager.ApplyAvatar(_pendingAvatarName);
}
/// <summary>头像变更回调(服务器返回后),把对号从旧装备头像切到新的</summary>
private void OnAvatarChanged(Sprite sprite)
{
if (sprite_Avatar != null && sprite != null)
sprite_Avatar.sprite = sprite;
if (img_ShowAvatar != null && sprite != null)
img_ShowAvatar.sprite = sprite;
// 更新装备中的头像名
_equippedAvatarName = _pendingAvatarName;
// 切换对号:隐藏旧的、显示新的
foreach (var t in _avatarToggles)
{
if (t == null || t.transform.childCount <= 2) continue;
var img = t.transform.GetChild(0).GetComponent<Image>();
bool isEquipped = img != null && img.sprite != null && img.sprite.name == _equippedAvatarName;
t.transform.GetChild(2).gameObject.SetActive(isEquipped);
}
}
// ==================== 工具 ====================
public static string MaskPhone(string phone)
{
if (string.IsNullOrEmpty(phone) || phone.Length <= 6)
return phone;
int prefix = 3;
int suffix = 3;
int maskCount = phone.Length - prefix - suffix;
return phone.Substring(0, prefix) + new string('*', maskCount) + phone.Substring(phone.Length - suffix);
}
}