植物地图生成器工作类 (PlantMapGenerator)
功能说明
PlantMapGenerator 是一个专门用于在地图上生成植物(如草丛、树木、灌木等)的工作类。它结合了柏林噪声(Perlin Noise)和概率密度来控制植物的分布,并可以指定植物生长的基础瓦片类型。这使得您可以创建茂密的森林、稀疏的草地或只在特定土壤上生长的植被。
该生成器通过 MapGeneratorDef 中的 workClass 字段引用,其具体的行为由 value 字段中提供的 JSON 配置来控制。
可用参数
PlantMapGenerator 通过解析 MapGeneratorDef 中 value 字段里的 JSON 配置来工作。此 JSON 配置对应 PlantGeneratorConfig。
| JSON参数名 | XML参数名 (N/A) | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
tileDefName | N/A | 字符串 | DefaultPlantTile | 必需。要生成的 植物瓦片定义 (TileDef) 的 defName。通常此瓦片定义会放置在 plant 层。 |
scale | N/A | 浮点数 | 0.08 | 柏林噪声的缩放因子。值越大,植物群落分布越细碎;值越小,群落范围越大越连贯。 |
threshold | N/A | 浮点数 | 0.3 | 柏林噪声的阈值(-1到1之间)。只有柏林噪声值高于此阈值的格子才优先考虑生成植物。 |
density | N/A | 浮点数 | 0.6 | 植物生成概率(0.0到1.0之间)。在所有条件(包括柏林噪声和基础瓦片)都满足的情况下,该格子最终生成植物的概率。 |
offsetX | N/A | 浮点数 | 0.0 | 柏林噪声在X轴上的偏移量,用于改变噪声图案的起始位置。 |
offsetY | N/A | 浮点数 | 0.0 | 柏林噪声在Y轴上的偏移量,用于改变噪声图案的起始位置。 |
requiredBaseTileDefNames | N/A | 字符串列表 | 无 (null) | 可选。一个字符串列表,包含植物必须生长其上的 基础瓦片定义 (TileDef) 的 defName。如果指定,只有当当前位置的基础层瓦片是列表中任意一个时,才可能生成植物。如果为空,则不检查此条件。 |
mapCellSizeX | N/A | 整数 | 100 | 地图生成区域的宽度(以单元格数量计)。 |
mapCellSizeY | N/A | 整数 | 100 | 地图生成区域的高度(以单元格数量计)。 |
preventOverlap | N/A | 布尔值 | true | 可选。如果为 true,生成器会避免在已经有植物瓦片的格子上再次生成植物。 |
示例
以下是一个 MapGeneratorDef 的示例,它使用了 PlantMapGenerator 在草地和泥土上生成一些稀疏的树木:
<Define>
<!-- 瓦片定义示例 -->
<TileDef>
<defName>Grass</defName>
<label>草地</label>
<texture>tileMap_Grass</texture>
<collider>None</collider>
<tileCost>0</tileCost>
</TileDef>
<TileDef>
<defName>Dirt</defName>
<label>泥土</label>
<texture>tileMap_Dirt</texture>
<collider>None</collider>
<tileCost>0</tileCost>
</TileDef>
<TileDef>
<defName>TreePine</defName>
<label>松树</label>
<texture>plant_TreePine</texture>
<outputLayer>plant</outputLayer> <!-- 植物通常放置在 plant 层 -->
</TileDef>
<MapGeneratorDef>
<defName>GenerateSparsePineForest</defName>
<label>生成稀疏松树林</label>
<description>在草地和泥土上生成稀疏的松树林。</description>
<workClass>PlantMapGenerator</workClass>
<value>
{
"tileDefName":"TreePine", // 要生成的植物是松树
"scale":0.05, // 柏林噪声缩放因子,值较小,形成更大的森林斑块
"threshold":0.2, // 柏林噪声阈值,控制整体分布区域
"density":0.3, // 密度0.3,表示较为稀疏的树木
"offsetX":10.0, // 噪声X轴偏移
"offsetY":20.0, // 噪声Y轴偏移
"requiredBaseTileDefNames":["Grass", "Dirt"], // 必须生长在草地或泥土上
"mapCellSizeX":200, // 区域宽度200格
"mapCellSizeY":200, // 区域高度200格
"preventOverlap":true // 防止树木重叠
}
</value>
</MapGeneratorDef>
</Define>
复杂参数说明
value 字段 (JSON配置)
- 说明:
MapGeneratorDef中的value字段是一个特别说明,它不使用标准的XML元素赋值方式,而是直接作为文本内容包含一个JSON格式的字符串。这个JSON字符串包含了PlantGeneratorConfig的所有配置参数,用于指导PlantMapGenerator的具体生成行为。您需要确保提供的JSON字符串是语法正确的。 - JSON属性与C#映射关系:
- 所有JSON属性名(如
tileDefName,scale等)与C#类中的对应属性名一致(JSON通常使用驼峰式命名)。
- 所有JSON属性名(如
- 示例:请参考上方的
MapGeneratorDef示例中value标签内的内容。
requiredBaseTileDefNames 字段 (所需基础瓦片定义列表)
- 说明:这是一个JSON数组,包含一个或多个 瓦片定义 (
TileDef) 的defName字符串。PlantMapGenerator在尝试在某个格子生成植物之前,会检查该格子在基础层的瓦片是否与此列表中的任意一个defName匹配。 - JSON定义方式:
上述配置表示,植物只会在 "ForestSoil" 或 "FertileLand" 瓦片上生成。如果此列表为空或未指定,则不进行基础瓦片检查。"requiredBaseTileDefNames":["ForestSoil", "FertileLand"]
柏林噪声配置 (scale, threshold, offsetX, offsetY)
- 说明:这些参数用于控制柏林噪声的生成和应用,从而影响植物的分布。
scale:控制噪声的“频率”或“粒度”。- 值越大 (例如 0.5-1.0):柏林噪声图案变化迅速,导致生成的植物群落更小、更分散、更“点状”。适合生成稀疏分布的小草丛或零星的野花。
- 值越小 (例如 0.01-0.1):柏林噪声图案变化平缓,导致生成的植物群落更大、更连贯。适合生成大片森林或草地。
threshold:柏林噪声的阈值(-1到1)。只有当柏林噪声值高于此阈值时,该位置才被认为是适合生成植物的区域。- 值越高 (接近1):只有噪声值非常高的“峰值”区域才能生成植物,导致植物非常稀疏,只出现在少数高点。
- 值越低 (接近-1):几乎所有区域的噪声值都可能高于阈值,导致植物覆盖范围更广。
offsetX,offsetY:用于在地图上“移动”柏林噪声图案的起始点。每次生成地图或在不同区域生成植物时,改变这些值可以获得不同的随机分布模式,避免重复。
- 总而言之:
scale决定了植物群落的大小和连续性,threshold决定了植物群落的密集程度和覆盖范围。density在满足柏林噪声条件后,再次引入一个随机性层,进一步稀释植物的实际生成数量。 - 示例:
"scale":0.1, "threshold":0.4, "offsetX":500.0, "offsetY":300.0