102 lines
3.4 KiB
C#
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);
|
|
}
|
|
}
|
|
} |