using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using BaseGames.Core.Events; using BaseGames.UI.Theme; namespace BaseGames.UI { /// 按钮视觉变体(驱动从主题派生的 )。 public enum UIButtonVariant { Primary, Secondary, Accent, Danger, Ghost } /// /// 主题化按钮变体 + 交互反馈。薄封装在 uGUI 之上: /// - 按变体从 取基色,派生 normal/highlighted/pressed/disabled 并写入 Button.colors。 /// - 选中/悬停时缩放反馈(走 )。 /// - 可选点击/悬停音效(事件频道驱动,不直接耦合 Audio 程序集)。 /// /// 主题来源:优先 Inspector 直接赋的 ,否则就近向上找 。 /// [RequireComponent(typeof(Button))] [DisallowMultipleComponent] public class UIButton : MonoBehaviour, ISelectHandler, IDeselectHandler, IPointerEnterHandler, IPointerExitHandler { [Header("变体")] [SerializeField] private UIButtonVariant _variant = UIButtonVariant.Primary; [Tooltip("主题资产;为空则就近向上查找 UIThemeApplier。")] [SerializeField] private UIThemeSO _theme; [Header("反馈")] [Tooltip("选中/悬停时的缩放反馈。")] [SerializeField] private bool _scaleFeedback = true; [SerializeField] private float _selectedScale = 1.06f; [SerializeField] private float _scaleDuration = 0.08f; [Header("音效(可选,事件频道驱动)")] [SerializeField] private VoidEventChannelSO _onClickSfx; [SerializeField] private VoidEventChannelSO _onHoverSfx; private Button _button; private Coroutine _scaleRoutine; private Vector3 _baseScale = Vector3.one; private void Awake() { _button = GetComponent