1
This commit is contained in:
@@ -100,102 +100,70 @@ public class UserInfoPanel : SubUIBase
|
||||
|
||||
// ==================== 头像列表 ====================
|
||||
|
||||
/// <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");
|
||||
string currentAvatar = gameManager.user.BaseInfo.avatarUrl;
|
||||
_equippedAvatarName = gameManager.user.BaseInfo.avatarUrl;
|
||||
_pendingAvatarName = _equippedAvatarName;
|
||||
|
||||
foreach (var sprite in allSprites)
|
||||
{
|
||||
var obj = Instantiate(prefab_AvatarItem, parent_AvatarList);
|
||||
string avatarName = sprite.name;
|
||||
|
||||
// 1. 设置列表项的小头像 (child0 = Image)
|
||||
// child(0) = 头像图片
|
||||
if (obj.transform.childCount > 0)
|
||||
{
|
||||
var img = obj.transform.GetChild(0).GetComponent<Image>();
|
||||
if (img != null) img.sprite = sprite;
|
||||
}
|
||||
|
||||
// 2. 获取对号图标 (child2)
|
||||
Transform checkMark = null;
|
||||
if (obj.transform.childCount > 2)
|
||||
{
|
||||
checkMark = obj.transform.GetChild(2);
|
||||
// 初始隐藏
|
||||
checkMark.gameObject.SetActive(false);
|
||||
}
|
||||
// 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)
|
||||
if (toggle == null) continue;
|
||||
|
||||
// 禁用 Toggle 自带的过渡效果(面板上已设置好选中高亮)
|
||||
toggle.transition = Selectable.Transition.None;
|
||||
// 初始选中已装备的头像
|
||||
toggle.isOn = (avatarName == _equippedAvatarName);
|
||||
|
||||
_avatarToggles.Add(toggle);
|
||||
|
||||
toggle.onValueChanged.AddListener(isOn =>
|
||||
{
|
||||
// 关键:禁用 Toggle 自动过渡,防止自动显示 Graphic
|
||||
toggle.transition = Selectable.Transition.None;
|
||||
if (!isOn) return;
|
||||
|
||||
_avatarToggles.Add(toggle);
|
||||
string avatarName = sprite.name;
|
||||
_pendingAvatarName = avatarName;
|
||||
|
||||
// 判断是否是当前已装备的头像
|
||||
bool isCurrent = (avatarName == currentAvatar);
|
||||
// 预览头像实时更新
|
||||
if (img_ShowAvatar != null)
|
||||
img_ShowAvatar.sprite = sprite;
|
||||
|
||||
// 设置选中状态
|
||||
toggle.isOn = isCurrent;
|
||||
|
||||
// 【修改点】只要 isOn 为 true,就显示对号
|
||||
// 这里的逻辑是:如果是当前用户装备的头像,打开面板时默认是选中的,且有对号
|
||||
if (isCurrent)
|
||||
// 单选:关闭其他 toggle(对号不动,只到点"使用"才切换)
|
||||
foreach (var t in _avatarToggles)
|
||||
{
|
||||
if (checkMark != null) checkMark.gameObject.SetActive(true);
|
||||
_pendingAvatarName = avatarName;
|
||||
if (t == toggle) continue;
|
||||
t.SetIsOnWithoutNotify(false);
|
||||
}
|
||||
|
||||
// 监听点击事件
|
||||
toggle.onValueChanged.AddListener(isOn =>
|
||||
{
|
||||
// 【修改点】对号显示完全跟随 isOn 状态
|
||||
// 当点击这个 Toggle 变成 true 时,显示对号;变成 false 时,隐藏对号
|
||||
if (checkMark != null)
|
||||
{
|
||||
checkMark.gameObject.SetActive(isOn);
|
||||
}
|
||||
|
||||
if (isOn)
|
||||
{
|
||||
_pendingAvatarName = avatarName;
|
||||
|
||||
// 实时更新预览大图
|
||||
if (img_ShowAvatar != null)
|
||||
{
|
||||
img_ShowAvatar.sprite = sprite;
|
||||
}
|
||||
|
||||
// 手动单选逻辑:关闭其他 Toggle
|
||||
foreach (var t in _avatarToggles)
|
||||
{
|
||||
if (t == toggle) continue;
|
||||
t.SetIsOnWithoutNotify(false);
|
||||
|
||||
// 【修改点】强制隐藏其他 Toggle 的对号
|
||||
// 虽然上面 SetIsOnWithoutNotify(false) 会触发各自的 onValueChanged=false,
|
||||
// 但为了保险起见,或者防止逻辑冲突,这里显式隐藏一次。
|
||||
var otherMark = t.transform.childCount > 2 ? t.transform.GetChild(2) : null;
|
||||
if (otherMark != null) otherMark.gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>点击“使用”按钮 → 确认数据,更新主头像</summary>
|
||||
/// <summary>点击"使用"按钮 → 确认切换装备头像</summary>
|
||||
private void OnClickUseAvatar()
|
||||
{
|
||||
if (string.IsNullOrEmpty(_pendingAvatarName))
|
||||
@@ -203,25 +171,37 @@ public class UserInfoPanel : SubUIBase
|
||||
Debug.Log("[UserInfoPanel] 未选中头像");
|
||||
return;
|
||||
}
|
||||
if (_pendingAvatarName == _equippedAvatarName)
|
||||
{
|
||||
Debug.Log("[UserInfoPanel] 未改变头像");
|
||||
return;
|
||||
}
|
||||
|
||||
// 1. 更新正式用户数据头像
|
||||
// 更新正式头像显示
|
||||
LoadAvatarImage(sprite_Avatar, _pendingAvatarName);
|
||||
|
||||
// 2. 上传到服务器/更新本地缓存
|
||||
// 上传到服务器(成功后 OnAvatarChanged 会切换对号)
|
||||
gameManager.ApplyAvatar(_pendingAvatarName);
|
||||
|
||||
// 注意:这里不再需要遍历去更新对号了,因为对号在点击 Toggle 时已经跟着动了
|
||||
// 点“使用”只是把当前的预览状态保存下来。
|
||||
}
|
||||
|
||||
/// <summary>头像变更回调(网络返回后)</summary>
|
||||
/// <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);
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 工具 ====================
|
||||
|
||||
Reference in New Issue
Block a user