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;
///
/// 放置成功后的力学说明文案。
///
[SerializeField] [TextArea(2, 4)] private string _mechanicsExplanation = string.Empty;
///
/// 部件不匹配时的自定义提示文案。
///
[SerializeField] [TextArea(2, 4)] private string _mismatchHint = string.Empty;
#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 string MechanicsExplanation => _mechanicsExplanation;
///
/// 获取槽位不匹配提示文案。
///
public string MismatchHint => _mismatchHint;
///
/// 获取槽位吸附点。
///
public RectTransform SnapPoint => _snapPoint != null ? _snapPoint : transform as RectTransform;
#endregion
#region Setup
///
/// 绑定玩法控制器。
///
public void BindController(CombineComponent controller)
{
_controller = controller;
}
///
/// 使用运行时数据初始化槽位配置。
///
public void Initialize(CombineSlotContext data)
{
_requiredPartType = data.RequiredPartType;
_buildOrder = data.BuildOrder;
_requireStrictOrder = data.RequireStrictOrder;
_mechanicsExplanation = data.MechanicsExplanation ?? string.Empty;
_mismatchHint = data.MismatchHint ?? string.Empty;
RectTransform rectTransform = transform as RectTransform;
if (rectTransform != null)
{
rectTransform.anchoredPosition = data.AnchoredPosition;
rectTransform.sizeDelta = data.SizeDelta;
}
}
///
/// 设置槽位吸附点,为空时回退到槽位自身。
///
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
}
}