77 lines
2.4 KiB
C#
77 lines
2.4 KiB
C#
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<BlockShape> _blockShapeList = new List<BlockShape>();
|
|
|
|
public event Action<IBlockShape> OnDragStart;
|
|
public event Action<IBlockShape, bool> OnDragEnd;
|
|
public event Action<IBlockShape> OnDragUpdate;
|
|
|
|
public ShapeFactory(Transform shapeRoot)
|
|
{
|
|
_shapeRoot = shapeRoot;
|
|
_blockShapePrefab = ResourceKit.LoadAssetSync<GameObject>(ConstRef.BlockShapePrefab);
|
|
_blockShapeList = new List<BlockShape>();
|
|
}
|
|
|
|
public BlockShape CreateBlockShape(BlockShapeData blockShapeData)
|
|
{
|
|
var blockShape = UnityEngine.Object.Instantiate(_blockShapePrefab, _shapeRoot).GetComponent<BlockShape>();
|
|
blockShape.Init(blockShapeData);
|
|
_blockShapeList.Add(blockShape);
|
|
|
|
// 注册事件
|
|
var dragger = blockShape.GetComponent<ShapeDragger>();
|
|
dragger.OnDragStart += OnShapeDragStart;
|
|
dragger.OnDragEnd += OnShapeDragEnd;
|
|
dragger.OnDragUpdate += OnShapeDragUpdate;
|
|
return blockShape;
|
|
}
|
|
|
|
private void OnShapeDragStart(IBlockShape blockShape)
|
|
{
|
|
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<BlockShape>();
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
} |