109 lines
3.3 KiB
C#
109 lines
3.3 KiB
C#
using UnityEngine;
|
|
|
|
namespace AibisDream
|
|
{
|
|
public class ShapeRecycleSlot : MonoBehaviour
|
|
{
|
|
public PositionState CurrentState => mover.GetCurrentState();
|
|
[SerializeField] private ThreeStatePositionMover mover;
|
|
[SerializeField] private BoxArea halfArea;
|
|
[SerializeField] private BoxArea openArea;
|
|
[SerializeField] private Transform attachPoint; // 吸附点,如果为空则吸附到(0,0)
|
|
|
|
// ----------------------- 回收逻辑 -----------------------
|
|
public void PreRecycle()
|
|
{
|
|
// 回收槽半弹出
|
|
mover.SetToHalf();
|
|
// TODO: 边缘发光提示
|
|
}
|
|
|
|
public void OpenForRecycle()
|
|
{
|
|
// 回收槽完全弹出
|
|
mover.SetToOpen();
|
|
// TODO: 边缘发光提示
|
|
}
|
|
|
|
public void CloseForRecycle()
|
|
{
|
|
// 回收槽回到半关闭
|
|
mover.SetToHalf();
|
|
// TODO: 边缘发光提示
|
|
}
|
|
|
|
public void RecycleShape(BlockShape shape)
|
|
{
|
|
// 将 shape 放到回收槽
|
|
PutShapeInSlot(shape);
|
|
// 播放回收动画
|
|
mover.SetToClose();
|
|
// TODO: 销毁Shape
|
|
}
|
|
|
|
// ----------------------- 添加逻辑 -----------------------
|
|
|
|
public void PopUpShape(BlockShape shape)
|
|
{
|
|
// 将 shape 添加到回收槽
|
|
PutShapeInSlot(shape);
|
|
// TODO: 播放弹出动画
|
|
mover.SetToOpen();
|
|
}
|
|
|
|
// ----------------------- 状态校验 -----------------------
|
|
|
|
private bool _isRecycleAvaliable = false;
|
|
|
|
public void SetRecycleAvaliable(bool isAvaliable)
|
|
{
|
|
_isRecycleAvaliable = isAvaliable;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 当物体拖动时,更新回收槽状态
|
|
/// </summary>
|
|
public void UpdateSlotState(IBlockShape shape)
|
|
{
|
|
// 如果回收槽不可用或者正在移动,则不更新状态
|
|
if (!_isRecycleAvaliable || mover.IsMoving) return;
|
|
|
|
// 开启状态下的判断
|
|
if (mover.GetCurrentState() == PositionState.Open)
|
|
{
|
|
if (!openArea.Contains(shape.GetGlobalCenterPosition()))
|
|
{
|
|
CloseForRecycle();
|
|
}
|
|
return;
|
|
}
|
|
|
|
// 半关闭状态下的判断
|
|
if (mover.GetCurrentState() == PositionState.Half)
|
|
{
|
|
if (halfArea.Contains(shape.GetGlobalCenterPosition()))
|
|
{
|
|
OpenForRecycle();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void PutShapeInSlot(BlockShape shape)
|
|
{
|
|
shape.transform.SetParent(mover.transform);
|
|
Vector3 centerPosition = shape.GetCenterPosition();
|
|
|
|
// 如果有配置吸附点,则吸附到吸附点;否则吸附到(0,0)
|
|
if (attachPoint != null)
|
|
{
|
|
// 吸附点挂在mover下面,直接使用本地坐标
|
|
shape.transform.localPosition = attachPoint.localPosition - centerPosition;
|
|
}
|
|
else
|
|
{
|
|
// 默认行为:吸附到(0,0)
|
|
shape.transform.localPosition = -centerPosition;
|
|
}
|
|
}
|
|
}
|
|
} |