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

191 lines
5.9 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 Framework;
using PhxhSDK;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// UI窗口基类 - 按钮绑定部分
/// 包含按钮事件绑定、音频处理等功能
/// </summary>
public abstract partial class UIWindow
{
#region Button Binding Core
/// <summary>
/// 处理按钮点击的音频逻辑
/// </summary>
/// <param name="button">按钮组件</param>
/// <param name="playAudio">是否播放音频</param>
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>
/// <param name="button">按钮组件</param>
/// <param name="action">点击回调</param>
/// <param name="playAudio">是否播放音频</param>
private void BindButtonCore(Button button, Action action, bool playAudio = true)
{
if (button is null)
{
DebugUtil.LogError("传入按钮为空,无法绑定点击事件!");
return;
}
button.onClick.RemoveAllListeners();
button.onClick.AddListener(() =>
{
DebugUtil.Log("按钮被点击: {0}", button.gameObject.name);
if (UIManager.IsUIInputBlocked) return;
UIManager.Instance.BlockUIForNormalOperation();
HandleButtonAudio(button, playAudio);
action?.Invoke();
});
DebugUtil.Log("按钮绑定完成: {0}", button.gameObject.name);
}
/// <summary>
/// 绑定按钮点击事件的核心逻辑(带参数)
/// </summary>
/// <typeparam name="T">参数类型</typeparam>
/// <param name="button">按钮组件</param>
/// <param name="action">点击回调</param>
/// <param name="parameter">参数</param>
/// <param name="playAudio">是否播放音频</param>
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(() =>
{
if (UIManager.IsUIInputBlocked) return;
UIManager.Instance.BlockUIForNormalOperation();
HandleButtonAudio(button, playAudio);
if (parameter == null)
{
DebugUtil.LogError("=== 传入参数为空! ===");
}
action?.Invoke(parameter);
});
}
#endregion
#region Button Binding Public Interface
/// <summary>
/// 通过路径绑定按钮
/// </summary>
/// <param name="target">按钮路径</param>
/// <param name="action">点击回调</param>
/// <param name="playAudio">是否播放音频</param>
/// <returns>找到的GameObject</returns>
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>
/// 通过GameObject绑定按钮带参数
/// </summary>
/// <typeparam name="T">参数类型</typeparam>
/// <param name="obj">按钮GameObject</param>
/// <param name="action">点击回调</param>
/// <param name="parameter">回调参数</param>
/// <param name="playAudio">是否播放音频</param>
/// <returns>传入的GameObject</returns>
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>
/// <param name="button">Button组件</param>
/// <param name="action">点击回调</param>
/// <param name="playAudio">是否播放音频</param>
/// <returns>Button的GameObject</returns>
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>
/// 直接绑定Button组件带参数
/// </summary>
/// <typeparam name="T">参数类型</typeparam>
/// <param name="button">Button组件</param>
/// <param name="action">点击回调</param>
/// <param name="parameter">回调参数</param>
/// <param name="playAudio">是否播放音频</param>
/// <returns>Button的GameObject</returns>
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
}