NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/UI/Common/UIHeadItemNodeLogic.cs

619 lines
16 KiB
C#

using System;
using Framework;
using Gameplay;
using PhxhSDK;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class UIHeadItemNodeLogic : UINode
{
protected uint uid;
protected UIHeadInfo uiheadInfo;
public GameObject root;
public Image imgBg;
public Image imgTeamProBg;
public Image imgTeamProName;
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 UIButtonLongPress buttonLongPress;
public GameObject contentFight;
public GameObject GoPro;
public GameObject CostLeadershipGo;
public TMP_Text txtLevelForEditTeam;
public GameObject LevelGoForEditTeam;
public ButtonUpDrag buttonUpDrag;
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;
var uiHeadNode = root.GetComponent<UIHeadItemNode>();
imgBg = _GetComponent<Image>("Content/ImageBg");
imgTeamProBg = _GetComponent<Image>("Content/ImageJob");
imgTeamProName = _GetComponent<Image>("Content/ImageJob/ImageName");
imgHead = _GetComponent<Image>("Content/ImageHead");
imgPro = _GetComponent<Image>("Content/ImageProfession/Image_Job");
imgMorale = _GetComponent<Image>("Content/FightContent/ImageMoraleStatusBar");
imgStateInBattle = _GetComponent<Image>("Content/FightContent/ImageState");
imgMoraleFill = _GetComponent<Image>("Content/FightContent/ImageMoraleStatusBar/ImageBattleMorale");
imgRarity = _GetComponent<Image>("Content/ImageRarity");
txtLevel = _GetComponent<TMP_Text>("Content/TextLevel");
txtName = _GetComponent<TMP_Text>("Content/TextName");
imgSelect = _GetComponent<Image>("Content/ImageSelected");
GoPro = _FindObj("Content/ImageProfession");
txtLeadership = _GetComponent<TMP_Text>("Content/Image_CostBg/Text_CommandCost");
if (uiHeadNode)
{
buttonHead = uiHeadNode.buttonHead;
}
if (!buttonHead)
{
buttonHead = _GetComponent<Button>("Content/ButtonHead");
}
CostLeadershipGo = _FindObj("Content/Image_CostBg");
contentFight = transform.Find("Content/FightContent")?.gameObject;
if (buttonHead)
{
buttonUpDrag = buttonHead.GetComponent<ButtonUpDrag>();
}
// For Team Edit
LevelGoForEditTeam = _FindObj("Content/Image_LevelBg");
txtLevelForEditTeam = _GetComponent<TMP_Text>("Content/Image_LevelBg/TextLevel");
//Debug
_debugContent = transform.Find("Debug")?.gameObject;
_debugRoleID = _GetComponent<TMP_Text>("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();
}
/// <summary>
/// 异步方法
/// </summary>
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 characterInfo = CharacterDataInfoManager.Instance.GetCharacterInfo(uid);
var spritePath = CommonUtils.GetCharacterPicPath((int)uid, CommonUtils.ECharacterPicPathType.HeadPic,
(int)characterInfo.SkinID, uiheadInfo.IsCommander);//CommonUtils.GetDefaultHeadPathByUid(uid);
var sprite = await LoadAssetAsync<Sprite>(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<Sprite>(spritePath);
if (sprite)
{
imgPro.sprite = sprite;
}
}
else
{
GoPro.SetActive(false);
}
}
/// <summary>
/// 同步方法
/// </summary>
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 config = CharacterDataInfoManager.Instance.GetCharacterInfo(uid);
var spritePath = CommonUtils.GetCharacterPicPath((int)uid, CommonUtils.ECharacterPicPathType.HeadPic, (int)config.SkinID);//CommonUtils.GetDefaultHeadPathByUid(uid);
var sprite = AssetManager.Instance.GetPreLoadResult<Sprite>(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<Sprite>(spritePath);
if (sprite)
{
imgPro.sprite = sprite;
}
}
else
{
GoPro.SetActive(false);
}
}
/// <summary>
/// 共有的显示刷新逻辑
/// </summary>
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.GetCharacterName(data.RoleID); //CommonUtils.GetLocalizeText(data.Name);
}
}
//绑定点击回调
private void _BindClickCb()
{
if (buttonLongPress != null && uiheadInfo.LongPress != null)
{
buttonLongPress.onLongPress = uiheadInfo.LongPress;
if (uiheadInfo.ClickCb is Action action)
{
buttonLongPress.onClick = action;
}
}
else if(uiheadInfo.ClickCb is Action action)
{
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>(T param)
{
if (uiheadInfo.ClickCb != null)
{
ClearBind(buttonHead);
var clickCb = uiheadInfo.ClickCb;
if (clickCb is Action<T> action)
{
BindButton(buttonHead, action, param);
}
}
}
//设置点击回调的参数
public void SetClickCbParam<T,TK>(T param1,TK param2)
{
if (uiheadInfo.ClickCb != null)
{
ClearBind(buttonHead);
var clickCb = uiheadInfo.ClickCb;
if (clickCb is Action<T,TK> action)
{
BindButton(buttonHead, action, param1, param2);
}
}
}
/// <summary>
/// 提供手动设置头像接口
/// </summary>
/// <param name="isAsync"></param>
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<Sprite>(spritePath);
imgHead.sprite = sprite;
}
public void SetHeadImage(string spritePath)
{
var sprite = AssetManager.Instance.GetPreLoadResult<Sprite>(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);
}
public void HideTeamProBg()
{
imgTeamProBg.gameObject.SetActive(false);
}
public void SetTeamBgImage(string spritePath, string proPath, bool isAsync = true)
{
if (string.IsNullOrEmpty(spritePath) || string.IsNullOrEmpty(proPath))
{
imgTeamProBg.gameObject.SetActive(false);
return;
}
imgTeamProBg.gameObject.SetActive(true);
if (isAsync)
{
_SetTeamBgImageAsync(spritePath, proPath);
return;
}
_SetTeamBgImage(spritePath, proPath);
}
private async void _SetBgImageAsync(string spritePath)
{
var sprite = await LoadAssetAsync<Sprite>(spritePath);
imgBg.sprite = sprite;
}
private void _SetBgImage(string spritePath)
{
var sprite = AssetManager.Instance.GetPreLoadResult<Sprite>(spritePath);
imgBg.sprite = sprite;
}
private async void _SetTeamBgImageAsync(string spritePath, string proPath)
{
var sprite = await LoadAssetAsync<Sprite>(spritePath);
var proSprite = await LoadAssetAsync<Sprite>(proPath);
imgTeamProBg.sprite = sprite;
imgTeamProName.sprite = proSprite;
}
private void _SetTeamBgImage(string spritePath, string proPath)
{
var sprite = AssetManager.Instance.GetPreLoadResult<Sprite>(spritePath);
var proSprite = AssetManager.Instance.GetPreLoadResult<Sprite>(proPath);
imgTeamProBg.sprite = sprite;
imgTeamProName.sprite = proSprite;
}
/// <summary>
/// 刷新debug部分
/// </summary>
protected virtual void _RefreshDebug()
{
_debugRoleID.text = "ID:" + uid;
_debugContent.gameObject.SetActive(DisplayIDForCeHua.IsDisplayID);
}
#endregion
#region Events
protected virtual void _OnDebugRoleID()
{
_RefreshDebug();
}
#endregion
/***************** 外部拓展接口,可继承重写 ******************/
/// <summary>
/// 刷新整个Item
/// </summary>
/// <param name="id"></param> 角色uid
/// <param name="isOnfight"></param> 是否是上阵列表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<T>(Action<T> action, T param)
{
//action?.Invoke(param);
}
public virtual void BindItemClick<T, D>(Action<T, D> action, T param0, D param1)
{
//action?.Invoke(param);
}
public virtual void BindItemLongPress(Action action)
{
}
public virtual void BindItemLongPress<T>(Action<T> action, T param)
{
}
public virtual void BindItemPointerUp(Action action)
{
}
public virtual void BindItemUpDrag<T>(Action<T> action, T param)
{
}
public virtual void BindItemStartDrag<T>(Action<T> action, T param)
{
}
public virtual void BindItemEndDrag<T>(Action<T> action, T param)
{
}
public virtual void BindItemOnDrag<T>(Action<T> action, T param)
{
}
public virtual void RemoveAllClickListener(ButtonUpDrag button)
{
//button.RemoveAllListener();
button.RemoveAll();
}
public virtual void RemoveClickListener()
{
}
}