using System; using System.Collections.Generic; using AibisDream.Framework; using AibisDream.Utility; using UnityEngine; using UnityEngine.UI; namespace AibisDream { public class BlockShapeRack : MonoBehaviour, IBlockShapeFactory { [SerializeField] private Transform shapeRoot; [SerializeField] private ScrollRect scrollRect; [SerializeField] private RackDataInfo[] blockShapeDataList; private Dictionary buttonDict; private GameObject _shapeCreateButtonPrefab; private void Awake() { InitPrefab(); InitShapeButtons(); } private void InitPrefab() { _shapeCreateButtonPrefab = ResourceKit.LoadAssetSync(ConstRef.ShapeCreateButtonPrefab); _blockShapePrefab = ResourceKit.LoadAssetSync(ConstRef.BlockShapePrefab); } private void InitShapeButtons() { buttonDict = new Dictionary(); foreach (var blockShapeData in blockShapeDataList) { var button = Instantiate(_shapeCreateButtonPrefab, scrollRect.content).GetComponent(); button.SetButtonInfo(blockShapeData.key, blockShapeData.count); button.OnClick += CreateShapeByButton; buttonDict.Add(blockShapeData.key, button); } } private void CreateShapeByButton(string key) { // 获取配置信息 if (!BlockPuzzleKit.TryLoadBlockShapeData(key, out var blockShapeData)) { Debug.LogError($"获取配置信息失败: {key}"); return; } // 创建形状并开始拖拽 var blockShape = CreateBlockShape(blockShapeData); 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(); button.SetButtonInfo(blockShape.ShapeName, 1); button.OnClick += CreateShapeByButton; buttonDict.Add(blockShape.ShapeName, button); } // 销毁物体 Destroy(blockShape.gameObject); } // ------------------------------ 图形工厂类实现 ------------------------------ private GameObject _blockShapePrefab; public BlockShape CreateBlockShape(BlockShapeData blockShapeData) { var blockShape = Instantiate(_blockShapePrefab, shapeRoot).GetComponent(); blockShape.Init(blockShapeData); return blockShape; } [Serializable] public struct RackDataInfo { public string key; public int count; } } }