Files
aibis-dream/Assets/Scripts/MiniGame/BlockPuzzle/Class/BlockShapeRack.cs
T
2025-12-12 23:11:24 +08:00

102 lines
3.4 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using AibisDream.Utility;
namespace AibisDream
{
public class BlockShapeRack : MonoBehaviour, IBlockShapeFactory
{
[SerializeField] private Transform shapeRoot;
[SerializeField] private ScrollRect scrollRect;
[Header("预制体")]
[SerializeField] private GameObject shapeCreateButtonPrefab;
[SerializeField] private GameObject blockShapePrefab;
[HideInInspector] public RackDataInfo[] blockShapeDataList;
private Dictionary<string, ShapeCreateButton> buttonDict;
public void Init(RackDataInfo[] blockShapeDataList)
{
this.blockShapeDataList = blockShapeDataList;
InitShapeButtons();
}
public void InitInEditor(RackDataInfo[] blockShapeDataList)
{
this.blockShapeDataList = blockShapeDataList;
}
private void InitShapeButtons()
{
scrollRect.content.DestroyAllChildren();
buttonDict = new Dictionary<string, ShapeCreateButton>();
foreach (var blockShapeData in blockShapeDataList)
{
var button = Instantiate(shapeCreateButtonPrefab, scrollRect.content).GetComponent<ShapeCreateButton>();
button.SetButtonInfo(blockShapeData.key, blockShapeData.count);
button.OnClick += CreateShapeByButton;
buttonDict.Add(blockShapeData.key, button);
}
}
public void Clear()
{
buttonDict?.Clear();
blockShapeDataList = new RackDataInfo[0];
}
private void CreateShapeByButton(string key)
{
var blockShape = CreateBlockShape(key);
blockShape.ShapeDragger.StartDrag();
}
public void RecycleBlockShape(BlockShape blockShape)
{
// 将数据加回对象池
if (buttonDict.TryGetValue(blockShape.ShapeName, out var oldButton))
{
oldButton.AddCount();
}
else
{
// 创建新的按钮
var button = Instantiate(shapeCreateButtonPrefab, scrollRect.content).GetComponent<ShapeCreateButton>();
button.SetButtonInfo(blockShape.ShapeName, 1);
button.OnClick += CreateShapeByButton;
buttonDict.Add(blockShape.ShapeName, button);
}
// 销毁物体
Destroy(blockShape.gameObject);
}
// ------------------------------ 图形工厂类实现 ------------------------------
public BlockShape CreateBlockShape(BlockShapeData blockShapeData)
{
var blockShape = Instantiate(blockShapePrefab, shapeRoot).GetComponent<BlockShape>();
blockShape.Init(blockShapeData);
return blockShape;
}
public BlockShape CreateBlockShape(string key)
{
if (string.IsNullOrEmpty(key))
{
return Instantiate(blockShapePrefab, shapeRoot).GetComponent<BlockShape>();
}
if (!BlockPuzzleKit.TryLoadBlockShapeData(key, out var blockShapeData))
{
Debug.LogError($"获取配置信息失败: {key}");
return null;
}
return CreateBlockShape(blockShapeData);
}
}
}