using System; using System.Collections.Generic; using UnityEngine; using AibisDream.Framework; using AibisDream.Utility; namespace AibisDream { public class ShapeFactory { private Transform _shapeRoot; private GameObject _blockShapePrefab; private List _blockShapeList = new List(); public event Action OnDragStart; public event Action OnDragEnd; public event Action OnDragUpdate; public ShapeFactory(Transform shapeRoot) { _shapeRoot = shapeRoot; _blockShapePrefab = ResourceKit.LoadAssetSync(ConstRef.BlockShapePrefab); _blockShapeList = new List(); } public BlockShape CreateBlockShape(BlockShapeData blockShapeData) { var blockShape = UnityEngine.Object.Instantiate(_blockShapePrefab, _shapeRoot).GetComponent(); blockShape.Init(blockShapeData); _blockShapeList.Add(blockShape); // 注册事件 var dragger = blockShape.GetComponent(); dragger.OnDragStart += OnShapeDragStart; dragger.OnDragEnd += OnShapeDragEnd; dragger.OnDragUpdate += OnShapeDragUpdate; return blockShape; } private void OnShapeDragStart(IBlockShape blockShape) { blockShape.ShapeDragger.transform.SetParent(_shapeRoot); OnDragStart?.Invoke(blockShape); } private void OnShapeDragEnd(IBlockShape blockShape, bool isPlaced) { OnDragEnd?.Invoke(blockShape, isPlaced); } private void OnShapeDragUpdate(IBlockShape blockShape) { OnDragUpdate?.Invoke(blockShape); } public BlockShape CreateBlockShape(string key) { if (string.IsNullOrEmpty(key)) { return UnityEngine.Object.Instantiate(_blockShapePrefab, _shapeRoot).GetComponent(); } if (!BlockPuzzleKit.TryLoadBlockShapeData(key, out var blockShapeData)) { Debug.LogError($"获取配置信息失败: {key}"); return null; } return CreateBlockShape(blockShapeData); } public void RecycleBlockShape(BlockShape blockShape) { _blockShapeList.Remove(blockShape); UnityEngine.Object.Destroy(blockShape.gameObject); } /// /// 批量设置所有形状的可拖拽状态 /// /// 是否可拖拽 public void SetAllShapesDraggable(bool draggable) { foreach (var shape in _blockShapeList) { if (shape != null && shape.ShapeDragger != null) { shape.ShapeDragger.IsDraggable = draggable; } } } } }