NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Framework/UI/UIWindow.ButtonBinding.cs

236 lines
13 KiB
C#
Raw Normal View History

using System;
using Cysharp.Threading.Tasks;
using Framework;
using PhxhSDK;
using UnityEngine;
using UnityEngine.UI;
/*
UIWindow (Button Binding)
2025-12-29 14:43:15 +08:00
API - OnInit()
2025-12-29 14:43:15 +08:00
partial
UIWindow.DefaultCloseButton.cs - BgCloseBtnClose
UIWindow.DefaultHomeButton.cs - BtnHomeBtnBackHomeHomeButton
2025-12-29 14:43:15 +08:00
UIWindow.DefaultBackButton.cs - BtnBackBackButtonBtnReturn
使
OnInit() 使 BindButton() API
protected override void OnInit()
{
// 通过路径绑定 ║
BindButton("BtnStart", OnStartClick);
// 通过Button组件绑定 ║
BindButton(myButton, OnMyButtonClick);
// 带参数绑定 ║
BindButton(itemButton, OnItemClick, itemData);
// 静音绑定(不播放音效) ║
BindButton(silentButton, OnSilentClick, playAudio: false);
}
2025-12-29 14:43:15 +08:00
UIWindow.DefaultCloseButton.cs
UIWindow.DefaultHomeButton.cs
UIWindow.DefaultBackButton.cs
*/
/// <summary>
/// UI窗口基类 - 按钮绑定部分
/// 提供按钮绑定API和默认按钮自动绑定功能
/// </summary>
public abstract partial class UIWindow
{
#region Button Binding Core - 按钮绑定核心逻辑
/// <summary>
/// 处理按钮点击的音频逻辑
/// </summary>
private void HandleButtonAudio(Button button, bool playAudio)
{
if (!playAudio) return;
var clickAudio = button.GetComponent<ClickAudio>();
if (clickAudio)
{
if (clickAudio.IsPlayAudio && !string.IsNullOrEmpty(clickAudio.AudioKey))
{
AudioManager.Instance.PlayAudio(clickAudio.AudioKey);
}
}
else
{
CommonUtilsFramework.PlayUICommonSound();
}
}
/// <summary>
/// 绑定按钮点击事件的核心逻辑(无参数)
/// </summary>
private void BindButtonCore(Button button, Action action, bool playAudio = true)
{
2025-10-23 15:43:50 +08:00
if (button is null)
{
DebugUtil.LogError("传入按钮为空,无法绑定点击事件!");
return;
}
button.onClick.RemoveAllListeners();
button.onClick.AddListener(() =>
{
2025-10-23 15:43:50 +08:00
DebugUtil.Log("按钮被点击: {0}", button.gameObject.name);
2025-09-12 15:18:50 +08:00
if (UIManager.IsUIInputBlocked) return;
2025-09-12 15:18:50 +08:00
UIManager.Instance.BlockUIForNormalOperation();
HandleButtonAudio(button, playAudio);
action?.Invoke();
});
2025-10-23 15:43:50 +08:00
DebugUtil.Log("按钮绑定完成: {0}", button.gameObject.name);
}
/// <summary>
/// 绑定按钮点击事件的核心逻辑(带参数)
/// </summary>
private void BindButtonCore<T>(Button button, Action<T> action, T parameter, bool playAudio = true)
{
if (button is null) return;
button.onClick.RemoveAllListeners();
button.onClick.AddListener(() =>
{
2025-09-12 15:18:50 +08:00
if (UIManager.IsUIInputBlocked) return;
2025-09-12 15:18:50 +08:00
UIManager.Instance.BlockUIForNormalOperation();
HandleButtonAudio(button, playAudio);
if (parameter == null)
{
DebugUtil.LogError("=== 传入参数为空! ===");
}
action?.Invoke(parameter);
});
}
#endregion
#region Button Binding Public API - 手动绑定按钮的公共API
/// <summary>
/// 通过路径绑定按钮
/// </summary>
/// <param name="target">按钮节点路径(相对于窗口根节点)</param>
/// <param name="action">点击回调</param>
/// <param name="playAudio">是否播放点击音效默认true</param>
/// <returns>Button组件</returns>
/// <example>
/// BindButton("TopBar/BtnSettings", OnSettingsClick);
/// </example>
public Button BindButton(string target, Action action, bool playAudio = true)
{
GameObject obj = transform.Find(target)?.gameObject;
if (obj is not null)
{
Button button = obj.GetComponent<Button>();
BindButtonCore(button, action, playAudio);
return button;
}
else
{
DebugUtil.LogError("未找到按钮节点: {0}/{1}", gameObject.name, target);
}
return null;
}
/// <summary>
/// 直接绑定Button组件
/// </summary>
/// <param name="button">Button组件</param>
/// <param name="action">点击回调</param>
/// <param name="playAudio">是否播放点击音效默认true</param>
/// <returns>Button组件</returns>
/// <example>
/// BindButton(myButton, OnMyButtonClick);
/// </example>
public Button BindButton(Button button, Action action, bool playAudio = true)
{
if (button is not null)
{
BindButtonCore(button, action, playAudio);
return button;
}
else
{
DebugUtil.LogError("传入按钮为空,请检查按钮绑定参数!");
}
return button;
}
/// <summary>
/// 通过GameObject绑定按钮带参数
/// </summary>
/// <typeparam name="T">参数类型</typeparam>
/// <param name="obj">按钮GameObject</param>
/// <param name="action">点击回调</param>
/// <param name="parameter">回调参数</param>
/// <param name="playAudio">是否播放点击音效默认true</param>
/// <returns>Button组件</returns>
/// <example>
/// BindButton(itemObj, OnItemClick, itemData);
/// </example>
public Button BindButton<T>(GameObject obj, Action<T> action, T parameter, bool playAudio = true)
{
if (obj is not null)
{
Button button = obj.GetComponent<Button>();
BindButtonCore(button, action, parameter, playAudio);
return button;
}
else
{
DebugUtil.LogError("传入GameObject为空请检查按钮绑定参数!");
}
return null;
}
/// <summary>
/// 直接绑定Button组件带参数
/// </summary>
/// <typeparam name="T">参数类型</typeparam>
/// <param name="button">Button组件</param>
/// <param name="action">点击回调</param>
/// <param name="parameter">回调参数</param>
/// <param name="playAudio">是否播放点击音效默认true</param>
/// <returns>Button组件</returns>
/// <example>
/// BindButton(itemButton, OnItemClick, itemData);
/// </example>
public Button BindButton<T>(Button button, Action<T> action, T parameter, bool playAudio = true)
{
if (button is not null)
{
BindButtonCore(button, action, parameter, playAudio);
return button;
}
else
{
DebugUtil.LogError("传入按钮为空,请检查按钮绑定参数!");
}
return button;
}
#endregion
}