(client) feat:健康给予,路径优化,结算界面,商店界面 (#60)

Co-authored-by: m0_75251201 <m0_75251201@noreply.gitcode.com>
Reviewed-on: http://47.107.252.169:3000/Roguelite-Game-Developing-Team/Gen_Hack-and-Slash-Roguelite/pulls/60
This commit is contained in:
2025-10-10 14:08:23 +08:00
parent 9a797479ff
commit 16b49f3d3a
1900 changed files with 114053 additions and 34157 deletions

View File

@@ -1,24 +1,22 @@
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
namespace UI
{
/// <summary>
/// 技能节点入口连接线UI管理器。
/// 负责生成、管理和清除技能节点进入线的UI表示。
/// 这些线通常连接技能树中的多个起始点到一个公共的出口区域。
/// 技能节点入口连接线UI管理器。
/// 负责生成、管理和清除技能节点进入线的UI表示。
/// 这些线通常连接技能树中的多个起始点到一个公共的出口区域。
/// </summary>
public class SkillNodeEnterLineUI : MonoBehaviour
{
private const float MIN_VERTICAL_SPACING = 12.9447f; // 两条连接线结束点之间的最小垂直间距
private const float FIRST_POINT_Y_OFFSET = 39.0122f; // 第一个最低的结束点相对于RectTransform底部的Y轴偏移量
[SerializeField] private SkillNodeLinkLineUI skillNodeLinkLineUIPrefab;
[SerializeField] private RectTransform rectTransform;
private const float MIN_VERTICAL_SPACING = 12.9447f; // 两条连接线结束点之间的最小垂直间距
private const float FIRST_POINT_Y_OFFSET = 39.0122f; // 第一个最低的结束点相对于RectTransform底部的Y轴偏移量
/// <summary>
/// 初始化连接线并根据起始点数组绘制连接路径。
/// 初始化连接线并根据起始点数组绘制连接路径。
/// </summary>
/// <param name="startPoints">连接线的起始点数组,通常按从高到低排列。</param>
/// <returns>所有连接线结束点所占据的最小总垂直高度如果无连接线则返回0。</returns>
@@ -42,10 +40,8 @@ namespace UI
// 获取起始点的数量。
var numLines = startPoints.Length;
if (numLines == 0)
{
// 没有起始点无需绘制返回0高度。
return GetRequiredHeight(0); // 使用统一的获取高度方法
}
// 计算所有连接线共享的基准结束点X坐标。
var commonEndPointX = transform.position.x - 6f;
@@ -76,7 +72,7 @@ namespace UI
// 仅有两个点时它们占据“1号位”和“3号位”即间隔是2倍的最小间距
// startPoints[0](最高的起始点)连接到最上面的结束点。
// startPoints[1](最低的起始点)连接到最下面的结束点。
var endPointY_for_startPoints0 = lowestEndPointBaseY + (2 * MIN_VERTICAL_SPACING); // 上方的结束点
var endPointY_for_startPoints0 = lowestEndPointBaseY + 2 * MIN_VERTICAL_SPACING; // 上方的结束点
var endPointY_for_startPoints1 = lowestEndPointBaseY; // 下方的结束点
var line0 = Instantiate(skillNodeLinkLineUIPrefab, transform);
@@ -84,7 +80,7 @@ namespace UI
var line1 = Instantiate(skillNodeLinkLineUIPrefab, transform);
line1.SetConnectionPoints(startPoints[1], new Vector2(commonEndPointX, endPointY_for_startPoints1));
// 两个点的高度跨度为它们之间的垂直距离。
requiredHeight = GetRequiredHeight(2);
}
@@ -114,56 +110,41 @@ namespace UI
}
/// <summary>
/// 根据预期的连接线数量,预先计算所有连接线结束点将占据的最小总垂直高度。
/// 这个方法不会实际创建任何连接线,仅用于高度预估。
/// 根据预期的连接线数量,预先计算所有连接线结束点将占据的最小总垂直高度。
/// 这个方法不会实际创建任何连接线,仅用于高度预估。
/// </summary>
/// <param name="numNodes">预期的连接线数量。</param>
/// <returns>所有连接线结束点所占据的最小总垂直高度如果无连接线则返回0。</returns>
public float GetRequiredHeight(int numNodes)
{
float requiredHeight = 0f;
var requiredHeight = 0f;
if (numNodes <= 0)
{
requiredHeight = 0f;
}
else if (numNodes == 1)
{
// 与Init方法中只有一个起始点时的逻辑保持一致
requiredHeight = 0f;
}
else if (numNodes == 2)
{
// 与Init方法中只有两个起始点时的特殊逻辑保持一致
// 两个点的高度跨度为2倍的最小垂直间距
requiredHeight = 2 * MIN_VERTICAL_SPACING;
}
else // numNodes > 2 (通用情况逻辑)
{
// 与Init方法中多于两个起始点时的通用逻辑保持一致
// n个点占据 (n-1) * 最小垂直间距
requiredHeight = (numNodes - 1) * MIN_VERTICAL_SPACING;
}
return requiredHeight;
}
/// <summary>
/// 清除所有当前作为该GameObject子对象的连接线。
/// 在播放模式下使用 Destroy在编辑器模式下使用 DestroyImmediate。
/// 清除所有当前作为该GameObject子对象的连接线。
/// 在播放模式下使用 Destroy在编辑器模式下使用 DestroyImmediate。
/// </summary>
private void ClearExistingLines()
{
var childrenToDestroy = new List<GameObject>();
for (var i = transform.childCount - 1; i >= 0; i--)
{
childrenToDestroy.Add(transform.GetChild(i).gameObject);
}
foreach (var child in childrenToDestroy)
{
Destroy(child);
}
for (var i = transform.childCount - 1; i >= 0; i--) childrenToDestroy.Add(transform.GetChild(i).gameObject);
foreach (var child in childrenToDestroy) Destroy(child);
}
}
}
}