using CustomComponent; using Definition.Enum; using UnityEngine; using UnityEngine.EventSystems; namespace UI { /// /// 拼装槽位:接收拖拽部件并转发给玩法控制器做规则校验。 /// public class CombineSlot : MonoBehaviour, IDropHandler { #region Inspector Config /// /// 槽位要求的部件类型。 /// [SerializeField] private CombinePartType _requiredPartType = CombinePartType.Dou; /// /// 槽位在拼装流程中的顺序值。 /// [SerializeField] private int _buildOrder; /// /// 是否要求严格按顺序放置。 /// [SerializeField] private bool _requireStrictOrder = true; /// /// 部件吸附点;为空时使用自身 RectTransform。 /// [SerializeField] private RectTransform _snapPoint; #endregion #region Runtime State /// /// 玩法控制器引用。 /// private CombineComponent _controller; /// /// 当前占用该槽位的部件。 /// private CombineDraggablePart _occupiedPart; #endregion #region Public Query /// /// 获取槽位要求的部件类型。 /// public CombinePartType RequiredPartType => _requiredPartType; /// /// 获取槽位顺序值。 /// public int BuildOrder => _buildOrder; /// /// 获取槽位是否要求严格顺序。 /// public bool RequireStrictOrder => _requireStrictOrder; /// /// 获取槽位是否已被占用。 /// public bool IsOccupied => _occupiedPart != null; /// /// 获取槽位吸附点。 /// public RectTransform SnapPoint => _snapPoint != null ? _snapPoint : transform as RectTransform; #endregion #region Setup /// /// 绑定玩法控制器。 /// public void BindController(CombineComponent controller) { _controller = controller; } /// /// 设置槽位吸附点,为空时回退到槽位自身。 /// public void SetSnapPoint(RectTransform snapPoint) { _snapPoint = snapPoint; } /// /// 重置槽位占用状态。 /// public void ResetSlot() { _occupiedPart = null; } #endregion #region Drop Handling /// /// 拖拽放下回调:识别部件并交给控制器校验放置。 /// public void OnDrop(PointerEventData eventData) { if (!CanHandleDrop(eventData)) { return; } CombineDraggablePart part = eventData.pointerDrag.GetComponent(); if (part == null) { return; } _controller.TryPlacePart(part, this); } /// /// 校验是否满足处理放下事件的前置条件。 /// private bool CanHandleDrop(PointerEventData eventData) { return _controller != null && eventData != null && eventData.pointerDrag != null; } #endregion #region Occupancy /// /// 标记当前槽位被指定部件占用。 /// internal void SetOccupiedPart(CombineDraggablePart part) { _occupiedPart = part; } /// /// 清理槽位占用,仅在占用者与传入部件一致时生效。 /// internal void ClearOccupiedPart(CombineDraggablePart part) { if (_occupiedPart == part) { _occupiedPart = null; } } #endregion } }