NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/UI/RedPoint/RedPointUIController.cs

181 lines
4.0 KiB
C#

using UnityEngine;
using Sirenix.OdinInspector;
using UnityEngine.UI;
using TMPro;
using Framework;
using Debug = DebugUtil;
public enum ERedPointShowType
{
[LabelText("隐藏")]
None = 0,
[LabelText("红点")]
Icon = 1,
[LabelText("数字")]
Count = 2,
[LabelText("红点加数字")]
IconAndCount = 3,
}
public class RedPointUIController : MonoBehaviour
{
const string ICON_PATH = "icon";
const string TEXT_PATH = "count";
const int NODE_DEFAULT_ID = -1;
private RedPointNode _node;
private Image _icon;
private TMP_Text _count;
[OnValueChanged("OnNodeIDChanged")]
[LabelText("节点ID")]
[SerializeField]
private int _nodeID = NODE_DEFAULT_ID;
[OnValueChanged("OnShowTypeChanged")]
[LabelText("展示类型")]
[SerializeField]
private ERedPointShowType _showType = ERedPointShowType.IconAndCount;
public GameObject CachedObj { get; private set; }
public ERedPointShowType ShowType
{
get => _showType;
set
{
if (_showType != value)
{
_showType = value;
ApplyShowType();
}
}
}
public int NodeID
{
get => _nodeID;
set
{
if (_nodeID != value)
{
_nodeID = value;
Show();
}
}
}
private void Awake()
{
CachedObj = gameObject;
BindWidget();
RegisterEvent();
Show();
}
private void OnDestroy()
{
UnRegisterEvent();
}
private void Show()
{
GetNode();
ApplyShowType();
Refresh();
}
private void GetNode()
{
if (_nodeID == NODE_DEFAULT_ID)
return;
_node = RedPointManager.Instance.GetNodeByID(_nodeID);
if (_node == null)
{
Debug.LogError($"找不到RedPointNode!id:{_nodeID}");
}
}
private void BindWidget()
{
_icon = transform.Find(ICON_PATH).GetComponent<Image>();
if (_icon == null)
Debug.LogError("找不到_icon");
_count = transform.Find(TEXT_PATH).GetComponent<TMP_Text>();
if (_count == null)
Debug.LogError("找不到_count");
}
private void RegisterEvent()
{
EventManager.Instance.Register<RedPointNode>(EventManager.EventName.RedPointDataChange, OnRedPointDataChange);
}
private void UnRegisterEvent()
{
EventManager.Instance.Unregister<RedPointNode>(EventManager.EventName.RedPointDataChange, OnRedPointDataChange);
}
private void OnRedPointDataChange(RedPointNode node)
{
if (node == _node)
{
Refresh();
}
}
private void Refresh()
{
if (_node != null && _node.Valid)
{
var count = _node.MessageCount;
CachedObj.SetActive(count > 0);
_count.text = count.ToString();
}
else
{
CachedObj.SetActive(false);
}
}
private void ApplyShowType()
{
switch (_showType)
{
case ERedPointShowType.None:
_icon.gameObject.SetActive(false);
_count.gameObject.SetActive(false);
break;
case ERedPointShowType.Icon:
_icon.gameObject.SetActive(true);
_count.gameObject.SetActive(false);
break;
case ERedPointShowType.Count:
_icon.gameObject.SetActive(false);
_count.gameObject.SetActive(true);
break;
case ERedPointShowType.IconAndCount:
_icon.gameObject.SetActive(true);
_count.gameObject.SetActive(true);
break;
default:
break;
}
}
#region GUI
private void OnShowTypeChanged()
{
if (Application.isPlaying)
ApplyShowType();
}
private void OnNodeIDChanged()
{
if (Application.isPlaying)
Show();
}
#endregion
}