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 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(); 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); } } 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(); 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.Init(blockShapeData); return blockShape; } public BlockShape CreateBlockShape(string key) { if (string.IsNullOrEmpty(key)) { return Instantiate(blockShapePrefab, shapeRoot).GetComponent(); } if (!BlockPuzzleKit.TryLoadBlockShapeData(key, out var blockShapeData)) { Debug.LogError($"获取配置信息失败: {key}"); return null; } return CreateBlockShape(blockShapeData); } } }