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; } }