mirror of
http://47.107.252.169:3000/Roguelite-Game-Developing-Team/Gen_Hack-and-Slash-Roguelite.git
synced 2025-11-20 05:27:13 +08:00
(client) feat:支持定义实体的碰撞体大小和偏移;建筑支持定义实体建筑和瓦片建筑,建筑支持指定按钮回调;添加存档管理器;Dev支持设置是否暂停;实体允许定义事件组;添加基地界面 (#57)
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/57
This commit is contained in:
@@ -1,52 +1,81 @@
|
||||
using System.Collections.Generic;
|
||||
using Data;
|
||||
using Managers;
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using TMPro;
|
||||
using UnityEngine.EventSystems;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace UI
|
||||
{
|
||||
/// <summary>
|
||||
/// 技能树节点的用户界面组件。
|
||||
/// 技能树节点组件。
|
||||
/// </summary>
|
||||
public class SkillTreeNodeUI : MonoBehaviour
|
||||
public class SkillTreeNodeUI : MonoBehaviour,IPointerClickHandler
|
||||
{
|
||||
/// <summary>
|
||||
/// <summary>
|
||||
/// 节点的RectTransform组件。
|
||||
/// </summary>
|
||||
public RectTransform rectTransform;
|
||||
|
||||
/// <summary>
|
||||
/// 节点的最小高度。
|
||||
/// </summary>
|
||||
[SerializeField] private float NODE_MIN_HEIGHT = 39.0122f * 2;
|
||||
|
||||
/// <summary>
|
||||
/// 两条连接线结束点之间的最小垂直间距。
|
||||
/// </summary>
|
||||
[SerializeField]private float MIN_VERTICAL_SPACING = 12.9447f;
|
||||
[SerializeField] private float MIN_VERTICAL_SPACING = 12.9447f;
|
||||
|
||||
/// <summary>
|
||||
/// 技能节点入口线UI组件。
|
||||
/// </summary>
|
||||
public SkillNodeEnterLineUI skillNodeEnterLineUI;
|
||||
|
||||
/// <summary>
|
||||
/// 输出线连接点的参考或容器。
|
||||
/// </summary>
|
||||
public RectTransform outputHead;
|
||||
|
||||
/// <summary>
|
||||
/// 文本显示组件。
|
||||
/// </summary>
|
||||
public TMP_Text text;
|
||||
|
||||
public SkillTreeDef skillTreeDef;
|
||||
public SkillTreeDef SkillTreeDefine { get; private set; }
|
||||
|
||||
public Image lockedNodeImage;
|
||||
[SerializeField] private Sprite unlockedSprite;
|
||||
[SerializeField] private Sprite lockedSprite;
|
||||
[SerializeField] private Color unlockedColor;
|
||||
[SerializeField] private Color lockedColor;
|
||||
[SerializeField] private GameObject shader;
|
||||
|
||||
|
||||
public void Init(SkillTreeDef skillTreeDef)
|
||||
{
|
||||
SkillTreeDefine = skillTreeDef;
|
||||
text.text = skillTreeDef.label;
|
||||
Refresh();
|
||||
}
|
||||
|
||||
public void Refresh()
|
||||
{
|
||||
var isSkillTreeUnlocked = SkillTreeManager.Instance.IsSkillTreeUnlocked(SkillTreeDefine.defName);
|
||||
shader.SetActive(!isSkillTreeUnlocked);
|
||||
|
||||
lockedNodeImage.sprite = isSkillTreeUnlocked ? unlockedSprite : lockedSprite;
|
||||
lockedNodeImage.color = isSkillTreeUnlocked ? unlockedColor : lockedColor;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 初始化技能树节点UI。
|
||||
/// </summary>
|
||||
/// <param name="linkLinePoints">连接线的点数组。</param>
|
||||
/// <param name="label">节点显示的文本标签。</param>
|
||||
public void Init(Vector2[] linkLinePoints, string label)
|
||||
public void LinkLine(Vector2[] linkLinePoints)
|
||||
{
|
||||
text.text = label;
|
||||
if (linkLinePoints is { Length: > 0 })
|
||||
{
|
||||
var height = skillNodeEnterLineUI.GetRequiredHeight(linkLinePoints.Length);
|
||||
@@ -54,7 +83,9 @@ namespace UI
|
||||
rectTransform.sizeDelta = new Vector2(rectTransform.sizeDelta.x, height);
|
||||
skillNodeEnterLineUI.Init(linkLinePoints);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 预先计算技能树节点在初始化后所需的最小高度。
|
||||
/// 此方法可以在调用 Init 之前用于布局计算。
|
||||
@@ -68,14 +99,16 @@ namespace UI
|
||||
{
|
||||
return NODE_MIN_HEIGHT;
|
||||
}
|
||||
|
||||
// 获取 SkillNodeEnterLineUI 根据连接线数量计算出的所需高度
|
||||
var calculatedLineHeight = skillNodeEnterLineUI.GetRequiredHeight(linkLineCount);
|
||||
// 结合最小节点高度和额外的填充,确保节点有足够的空间
|
||||
// 逻辑与 Init() 方法中的高度计算保持一致
|
||||
var finalHeight = Mathf.Max(calculatedLineHeight + NODE_MIN_HEIGHT / 2 + 10, NODE_MIN_HEIGHT);
|
||||
|
||||
|
||||
return finalHeight;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查询出口位置。
|
||||
/// </summary>
|
||||
@@ -127,5 +160,19 @@ namespace UI
|
||||
|
||||
return new Vector2(worldX, worldY);
|
||||
}
|
||||
|
||||
public void OnPointerClick(PointerEventData eventData)
|
||||
{
|
||||
if (eventData.button == PointerEventData.InputButton.Left)
|
||||
{
|
||||
SkillTreeManager.Instance.UnlockSkillTree(SkillTreeDefine.defName);
|
||||
Refresh();
|
||||
}
|
||||
else if (eventData.button == PointerEventData.InputButton.Right)
|
||||
{
|
||||
SkillTreeManager.Instance.LockSkillTree(SkillTreeDefine.defName);
|
||||
Refresh();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user