初版石头功能可用
This commit is contained in:
@@ -1,10 +1,11 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using Cinemachine;
|
||||
using AibisDream.Kit;
|
||||
using AibisDream.Utility;
|
||||
using System.Linq;
|
||||
using AibisDream.Framework;
|
||||
using System;
|
||||
using UnityEngine.EventSystems;
|
||||
|
||||
namespace AibisDream
|
||||
{
|
||||
@@ -24,6 +25,9 @@ namespace AibisDream
|
||||
private BlockPuzzleValidator validator;
|
||||
private ShapeFactory shapeFactory;
|
||||
|
||||
// 锁定状态
|
||||
public bool IsLocked { get; private set; }
|
||||
|
||||
private void Start()
|
||||
{
|
||||
if (initializeOnStart)
|
||||
@@ -48,53 +52,113 @@ namespace AibisDream
|
||||
|
||||
public void Initialize()
|
||||
{
|
||||
float startTime = Time.realtimeSinceStartup;
|
||||
|
||||
// 初始化网格
|
||||
grid.Initialize(puzzleData.gridWidth, puzzleData.gridHeight, puzzleData.cellSize);
|
||||
|
||||
// 批量预加载所有需要的BlockShapeData,避免循环中重复读取JSON文件
|
||||
var shapeKeys = puzzleData.gridShapeDataInfos.Select(s => s.shapeKey).Distinct().ToArray();
|
||||
var shapeDataDict = BlockPuzzleKit.LoadBlockShapeDataBatch(shapeKeys);
|
||||
|
||||
// 初始化网格上图形
|
||||
shapeFactory = new ShapeFactory(shapeRoot);
|
||||
foreach (var shapeData in puzzleData.gridShapeDataInfos)
|
||||
{
|
||||
var shape = shapeFactory.CreateBlockShape(shapeData.shapeKey);
|
||||
shape.Rotate(shapeData.rotationAngle);
|
||||
grid.TrySnapToGrid(shape, shapeData.rootCell);
|
||||
shape.GetComponent<ShapeDragger>().IsDraggable = shapeData.isDraggable;
|
||||
// 使用预加载的数据创建形状,避免重复读取JSON
|
||||
if (shapeDataDict.TryGetValue(shapeData.shapeKey, out var blockShapeData))
|
||||
{
|
||||
var shape = shapeFactory.CreateBlockShape(blockShapeData);
|
||||
shape.Rotate(shapeData.rotationAngle);
|
||||
grid.TrySnapToGrid(shape, shapeData.rootCell);
|
||||
shape.ShapeDragger.IsDraggable = shapeData.isDraggable;
|
||||
}
|
||||
}
|
||||
|
||||
grid.GridVisualizer.UpdateAllCellsVisual();
|
||||
|
||||
// 加载验证器
|
||||
validator = ResourceKit.LoadAssetSync<BlockPuzzleValidator>(puzzleData.validatorName);
|
||||
blockPuzzlePanel.Panel.SetProgressMaxValue(validator.CollectThresholds());
|
||||
|
||||
// 初始化侧边栏
|
||||
var deviceDatas = BlockPuzzleKit.LoadBlockShapeDataBatch(puzzleData.shapeInRack);
|
||||
blockPuzzlePanel.Panel.DeviceButtonDatas = deviceDatas.Values.ToArray();
|
||||
|
||||
|
||||
// 组装事件逻辑
|
||||
AssembleEventLogic();
|
||||
|
||||
Debug.Log("网格系统初始化完成");
|
||||
}
|
||||
// 初始化时验证一次
|
||||
validator.Validate(grid.GetShapes());
|
||||
|
||||
private void PreCheckGameState()
|
||||
{
|
||||
var shapes = grid.GetShapes();
|
||||
var validateResult = validator.Validate(shapes);
|
||||
// 确保交互状态正确
|
||||
UpdateInteractionState();
|
||||
}
|
||||
|
||||
private void SubmitGameResult()
|
||||
{
|
||||
var shapes = grid.GetShapes();
|
||||
var validateResult = validator.Validate(shapes);
|
||||
// 检查系统是否锁定
|
||||
if (IsLocked)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var validateResult = validator.Validate(grid.GetShapes());
|
||||
|
||||
// 如果验证通过, 则设置变量并弹出对话
|
||||
if (validateResult.isPass)
|
||||
{
|
||||
StorageSystem.Instance.SetValue("$block_puzzle_pass", true);
|
||||
DialogController.Instance.StartDialogNode("方块拼图完成");
|
||||
// StorageSystem.Instance.SetValue("$block_puzzle_pass", true);
|
||||
// DialogController.Instance.StartDialogNode("方块拼图完成");
|
||||
|
||||
Debug.Log("方块拼图完成");
|
||||
}
|
||||
}
|
||||
|
||||
public void ClearGame()
|
||||
{
|
||||
grid.Clear();
|
||||
// shapeRack.Clear();
|
||||
shapeRoot.DestroyAllChildren();
|
||||
// 重置锁定状态
|
||||
SetLocked(false);
|
||||
}
|
||||
|
||||
// --------------------- 锁定状态管理 -------------------
|
||||
|
||||
/// <summary>
|
||||
/// 设置系统锁定状态
|
||||
/// </summary>
|
||||
/// <param name="locked">是否锁定</param>
|
||||
public void SetLocked(bool locked)
|
||||
{
|
||||
IsLocked = locked;
|
||||
UpdateInteractionState();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新所有交互组件的状态
|
||||
/// </summary>
|
||||
private void UpdateInteractionState()
|
||||
{
|
||||
// 更新所有形状的拖拽状态
|
||||
if (shapeFactory != null)
|
||||
{
|
||||
shapeFactory.SetAllShapesDraggable(!IsLocked);
|
||||
}
|
||||
|
||||
// 更新按钮的交互状态
|
||||
if (blockPuzzlePanel != null && blockPuzzlePanel.Panel != null)
|
||||
{
|
||||
var panel = blockPuzzlePanel.Panel;
|
||||
if (panel.LockButton != null)
|
||||
{
|
||||
panel.LockButton.interactable = !IsLocked;
|
||||
}
|
||||
if (panel.PopUpButton != null)
|
||||
{
|
||||
panel.PopUpButton.interactable = !IsLocked;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------- 维修面板同步 -------------------
|
||||
@@ -111,13 +175,14 @@ namespace AibisDream
|
||||
blockPuzzlePanel.Panel.OnSubmit.AddListener(SubmitGameResult);
|
||||
blockPuzzlePanel.Panel.OnPopUp.AddListener(PopUpShape);
|
||||
|
||||
// 由网格触发
|
||||
grid.OnShapePlaced += PreCheckGameState;
|
||||
|
||||
// 由Shape触发
|
||||
shapeFactory.OnDragStart += OnShapeDragStart;
|
||||
shapeFactory.OnDragEnd += OnShapeDragEnd;
|
||||
shapeFactory.OnDragUpdate += OnShapeDragUpdate;
|
||||
|
||||
// 由系统触发
|
||||
validator.OnValidate.AddListener(blockPuzzlePanel.Panel.SetVaildState);
|
||||
validator.OnValidate.AddListener(blockPuzzlePanel.Panel.OnProgressChanged);
|
||||
}
|
||||
|
||||
private void OnPanelShapeSelected(BlockShapeInfo shapeData)
|
||||
@@ -127,28 +192,31 @@ namespace AibisDream
|
||||
blockPuzzlePanel.ShowShapeInScreen(shapeData);
|
||||
}
|
||||
|
||||
public void OnValidateResult(ValidateResult validateResult)
|
||||
{
|
||||
// 先更新进度条
|
||||
|
||||
// 再更新校验结果,包括锁定按钮等UI
|
||||
|
||||
}
|
||||
|
||||
public void OnShapeDragStart(IBlockShape blockShape)
|
||||
{
|
||||
// 更新选中图形
|
||||
// 显示Info
|
||||
if (blockShape is BlockShape shape && shape.BlockShapeData.blockShapeInfo.shapeName != null)
|
||||
{
|
||||
blockPuzzlePanel.ShowShapeInScreen(shape.BlockShapeData.blockShapeInfo);
|
||||
EventSystem.current.SetSelectedGameObject(null);
|
||||
selectedShapeName = null;
|
||||
}
|
||||
|
||||
// 回收抽屉高亮,半开
|
||||
shapeRecycleSlot.PreRecycle();
|
||||
shapeRecycleSlot.SetRecycleAvaliable(true);
|
||||
|
||||
// 每次拿起时也要校验
|
||||
validator.Validate(grid.GetShapes());
|
||||
}
|
||||
|
||||
public void OnShapeDragEnd(IBlockShape blockShape, bool isPlaced)
|
||||
{
|
||||
//
|
||||
|
||||
// TODO: 如果吸附到回收处,应该播放动画,并提示回收成功
|
||||
// 如果放置成功,则预先检查一次
|
||||
if (isPlaced)
|
||||
{
|
||||
validator.Validate(grid.GetShapes());
|
||||
}
|
||||
}
|
||||
|
||||
public void OnShapeDragUpdate(IBlockShape blockShape)
|
||||
@@ -159,6 +227,12 @@ namespace AibisDream
|
||||
|
||||
public void PopUpShape()
|
||||
{
|
||||
// 检查系统是否锁定
|
||||
if (IsLocked)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (selectedShapeName == null)
|
||||
{
|
||||
return;
|
||||
@@ -172,7 +246,6 @@ namespace AibisDream
|
||||
// 删除按钮
|
||||
blockPuzzlePanel.Panel.RemoveDeviceButton(selectedShapeName);
|
||||
selectedShapeName = null;
|
||||
blockPuzzlePanel.ClearShapeInScreen();
|
||||
}
|
||||
|
||||
// --------------------- 吸附校验 ---------------------
|
||||
@@ -183,7 +256,10 @@ namespace AibisDream
|
||||
if (shapeRecycleSlot.CurrentState == PositionState.Open)
|
||||
{
|
||||
shapeRecycleSlot.RecycleShape(blockShape);
|
||||
// TODO: 向面板添加回收的形状
|
||||
// 清空屏幕并切换回LogScreen
|
||||
blockPuzzlePanel.ClearShapeInScreen();
|
||||
blockPuzzlePanel.SwitchToLogScreen();
|
||||
// 向面板添加回收的形状
|
||||
blockPuzzlePanel.Panel.OnDeviceRecycle(blockShape);
|
||||
// 延时后进行销毁
|
||||
ActionKit.Delay(1.0f, () => {
|
||||
|
||||
Reference in New Issue
Block a user