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

535 lines
13 KiB
C#
Raw Normal View History

2023-12-11 15:12:43 +08:00
2023-08-22 19:08:45 +08:00
using System;
2023-12-11 15:12:43 +08:00
using cfg.CharacterCfg;
using Framework;
using Gameplay;
using Gameplay.Character;
2023-12-11 15:12:43 +08:00
using PhxhSDK;
using TMPro;
2023-08-22 19:08:45 +08:00
using UnityEngine;
2023-12-11 15:12:43 +08:00
using UnityEngine.UI;
using Object = System.Object;
2023-08-22 19:08:45 +08:00
//角色/载具头像UI设置基类
2023-12-11 15:12:43 +08:00
public class UIHeadItemNode : UINode
2023-08-22 19:08:45 +08:00
{
protected uint uid;
2023-12-11 15:12:43 +08:00
protected UIHeadInfo uiheadInfo;
public Image imgBg;
2023-12-11 15:12:43 +08:00
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;
2023-12-11 15:12:43 +08:00
public Image imgSelect;
public Button buttonHead;
2023-12-12 15:41:27 +08:00
public GameObject contentFight;
public GameObject GoPro;
2023-12-11 15:12:43 +08:00
protected GameObject _debugContent;
protected TMP_Text _debugRoleID;
2023-12-11 15:12:43 +08:00
private void Awake()
{
OnAwake();
EventManager.Instance.Register(EventManager.EventName.DebugHeadRoleID, _OnDebugRoleID);
2023-12-11 15:12:43 +08:00
}
2023-08-22 19:08:45 +08:00
// Start is called before the first frame update
void Start()
{
}
private void OnDestroy()
{
EventManager.Instance.Unregister(EventManager.EventName.DebugHeadRoleID, _OnDebugRoleID);
2024-04-28 15:47:12 +08:00
base.OnRelease();
}
2023-12-11 15:12:43 +08:00
public override void OnAwake()
{
base.OnAwake();
_GetComponents();
}
2023-12-12 15:41:27 +08:00
public override void OnStart()
{
base.OnStart();
_GetComponents();
}
2023-12-11 15:12:43 +08:00
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");
2023-12-11 15:12:43 +08:00
imgHead = _GetComponent<Image>("Content/ImageHead");
2024-07-23 14:29:42 +08:00
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");
2023-12-11 15:12:43 +08:00
2023-12-12 15:41:27 +08:00
contentFight = transform.Find("Content/FightContent").gameObject;
//Debug
_debugContent = transform.Find("Debug").gameObject;
_debugRoleID = _GetComponent<TMP_Text>("Debug/RoleID");
2023-12-12 15:41:27 +08:00
}
public void GetComponents()
{
_GetComponents();
2023-12-11 15:12:43 +08:00
}
#region Refresh
2023-12-11 15:12:43 +08:00
public void Refresh(bool isAsync = true)
{
if (isAsync)
{
_RefreshAsync();
}
else
{
_Refresh();
}
_RefreshCommon();
_BindClickCb();
_RefreshDebug();
}
private void _Refresh()
2023-12-11 15:12:43 +08:00
{
if (uiheadInfo.IsFight)
{
}
else
{
2023-12-12 15:41:27 +08:00
contentFight.SetActive(false);
2023-12-11 15:12:43 +08:00
}
_RefreshHead();
_RefreshProfession();
}
private async void _RefreshAsync()
{
if (uiheadInfo.IsFight)
{
}
else
{
2023-12-12 15:41:27 +08:00
if (!contentFight)
{
contentFight = transform.Find("Content/FightContent").gameObject;
}
contentFight.SetActive(false);
}
_RefreshHeadAsync();
_RefreshProfessionAsync();
2023-12-11 15:12:43 +08:00
}
/// <summary>
/// 异步方法
/// </summary>
private async void _RefreshHeadAsync()
2023-12-11 15:12:43 +08:00
{
if (!uiheadInfo.IsShowHead)
{
imgHead.gameObject.SetActive(false);
return;
}
imgHead.gameObject.SetActive(true);
if (!uiheadInfo.IsAutoSetHead) return;
if (!ValueValidator.IsIdValid(uid)) return;
2023-12-11 15:12:43 +08:00
var spritePath = CommonUtils.GetDefaultHeadPathByUid(uid);
2024-04-28 15:47:12 +08:00
var sprite = await LoadAssetAsync<Sprite>(spritePath);
2023-12-11 15:12:43 +08:00
if (sprite)
{
imgHead.sprite = sprite;
}
}
private async void _RefreshProfessionAsync()
2023-08-22 19:08:45 +08:00
{
if (uiheadInfo.IsShowPro)
{
GoPro.SetActive(true);
var job = CommonUtils.GetProfessionByUid(uid);
var jobData = TableManager.Instance.Tables.JobAttri.GetOrDefault((int)job);
var spritePath = jobData.IconPath;
2024-04-28 15:47:12 +08:00
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;
2023-08-22 19:08:45 +08:00
var spritePath = CommonUtils.GetDefaultHeadPathByUid(uid);
2024-02-05 14:45:46 +08:00
var sprite = AssetManager.Instance.GetPreLoadResult<Sprite>(spritePath);
if (sprite)
{
imgHead.sprite = sprite;
}
2023-08-22 19:08:45 +08:00
}
2023-08-22 19:08:45 +08:00
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;
2024-02-05 14:45:46 +08:00
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.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)
{
2024-04-28 15:47:12 +08:00
var sprite = await LoadAssetAsync<Sprite>(spritePath);
imgHead.sprite = sprite;
}
public void SetHeadImage(string spritePath)
{
2024-02-05 14:45:46 +08:00
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)
{
2024-04-28 15:47:12 +08:00
var sprite = await LoadAssetAsync<Sprite>(spritePath);
imgBg.sprite = sprite;
}
private void _SetBgImage(string spritePath)
{
2024-02-05 14:45:46 +08:00
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
/***************** 外部拓展接口,可继承重写 ******************/
2023-08-22 19:08:45 +08:00
/// <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)
{
2023-08-22 19:08:45 +08:00
}
public virtual void RemoveAllClickListener(UIButtonEx button)
{
button.RemoveAllListener();
}
public virtual void RemoveClickListener()
{
}
/***************** 外部拓展接口 End ******************/
2023-08-22 19:08:45 +08:00
}
2023-12-11 15:12:43 +08:00
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; //是否自动设置头像图片
2023-12-11 15:12:43 +08:00
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)
2023-12-11 15:12:43 +08:00
{
_uid = uid;
_isFight = isFight;
ClickCb = clickCb;
_isSelect = isSelect;
IsShowPro = isShowPro;
IsShowName = isShowName;
IsShowRarity = isShowRarity;
IsShowHead = isShowHead;
IsShowLevel = isShowLevel;
}
2023-12-11 15:12:43 +08:00
public UIHeadInfo(uint uid, bool isFight)
{
_uid = uid;
_isFight = isFight;
}
public UIHeadInfo(uint uid)
{
_uid = uid;
_isFight = false;
2023-12-11 15:12:43 +08:00
}
public void SetIsSelect(bool isSelect)
{
_isSelect = isSelect;
}
}