1
This commit is contained in:
@@ -20,16 +20,22 @@ public class UserInfoPanel : SubUIBase
|
||||
public TextMeshProUGUI tMPText_IP;
|
||||
public TextMeshProUGUI tMPText_VIPLeave;
|
||||
public TextMeshProUGUI tMPText_PhoneNumber;
|
||||
|
||||
[Header("头像选择")]
|
||||
[Header("预览")]
|
||||
public Image img_ShowAvatar; // 预览头像(选中即更新)
|
||||
public Toggle prefab_AvatarItem; // 头像选项预制体(child0=Image, child2=选中对号)
|
||||
public Image img_ShowAvatarK; // 预览头像框(选中即更新)
|
||||
public Button btn_UseAvatar; // 确认使用按钮
|
||||
[Header("头像选择")]
|
||||
public Transform parent_AvatarList;
|
||||
[Header("头像框选择")]
|
||||
public Transform parent_AvatarKList;
|
||||
|
||||
public Toggle prefab_AvatarItem; // 头像/头像框选项预制体(child0=Image, child2=选中对号)
|
||||
|
||||
GameManager gameManager => GameManager.Instance;
|
||||
private List<Toggle> _avatarToggles = new List<Toggle>();
|
||||
private List<Toggle> _avatarFrameToggles = new List<Toggle>();
|
||||
private string _pendingAvatarName; // 选中的待确认头像名
|
||||
private string _pendingAvatarFrameName; // 选中的待确认头像框名
|
||||
|
||||
public override void Awake()
|
||||
{
|
||||
@@ -46,16 +52,20 @@ public class UserInfoPanel : SubUIBase
|
||||
base.OnShow(args);
|
||||
InitInformation();
|
||||
BuildAvatarList();
|
||||
// 监听头像变更
|
||||
BuildAvatarFrameList();
|
||||
// 监听变更
|
||||
gameManager.OnAvatarChanged += OnAvatarChanged;
|
||||
gameManager.OnAvatarFrameChanged += OnAvatarFrameChanged;
|
||||
}
|
||||
|
||||
protected override void OnHide()
|
||||
{
|
||||
base.OnHide();
|
||||
gameManager.OnAvatarChanged -= OnAvatarChanged;
|
||||
gameManager.OnAvatarFrameChanged -= OnAvatarFrameChanged;
|
||||
// 清理 toggle 列表
|
||||
_avatarToggles.Clear();
|
||||
_avatarFrameToggles.Clear();
|
||||
}
|
||||
|
||||
// ==================== 基础信息 ====================
|
||||
@@ -64,10 +74,13 @@ public class UserInfoPanel : SubUIBase
|
||||
{
|
||||
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);
|
||||
|
||||
// 初始化头像框预览
|
||||
LoadAvatarFrameImage(img_ShowAvatarK, gameManager.user.BaseInfo.avatarFrame);
|
||||
|
||||
tMPText_Name.text = gameManager.user.BaseInfo.userName;
|
||||
tMPText_ID.text = gameManager.user.BaseInfo.number;
|
||||
tMPText_UserNumber.text = gameManager.user.BaseInfo.mobile;
|
||||
@@ -98,6 +111,14 @@ public class UserInfoPanel : SubUIBase
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadAvatarFrameImage(Image target, string avatarFrameName)
|
||||
{
|
||||
if (target == null) return;
|
||||
var sprite = gameManager.GetAvatarFrameSprite(avatarFrameName);
|
||||
if (sprite != null)
|
||||
target.sprite = sprite;
|
||||
}
|
||||
|
||||
// ==================== 头像列表 ====================
|
||||
|
||||
/// <summary>当前装备的头像名(从服务器数据读取)</summary>
|
||||
@@ -136,7 +157,10 @@ public class UserInfoPanel : SubUIBase
|
||||
var toggle = obj.GetComponent<Toggle>();
|
||||
if (toggle == null) continue;
|
||||
|
||||
// 禁用 Toggle 自带的过渡效果(面板上已设置好选中高亮)
|
||||
// 加入父对象的 ToggleGroup 实现单选
|
||||
toggle.group = parent_AvatarList.GetComponent<ToggleGroup>();
|
||||
|
||||
// 禁用 Toggle 自带的过渡效果
|
||||
toggle.transition = Selectable.Transition.None;
|
||||
// 初始选中已装备的头像
|
||||
toggle.isOn = (avatarName == _equippedAvatarName);
|
||||
@@ -152,38 +176,107 @@ public class UserInfoPanel : SubUIBase
|
||||
// 预览头像实时更新
|
||||
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 string _equippedAvatarFrameName;
|
||||
|
||||
private void BuildAvatarFrameList()
|
||||
{
|
||||
if (prefab_AvatarItem == null || parent_AvatarKList == null) return;
|
||||
|
||||
for (int i = parent_AvatarKList.childCount - 1; i >= 0; i--)
|
||||
Destroy(parent_AvatarKList.GetChild(i).gameObject);
|
||||
_avatarFrameToggles.Clear();
|
||||
|
||||
gameManager.InitAvatarFrameCache();
|
||||
var allSprites = Resources.LoadAll<Sprite>("AvatarK");
|
||||
_equippedAvatarFrameName = gameManager.user.BaseInfo.avatarFrame;
|
||||
_pendingAvatarFrameName = _equippedAvatarFrameName;
|
||||
|
||||
foreach (var sprite in allSprites)
|
||||
{
|
||||
var obj = Instantiate(prefab_AvatarItem, parent_AvatarKList);
|
||||
string frameName = sprite.name;
|
||||
|
||||
// child(0) = 头像框图片
|
||||
if (obj.transform.childCount > 0)
|
||||
{
|
||||
var img = obj.transform.GetChild(0).GetComponent<Image>();
|
||||
if (img != null) img.sprite = sprite;
|
||||
// 头像框可以设置 SetNativeSize 保持比例
|
||||
//if (img != null) img.SetNativeSize();
|
||||
}
|
||||
|
||||
// child(2) = 装备中对号(只在已装备的头像框上显示)
|
||||
Transform checkMark = obj.transform.childCount > 2 ? obj.transform.GetChild(2) : null;
|
||||
if (checkMark != null)
|
||||
checkMark.gameObject.SetActive(frameName == _equippedAvatarFrameName);
|
||||
|
||||
var toggle = obj.GetComponent<Toggle>();
|
||||
if (toggle == null) continue;
|
||||
|
||||
// 加入父对象的 ToggleGroup 实现单选
|
||||
toggle.group = parent_AvatarKList.GetComponent<ToggleGroup>();
|
||||
|
||||
// 禁用 Toggle 自带的过渡效果
|
||||
toggle.transition = Selectable.Transition.None;
|
||||
// 初始选中已装备的头像框
|
||||
toggle.isOn = (frameName == _equippedAvatarFrameName);
|
||||
|
||||
_avatarFrameToggles.Add(toggle);
|
||||
|
||||
toggle.onValueChanged.AddListener(isOn =>
|
||||
{
|
||||
if (!isOn) return;
|
||||
|
||||
_pendingAvatarFrameName = frameName;
|
||||
|
||||
// 预览头像框实时更新
|
||||
if (img_ShowAvatarK != null)
|
||||
img_ShowAvatarK.sprite = sprite;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>头像变更回调(服务器返回后),把对号从旧装备头像切到新的</summary>
|
||||
// ==================== 确认使用 ====================
|
||||
|
||||
/// <summary>点击"使用"按钮 → 确认切换装备头像/头像框</summary>
|
||||
private void OnClickUseAvatar()
|
||||
{
|
||||
// 优先判断是否有头像更改
|
||||
bool avatarChanged = !string.IsNullOrEmpty(_pendingAvatarName)
|
||||
&& _pendingAvatarName != _equippedAvatarName;
|
||||
|
||||
// 判断是否有头像框更改
|
||||
bool frameChanged = !string.IsNullOrEmpty(_pendingAvatarFrameName)
|
||||
&& _pendingAvatarFrameName != _equippedAvatarFrameName;
|
||||
|
||||
if (avatarChanged)
|
||||
{
|
||||
LoadAvatarImage(sprite_Avatar, _pendingAvatarName);
|
||||
gameManager.ApplyAvatar(_pendingAvatarName);
|
||||
}
|
||||
|
||||
if (frameChanged)
|
||||
{
|
||||
LoadAvatarFrameImage(img_ShowAvatarK, _pendingAvatarFrameName);
|
||||
gameManager.ApplyAvatarFrame(_pendingAvatarFrameName);
|
||||
}
|
||||
|
||||
if (!avatarChanged && !frameChanged)
|
||||
{
|
||||
Debug.Log("[UserInfoPanel] 未改变头像或头像框");
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 变更回调 ====================
|
||||
|
||||
/// <summary>头像变更回调(服务器返回后),同步预览和列表对号</summary>
|
||||
private void OnAvatarChanged(Sprite sprite)
|
||||
{
|
||||
if (sprite_Avatar != null && sprite != null)
|
||||
@@ -191,7 +284,6 @@ public class UserInfoPanel : SubUIBase
|
||||
if (img_ShowAvatar != null && sprite != null)
|
||||
img_ShowAvatar.sprite = sprite;
|
||||
|
||||
// 更新装备中的头像名
|
||||
_equippedAvatarName = _pendingAvatarName;
|
||||
|
||||
// 切换对号:隐藏旧的、显示新的
|
||||
@@ -204,6 +296,24 @@ public class UserInfoPanel : SubUIBase
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>头像框变更回调(服务器返回后),同步预览和列表对号</summary>
|
||||
private void OnAvatarFrameChanged(Sprite sprite)
|
||||
{
|
||||
if (img_ShowAvatarK != null && sprite != null)
|
||||
img_ShowAvatarK.sprite = sprite;
|
||||
|
||||
_equippedAvatarFrameName = _pendingAvatarFrameName;
|
||||
|
||||
// 切换对号:隐藏旧的、显示新的
|
||||
foreach (var t in _avatarFrameToggles)
|
||||
{
|
||||
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 == _equippedAvatarFrameName;
|
||||
t.transform.GetChild(2).gameObject.SetActive(isEquipped);
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 工具 ====================
|
||||
|
||||
public static string MaskPhone(string phone)
|
||||
|
||||
Reference in New Issue
Block a user