(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,5 +1,6 @@
using System;
using System.Threading.Tasks;
using Configs;
using Data;
using Managers;
using UnityEngine;
@@ -8,15 +9,14 @@ using UnityEngine.Tilemaps;
namespace Map
{
/// <summary>
/// 表示游戏中的一个维度或场景区域。
/// 实体管理器将根据此维度来组织和管理实体。
/// 表示游戏中的一个维度或场景区域。
/// 实体管理器将根据此维度来组织和管理实体。
/// </summary>
public class Dimension : MonoBehaviour
{
[SerializeField] private bool defaultOpen;
[SerializeField]
[Tooltip("此维度的唯一标识符。如果为空将使用GameObject的名称。")]
[SerializeField] [Tooltip("此维度的唯一标识符。如果为空将使用GameObject的名称。")]
private string _dimensionId;
[SerializeField] public Landform landform;
@@ -24,25 +24,20 @@ namespace Map
public Vector3 cameraPosition = new(0, 0, -10);
public Entity.Entity focusEntity;
public TileBase airWall;
public DimensionDef dimensionDefinition;
public Vector2Int DimensionSize { get; private set; }
public TileBase airWall;
public event Action<Dimension> OnDimensionLoaded;
/// <summary>
/// 获取此维度的唯一标识符。
/// 获取此维度的唯一标识符。
/// </summary>
public string DimensionId
{
get
{
if (string.IsNullOrEmpty(_dimensionId))
{
_dimensionId = Guid.NewGuid().ToString();
}
if (string.IsNullOrEmpty(_dimensionId)) _dimensionId = Guid.NewGuid().ToString();
return _dimensionId;
}
@@ -51,16 +46,13 @@ namespace Map
}
/// <summary>
/// 此维度下所有实体的根Transform。用于组织场景层级。
/// 此维度下所有实体的根Transform。用于组织场景层级。
/// </summary>
public Transform DimensionRoot { get; private set; }
private void Awake()
{
if (!airWall)
{
airWall = Resources.Load<TileBase>("Tile/AirWall");
}
if (!airWall) airWall = Resources.Load<TileBase>("Tile/AirWall");
var id = DimensionId; // 确保 DimensionId 已初始化
var rootObj = new GameObject($"_Entities_{id}");
@@ -68,37 +60,31 @@ namespace Map
DimensionRoot = rootObj.transform;
Program.Instance.RegisterDimension(this);
landform.Init();
if (defaultOpen)
{
Program.Instance.SetFocusedDimension(_dimensionId);
}
if (defaultOpen) Program.Instance.SetFocusedDimension(_dimensionId);
var mapGeneratorId = Configs.ConfigManager.Instance.GetValue<string>(DimensionId);
var mapGeneratorId = ConfigManager.Instance.GetValue<string>(DimensionId);
if (!string.IsNullOrEmpty(mapGeneratorId))
{
dimensionDefinition = DefineManager.Instance.FindDefine<DimensionDef>(mapGeneratorId);
if (dimensionDefinition != null)
{
_ = ApplyDimensionDef(dimensionDefinition);
}
if (dimensionDefinition != null) _ = ApplyDimensionDef(dimensionDefinition);
}
}
private void OnDestroy()
{
if (Program.Instance != null) // 检查单例是否仍然存在
{
Program.Instance.UnregisterDimension(this);
}
}
public event Action<Dimension> OnDimensionLoaded;
/// <summary>
/// 应用维度定义,生成地图并设置边界。
/// 应用维度定义,生成地图并设置边界。
/// </summary>
/// <param name="def">要应用的维度定义。</param>
public async Task ApplyDimensionDef(DimensionDef def)
{
dimensionDefinition = def;
landform.Clear();
var maxWidth = DimensionSize.x;
var maxHeight = DimensionSize.y;
@@ -117,10 +103,9 @@ namespace Map
DimensionSize = new Vector2Int(maxWidth, maxHeight);
cameraPosition = new Vector3(DimensionSize.x / 2f, DimensionSize.y / 2f, -10) + transform.position;
landform.InitEntityCollisionArray(DimensionSize, new Vector2Int());
foreach (var defMapGenerator in def.mapGenerators)
{
await TileManager.Instance.ApplyMapGenerator(defMapGenerator.defName, landform);
}
}
var size = landform.GetSize();
@@ -149,4 +134,4 @@ namespace Map
OnDimensionLoaded?.Invoke(this);
}
}
}
}