using System;
using cfg.CharacterCfg;
using Framework;
using Gameplay;
using PhxhSDK;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
///
/// 角色及载具头像UI设置基类
///
public class UIHeadItemNode : UINode
{
protected uint uid;
protected UIHeadInfo uiheadInfo;
public GameObject root;
public Image imgBg;
public Image imgHead;
public Image imgPro;
public Image imgMorale;
public Image imgMoraleFill;
public Image imgStateInBattle;
public TMP_Text txtLevel;
public Image imgRarity;
public TMP_Text txtName;
public Image imgSelect;
public Button buttonHead;
public TMP_Text txtLeadership;
public GameObject contentFight;
public GameObject GoPro;
public GameObject CostLeadershipGo;
public TMP_Text txtLevelForEditTeam;
public GameObject LevelGoForEditTeam;
protected GameObject _debugContent;
protected TMP_Text _debugRoleID;
private void Awake()
{
OnAwake();
EventManager.Instance.Register(EventManager.EventName.DebugHeadRoleID, _OnDebugRoleID);
}
// Start is called before the first frame update
void Start()
{
}
private void OnDestroy()
{
EventManager.Instance.Unregister(EventManager.EventName.DebugHeadRoleID, _OnDebugRoleID);
base.OnRelease();
}
public override void OnAwake()
{
base.OnAwake();
_GetComponents();
}
public override void OnStart()
{
base.OnStart();
_GetComponents();
}
public override void SetData(object data)
{
uiheadInfo = data as UIHeadInfo;
if (uiheadInfo == null)
{
DebugUtil.LogError($"{name} SetData data is null!!! ");
return;
}
uid = uiheadInfo.Uid;
}
private void _GetComponents()
{
root = gameObject;
imgBg = _GetComponent("Content/ImageBg");
imgHead = _GetComponent("Content/ImageHead");
imgPro = _GetComponent("Content/ImageProfession/Image_Job");
imgMorale = _GetComponent("Content/FightContent/ImageMoraleStatusBar");
imgStateInBattle = _GetComponent("Content/FightContent/ImageState");
imgMoraleFill = _GetComponent("Content/FightContent/ImageMoraleStatusBar/ImageBattleMorale");
imgRarity = _GetComponent("Content/ImageRarity");
txtLevel = _GetComponent("Content/TextLevel");
txtName = _GetComponent("Content/TextName");
imgSelect = _GetComponent("Content/ImageSelected");
GoPro = _FindObj("Content/ImageProfession");
txtLeadership = _GetComponent("Content/Image_CostBg/Text_CommandCost");
CostLeadershipGo = _FindObj("Content/Image_CostBg");
contentFight = transform.Find("Content/FightContent").gameObject;
// For Team Edit
LevelGoForEditTeam = _FindObj("Content/Image_LevelBg");
txtLevelForEditTeam = _GetComponent("Content/Image_LevelBg/TextLevel");
//Debug
_debugContent = transform.Find("Debug").gameObject;
_debugRoleID = _GetComponent("Debug/RoleID");
}
public void GetComponents()
{
_GetComponents();
}
#region Refresh
public void Refresh(bool isAsync = true)
{
if (isAsync)
{
_RefreshAsync();
}
else
{
_Refresh();
}
_RefreshCostLeadership();
_RefreshCommon();
_BindClickCb();
_RefreshDebug();
}
private void _Refresh()
{
if (uiheadInfo.IsFight)
{
}
else
{
contentFight.SetActive(false);
}
_RefreshHead();
_RefreshProfession();
}
private async void _RefreshAsync()
{
if (uiheadInfo.IsFight)
{
}
else
{
if (!contentFight)
{
contentFight = transform.Find("Content/FightContent").gameObject;
}
contentFight.SetActive(false);
}
_RefreshHeadAsync();
_RefreshProfessionAsync();
}
///
/// 异步方法
///
private async void _RefreshHeadAsync()
{
if (!uiheadInfo.IsShowHead)
{
imgHead.gameObject.SetActive(false);
return;
}
imgHead.gameObject.SetActive(true);
if (!uiheadInfo.IsAutoSetHead) return;
if (!ValueValidator.IsIdValid(uid)) return;
var spritePath = CommonUtils.GetDefaultHeadPathByUid(uid);
var sprite = await LoadAssetAsync(spritePath);
if (sprite)
{
imgHead.sprite = sprite;
}
}
private async void _RefreshProfessionAsync()
{
if (uiheadInfo.IsShowPro)
{
GoPro.SetActive(true);
var job = CommonUtils.GetProfessionByUid(uid);
var jobData = TableManager.Instance.Tables.JobAttri.GetOrDefault((int)job);
var spritePath = jobData.IconPath;
var sprite = await LoadAssetAsync(spritePath);
if (sprite)
{
imgPro.sprite = sprite;
}
}
else
{
GoPro.SetActive(false);
}
}
///
/// 同步方法
///
private void _RefreshHead()
{
if (!uiheadInfo.IsShowHead)
{
imgHead.gameObject.SetActive(false);
return;
}
imgHead.gameObject.SetActive(true);
if (!uiheadInfo.IsAutoSetHead) return;
if (!ValueValidator.IsIdValid(uid)) return;
var spritePath = CommonUtils.GetDefaultHeadPathByUid(uid);
var sprite = AssetManager.Instance.GetPreLoadResult(spritePath);
if (sprite)
{
imgHead.sprite = sprite;
}
}
private void _RefreshCostLeadership()
{
if (uiheadInfo.IsShowLeadership)
{
CostLeadershipGo.SetActive(true);
var leadership = CharacterDataInfoManager.Instance.GetSpendLeadership(uid);
txtLeadership.text = leadership.ToString();
}
else
{
CostLeadershipGo.SetActive(false);
}
}
private void _RefreshProfession()
{
if (uiheadInfo.IsShowPro)
{
GoPro.gameObject.SetActive(true);
var job = CommonUtils.GetProfessionByUid(uid);
var jobData = TableManager.Instance.Tables.JobAttri.GetOrDefault((int)job);
var spritePath = jobData.IconPath;
var sprite = AssetManager.Instance.GetPreLoadResult(spritePath);
if (sprite)
{
imgPro.sprite = sprite;
}
}
else
{
GoPro.SetActive(false);
}
}
///
/// 共有的显示刷新逻辑
///
private void _RefreshCommon()
{
_RefreshRarity();
_RefreshLevel();
_RefreshName();
_RefreshBg();
}
private void _RefreshBg()
{
imgBg.gameObject.SetActive(uiheadInfo.IsShowBg);
}
private void _RefreshRarity()
{
imgRarity.gameObject.SetActive(uiheadInfo.IsShowRarity);
}
private void _RefreshName()
{
if (!uiheadInfo.IsShowName)
{
txtName.gameObject.SetActive(false);
return;
}
txtName.gameObject.SetActive(true);
if (!ValueValidator.IsIdValid(uid)) return;
var data = TableManager.Instance.Tables.CharacterAttri.GetOrDefault((int)uid);
if (data != null)
{
txtName.text = CommonUtils.GetLocalizeText(data.Name);
}
}
//绑定点击回调
private void _BindClickCb()
{
if (uiheadInfo.ClickCb is not Action action) return;
ClearBind(buttonHead);
BindButton(buttonHead, action);
}
private void _RefreshLevel()
{
if (!uiheadInfo.IsShowLevel && !uiheadInfo.IsShowNewLevel)
{
LevelGoForEditTeam.SetActive(false);
txtLevel.gameObject.SetActive(false);
return;
}
if (uiheadInfo.IsShowLevel && !uiheadInfo.IsShowNewLevel)
{
txtLevel.gameObject.SetActive(true);
LevelGoForEditTeam.gameObject.SetActive(false);
if (CharacterDataInfoManager.Instance.DataDic.TryGetValue(uid, out var charInfo))
{
txtLevel.text = "LV " + charInfo.Level;
}
return;
}
if (uiheadInfo.IsShowLevel && uiheadInfo.IsShowNewLevel)
{
txtLevel.gameObject.SetActive(false);
LevelGoForEditTeam.gameObject.SetActive(true);
if (CharacterDataInfoManager.Instance.DataDic.TryGetValue(uid, out var charInfo))
{
txtLevelForEditTeam.text = charInfo.Level.ToString();
}
return;
}
}
//设置点击回调的参数
public void SetClickCbParam(T param)
{
if (uiheadInfo.ClickCb != null)
{
ClearBind(buttonHead);
var clickCb = uiheadInfo.ClickCb;
if (clickCb is Action action)
{
BindButton(buttonHead, action, param);
}
}
}
//设置点击回调的参数
public void SetClickCbParam(T param1,TK param2)
{
if (uiheadInfo.ClickCb != null)
{
ClearBind(buttonHead);
var clickCb = uiheadInfo.ClickCb;
if (clickCb is Action action)
{
BindButton(buttonHead, action, param1, param2);
}
}
}
///
/// 提供手动设置头像接口
///
///
public void SetHeadImage(bool isAsync = true)
{
if (!uiheadInfo.IsShowHead)
{
imgHead.gameObject.SetActive(false);
return;
}
if (!ValueValidator.IsIdValid(uid)) return;
imgHead.gameObject.SetActive(true);
if (isAsync)
{
_RefreshHeadAsync();
return;
}
_RefreshHead();
}
public async void SetHeadImageAsync(string spritePath)
{
var sprite = await LoadAssetAsync(spritePath);
imgHead.sprite = sprite;
}
public void SetHeadImage(string spritePath)
{
var sprite = AssetManager.Instance.GetPreLoadResult(spritePath);
imgHead.sprite = sprite;
}
public void SetActive(bool active = true)
{
root.SetActive(active);
}
//设置背景
public void SetBgImage(string spritePath, bool isAsync = true)
{
if (!uiheadInfo.IsShowBg)
{
imgBg.gameObject.SetActive(false);
return;
}
if(string.IsNullOrEmpty(spritePath))
return;
imgBg.gameObject.SetActive(true);
if (isAsync)
{
_SetBgImageAsync(spritePath);
return;
}
_SetBgImage(spritePath);
}
private async void _SetBgImageAsync(string spritePath)
{
var sprite = await LoadAssetAsync(spritePath);
imgBg.sprite = sprite;
}
private void _SetBgImage(string spritePath)
{
var sprite = AssetManager.Instance.GetPreLoadResult(spritePath);
imgBg.sprite = sprite;
}
///
/// 刷新debug部分
///
protected virtual void _RefreshDebug()
{
_debugRoleID.text = "ID:" + uid;
_debugContent.gameObject.SetActive(DisplayIDForCeHua.IsDisplayID);
}
#endregion
#region Events
protected virtual void _OnDebugRoleID()
{
_RefreshDebug();
}
#endregion
/***************** 外部拓展接口,可继承重写 ******************/
///
/// 刷新整个Item
///
/// 角色uid
/// 是否是上阵列表Item
public virtual void RefreshHeadItem(uint id, bool isOnfight = false)
{
}
//选中时上移
public virtual void RefreshSelect(bool isSelect = false)
{
}
public virtual void BindItemClick(Action action)
{
}
public virtual void BindItemClick(Action action, T param)
{
//action?.Invoke(param);
}
public virtual void BindItemClick(Action action, T param0, D param1)
{
//action?.Invoke(param);
}
public virtual void BindItemLongPress(Action action)
{
}
public virtual void BindItemLongPress(Action action, T param)
{
}
public virtual void BindItemPointerUp(Action action)
{
}
public virtual void BindItemUpDrag(Action action, T param)
{
}
public virtual void BindItemStartDrag(Action action, T param)
{
}
public virtual void BindItemEndDrag(Action action, T param)
{
}
public virtual void BindItemOnDrag(Action action, T param)
{
}
public virtual void RemoveAllClickListener(ButtonUpDrag button)
{
//button.RemoveAllListener();
button.RemoveAll();
}
public virtual void RemoveClickListener()
{
}
/***************** 外部拓展接口 End ******************/
}
public class UIHeadInfo
{
private uint _uid; //角色ID
private bool _isFight; //是否战斗中使用
private bool _isSelect; //是否选中
public bool IsShowPro; //是否显示职业
public bool IsShowName; //是否显示名字
public bool IsShowRarity; //是否显示品质
public bool IsShowLevel; //是否显示等级
public bool IsShowHead = true; //是否显示头像
public bool IsShowBg = true; //是否显示背景
public Delegate ClickCb; //点击回调,如果有参数,调用node的SetClickCbParam传参
// 针对编队中的头像
public bool IsShowLeadership = false; //是否是编队中的
public bool IsShowNewLevel = false; //是否展示新等级
public bool IsAutoSetHead = true; //是否自动设置头像图片
public ProvideJob Job; //推荐职业
public uint Uid => _uid;
public bool IsFight => _isFight;
public bool IsSelect => _isSelect;
public UIHeadInfo(uint uid, bool isFight, Delegate clickCb, bool isSelect = false, bool isShowHead = true,
bool isShowPro = true, bool isShowName = true, bool isShowRarity = true, bool isShowLevel = true, bool isShowLeadership = false,bool isShowNewLevel = false, ProvideJob job = ProvideJob.Job_None)
{
_uid = uid;
_isFight = isFight;
ClickCb = clickCb;
_isSelect = isSelect;
IsShowPro = isShowPro;
IsShowName = isShowName;
IsShowRarity = isShowRarity;
IsShowHead = isShowHead;
IsShowLevel = isShowLevel;
IsShowLeadership = isShowLeadership;
IsShowNewLevel = isShowNewLevel;
Job = job;
}
public UIHeadInfo(uint uid, bool isFight)
{
_uid = uid;
_isFight = isFight;
}
public UIHeadInfo(uint uid)
{
_uid = uid;
_isFight = false;
}
public void SetIsSelect(bool isSelect)
{
_isSelect = isSelect;
}
}