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
}
}