Files
aibis-dream/Assets/Scripts/MiniGame/BlockPuzzle/Class/ShapeFactory.cs
T

109 lines
3.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)
{
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<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);
}
/// <summary>
/// 批量设置所有形状的可拖拽状态
/// </summary>
/// <param name="draggable">是否可拖拽</param>
public void SetAllShapesDraggable(bool draggable)
{
foreach (var shape in _blockShapeList)
{
if (shape != null && shape.ShapeDragger != null)
{
shape.ShapeDragger.IsDraggable = draggable;
}
}
}
/// <summary>
/// 播放形状动画
/// </summary>
/// <param name="triggerName">动画触发器名称</param>
public void PlayShapeAnimation(string triggerName)
{
foreach (var shape in _blockShapeList)
{
if (shape != null)
{
shape.PlayAnimation(triggerName);
}
}
}
}
}