biography-of-lijie/Assets/GameMain/Scripts/UI/View/CombineSlot.cs

163 lines
4.2 KiB
C#

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