533 lines
13 KiB
C#
533 lines
13 KiB
C#
|
||
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);
|
||
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()
|
||
{
|
||
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 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 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 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 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;
|
||
}
|
||
} |