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

532 lines
13 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using cfg.CharacterCfg;
using Framework;
using Gameplay;
using Gameplay.Character;
using PhxhSDK;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using Object = System.Object;
//角色/载具头像UI设置基类
public class UIHeadItemNode : UINode
{
protected uint uid;
protected UIHeadInfo uiheadInfo;
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 GameObject contentFight;
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);
}
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()
{
imgBg = _GetComponent<Image>("Content/ImageBg");
imgHead = _GetComponent<Image>("Content/ImageHead");
imgPro = _GetComponent<Image>("Content/ImageProfession");
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");
contentFight = transform.Find("Content/FightContent").gameObject;
//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();
}
_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 spritePath = CommonUtils.GetDefaultHeadPathByUid(uid);
var sprite = await AssetManager.Instance.LoadAssetAsync<Sprite>(spritePath);
if (sprite)
{
imgHead.sprite = sprite;
}
}
private async void _RefreshProfessionAsync()
{
if (uiheadInfo.IsShowPro)
{
imgPro.gameObject.SetActive(true);
var job = CommonUtils.GetProfessionByUid(uid);
var jobData = TableManager.Instance.Tables.JobAttri.GetOrDefault((int)job);
var spritePath = jobData.IconPath;
var sprite = await AssetManager.Instance.LoadAssetAsync<Sprite>(spritePath);
if (sprite)
{
imgPro.sprite = sprite;
}
}
else
{
imgPro.gameObject.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 spritePath = CommonUtils.GetDefaultHeadPathByUid(uid);
var sprite = AssetManager.Instance.GetPreLoadResult<Sprite>(spritePath);
if (sprite)
{
imgHead.sprite = sprite;
}
}
private void _RefreshProfession()
{
if (uiheadInfo.IsShowPro)
{
imgPro.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
{
imgPro.gameObject.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.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)
{
txtLevel.gameObject.SetActive(false);
return;
}
txtLevel.gameObject.SetActive(true);
if (CharacterDataInfoManager.Instance.DataDic.TryGetValue(uid, out var charInfo))
{
txtLevel.text = "LV " + charInfo.Level;
}
}
//设置点击回调的参数
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);
}
}
}
/// <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 AssetManager.Instance.LoadAssetAsync<Sprite>(spritePath);
imgHead.sprite = sprite;
}
public void SetHeadImage(string spritePath)
{
var sprite = AssetManager.Instance.GetPreLoadResult<Sprite>(spritePath);
imgHead.sprite = sprite;
}
//设置背景
public void SetBgImage(string spritePath, bool isAsync = true)
{
if (!uiheadInfo.IsShowBg)
{
imgBg.gameObject.SetActive(false);
return;
}
imgBg.gameObject.SetActive(true);
if (isAsync)
{
_SetBgImageAsync(spritePath);
return;
}
_SetBgImage(spritePath);
}
private async void _SetBgImageAsync(string spritePath)
{
var sprite = await AssetManager.Instance.LoadAssetAsync<Sprite>(spritePath);
imgBg.sprite = sprite;
}
private void _SetBgImage(string spritePath)
{
var sprite = AssetManager.Instance.GetPreLoadResult<Sprite>(spritePath);
imgBg.sprite = sprite;
}
/// <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(UIButtonEx button)
{
button.RemoveAllListener();
}
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 IsAutoSetHead = true; //是否自动设置头像图片
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)
{
_uid = uid;
_isFight = isFight;
ClickCb = clickCb;
_isSelect = isSelect;
IsShowPro = isShowPro;
IsShowName = isShowName;
IsShowRarity = isShowRarity;
IsShowHead = isShowHead;
IsShowLevel = isShowLevel;
}
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;
}
}