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:健康给予,路径优化,结算界面,商店界面 (#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:
@@ -1,74 +1,76 @@
|
||||
using UnityEngine;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks; // 引入 System.Threading.Tasks
|
||||
using System.Threading.Tasks;
|
||||
using Managers;
|
||||
using Newtonsoft.Json;
|
||||
using UnityEngine;
|
||||
using Utils;
|
||||
using Random = UnityEngine.Random;
|
||||
// 引入 System.Threading.Tasks
|
||||
|
||||
namespace Map
|
||||
{
|
||||
/// <summary>
|
||||
/// 植物生成器配置类。
|
||||
/// 植物生成器配置类。
|
||||
/// </summary>
|
||||
public class PlantGeneratorConfig
|
||||
{
|
||||
/// <summary>
|
||||
/// 植物瓦片的定义名称。
|
||||
/// 植物瓦片的定义名称。
|
||||
/// </summary>
|
||||
[JsonProperty("tileDefName", Required = Required.Always)]
|
||||
public string TileDefName { get; set; } = "DefaultPlantTile";
|
||||
|
||||
/// <summary>
|
||||
/// 柏林噪声的缩放因子。
|
||||
/// 柏林噪声的缩放因子。
|
||||
/// </summary>
|
||||
[JsonProperty("scale")]
|
||||
public double Scale { get; set; } = 0.08;
|
||||
|
||||
/// <summary>
|
||||
/// 柏林噪声阈值,高于此值才可能生成植物 (-1到1之间)。
|
||||
/// 柏林噪声阈值,高于此值才可能生成植物 (-1到1之间)。
|
||||
/// </summary>
|
||||
[JsonProperty("threshold")]
|
||||
public double Threshold { get; set; } = 0.3;
|
||||
|
||||
/// <summary>
|
||||
/// 植物生成概率 (0-1之间),控制稀疏度。
|
||||
/// 植物生成概率 (0-1之间),控制稀疏度。
|
||||
/// </summary>
|
||||
[JsonProperty("density")]
|
||||
public double Density { get; set; } = 0.6;
|
||||
|
||||
/// <summary>
|
||||
/// 柏林噪声的X轴偏移。
|
||||
/// 柏林噪声的X轴偏移。
|
||||
/// </summary>
|
||||
[JsonProperty("offsetX")]
|
||||
public double OffsetX { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 柏林噪声的Y轴偏移。
|
||||
/// 柏林噪声的Y轴偏移。
|
||||
/// </summary>
|
||||
[JsonProperty("offsetY")]
|
||||
public double OffsetY { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 植物必须生长在其上的基础瓦片名称列表 (满足其中任意一个即可,可空)。
|
||||
/// 植物必须生长在其上的基础瓦片名称列表 (满足其中任意一个即可,可空)。
|
||||
/// </summary>
|
||||
[JsonProperty("requiredBaseTileDefNames")] // 属性名改为复数形式
|
||||
public List<string> RequiredBaseTileDefNames { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 地图生成区域的宽度(单元格数量)。
|
||||
/// 地图生成区域的宽度(单元格数量)。
|
||||
/// </summary>
|
||||
[JsonProperty("mapCellSizeX")]
|
||||
public int MapCellSizeX { get; set; } = 100;
|
||||
|
||||
/// <summary>
|
||||
/// 地图生成区域的高度(单元格数量)。
|
||||
/// 地图生成区域的高度(单元格数量)。
|
||||
/// </summary>
|
||||
[JsonProperty("mapCellSizeY")]
|
||||
public int MapCellSizeY { get; set; } = 100;
|
||||
|
||||
/// <summary>
|
||||
/// 是否避免植物瓦片互相重叠。
|
||||
/// 是否避免植物瓦片互相重叠。
|
||||
/// </summary>
|
||||
[JsonProperty("preventOverlap")]
|
||||
public bool PreventOverlap { get; set; } = true;
|
||||
@@ -80,7 +82,7 @@ namespace Map
|
||||
private HashSet<string> _requiredBaseTileNames; // 缓存所需基底瓦片的运行时名称集合
|
||||
|
||||
/// <summary>
|
||||
/// 初始化植物生成器,解析JSON配置字符串。
|
||||
/// 初始化植物生成器,解析JSON配置字符串。
|
||||
/// </summary>
|
||||
/// <param name="value">包含植物生成参数的JSON字符串。</param>
|
||||
public override void Init(string value)
|
||||
@@ -146,22 +148,15 @@ namespace Map
|
||||
|
||||
var baseAsset = TileManager.Instance.GetTile(defName);
|
||||
if (baseAsset != null)
|
||||
{
|
||||
_requiredBaseTileNames.Add(baseAsset.name);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 注意:在Init阶段我们只检查资产是否存在,不检查Tilemap。
|
||||
Debug.LogWarning(
|
||||
$"植物地图生成器:无法获取所需的基础瓦片 '{defName}' 的资产。该瓦片将不作为有效基底条件。");
|
||||
}
|
||||
}
|
||||
|
||||
// 如果最终没有有效基底瓦片被加载,则将HashSet设为null,表示不进行此条件检查
|
||||
if (_requiredBaseTileNames.Count == 0)
|
||||
{
|
||||
_requiredBaseTileNames = null;
|
||||
}
|
||||
if (_requiredBaseTileNames.Count == 0) _requiredBaseTileNames = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -182,8 +177,8 @@ namespace Map
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据柏林噪声和配置参数在 `MapGenerator` 的 `plantTilemap` 上生成植物。
|
||||
/// 此方法现在是异步的,以避免阻塞主线程。
|
||||
/// 根据柏林噪声和配置参数在 `MapGenerator` 的 `plantTilemap` 上生成植物。
|
||||
/// 此方法现在是异步的,以避免阻塞主线程。
|
||||
/// </summary>
|
||||
/// <param name="landform">MapGenerator实例,包含要操作的Tilemap。</param>
|
||||
public override async Task Process(Landform landform) // 标记为 async Task
|
||||
@@ -209,12 +204,12 @@ namespace Map
|
||||
}
|
||||
|
||||
// 判断是否有基底瓦片条件被配置
|
||||
bool hasRequiredBaseTilesConfigured = (_requiredBaseTileNames != null && _requiredBaseTileNames.Count > 0);
|
||||
var hasRequiredBaseTilesConfigured = _requiredBaseTileNames != null && _requiredBaseTileNames.Count > 0;
|
||||
// 如果配置了基底瓦片要求,但基础瓦片地图不可用,则无法进行检查,视为条件无法满足,直接中止生成
|
||||
// (这里的 map.baseTilemap == null 已经在函数开头检查过,所以这里逻辑上它不会是null)
|
||||
if (hasRequiredBaseTilesConfigured && landform.baseTilemap == null) // 理论上这个条件不会再发生
|
||||
{
|
||||
Debug.LogWarning($"植物地图生成器:已配置基础瓦片名称列表但基础瓦片地图为空。植物生成将无法满足基础地形要求,因此不会生成任何受此条件限制的植物。");
|
||||
Debug.LogWarning("植物地图生成器:已配置基础瓦片名称列表但基础瓦片地图为空。植物生成将无法满足基础地形要求,因此不会生成任何受此条件限制的植物。");
|
||||
// 此时应该终止,因为不可能满足条件
|
||||
return;
|
||||
}
|
||||
@@ -224,40 +219,28 @@ namespace Map
|
||||
for (var y = 0; y < _config.MapCellSizeY; y++)
|
||||
{
|
||||
var cellPosition = new Vector3Int(x, y, 0);
|
||||
var sampleX = (x / (double)_config.MapCellSizeX) * _config.Scale + _config.OffsetX;
|
||||
var sampleY = (y / (double)_config.MapCellSizeY) * _config.Scale + _config.OffsetY;
|
||||
var sampleX = x / (double)_config.MapCellSizeX * _config.Scale + _config.OffsetX;
|
||||
var sampleY = y / (double)_config.MapCellSizeY * _config.Scale + _config.OffsetY;
|
||||
var noiseValue = PerlinNoise.Instance.Noise(sampleX, sampleY);
|
||||
if (noiseValue < _config.Threshold)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (noiseValue < _config.Threshold) continue;
|
||||
|
||||
// 检查所需的基础瓦片 (仅当有条件被配置时)
|
||||
if (hasRequiredBaseTilesConfigured)
|
||||
{
|
||||
var baseTileOnMap = landform.baseTilemap.GetTile(cellPosition);
|
||||
// 如果当前位置没有瓦片، 或瓦片名称不在允许的条件列表中، 则条件不满足
|
||||
if (baseTileOnMap == null || !_requiredBaseTileNames.Contains(baseTileOnMap.name))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (baseTileOnMap == null || !_requiredBaseTileNames.Contains(baseTileOnMap.name)) continue;
|
||||
}
|
||||
|
||||
// 检查是否重叠
|
||||
if (_config.PreventOverlap)
|
||||
{
|
||||
var existingPlant = landform.plantTilemap.GetTile(cellPosition);
|
||||
if (existingPlant != null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (existingPlant != null) continue;
|
||||
}
|
||||
|
||||
// 检查密度
|
||||
if (UnityEngine.Random.value >= _config.Density)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (Random.value >= _config.Density) continue;
|
||||
|
||||
landform.plantTilemap.SetTile(cellPosition, plantTile);
|
||||
}
|
||||
@@ -273,4 +256,4 @@ namespace Map
|
||||
return new Vector2Int(_config.MapCellSizeX, _config.MapCellSizeY);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user