Files
aibis-dream/Assets/Scripts/MiniGame/BlockPuzzle/Class/BlockShapeRack.cs
T
2025-12-08 19:54:35 +08:00

94 lines
3.1 KiB
C#

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<string, ShapeCreateButton> buttonDict;
private GameObject _shapeCreateButtonPrefab;
private void Awake()
{
InitPrefab();
InitShapeButtons();
}
private void InitPrefab()
{
_shapeCreateButtonPrefab = ResourceKit.LoadAssetSync<GameObject>(ConstRef.ShapeCreateButtonPrefab);
_blockShapePrefab = ResourceKit.LoadAssetSync<GameObject>(ConstRef.BlockShapePrefab);
}
private void InitShapeButtons()
{
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);
}
}
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<ShapeCreateButton>();
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>();
blockShape.Init(blockShapeData);
return blockShape;
}
[Serializable]
public struct RackDataInfo
{
public string key;
public int count;
}
}
}