植物地图生成器工作类 (PlantMapGenerator)

功能说明

PlantMapGenerator 是一个专门用于在地图上生成植物(如草丛、树木、灌木等)的工作类。它结合了柏林噪声(Perlin Noise)和概率密度来控制植物的分布,并可以指定植物生长的基础瓦片类型。这使得您可以创建茂密的森林、稀疏的草地或只在特定土壤上生长的植被。

该生成器通过 MapGeneratorDef 中的 workClass 字段引用,其具体的行为由 value 字段中提供的 JSON 配置来控制。

可用参数

PlantMapGenerator 通过解析 MapGeneratorDefvalue 字段里的 JSON 配置来工作。此 JSON 配置对应 PlantGeneratorConfig

JSON参数名XML参数名 (N/A)类型默认值说明
tileDefNameN/A字符串DefaultPlantTile必需。要生成的 植物瓦片定义 (TileDef)defName。通常此瓦片定义会放置在 plant 层。
scaleN/A浮点数0.08柏林噪声的缩放因子。值越大,植物群落分布越细碎;值越小,群落范围越大越连贯。
thresholdN/A浮点数0.3柏林噪声的阈值(-1到1之间)。只有柏林噪声值高于此阈值的格子才优先考虑生成植物。
densityN/A浮点数0.6植物生成概率(0.0到1.0之间)。在所有条件(包括柏林噪声和基础瓦片)都满足的情况下,该格子最终生成植物的概率。
offsetXN/A浮点数0.0柏林噪声在X轴上的偏移量,用于改变噪声图案的起始位置。
offsetYN/A浮点数0.0柏林噪声在Y轴上的偏移量,用于改变噪声图案的起始位置。
requiredBaseTileDefNamesN/A字符串列表无 (null)可选。一个字符串列表,包含植物必须生长其上的 基础瓦片定义 (TileDef)defName。如果指定,只有当当前位置的基础层瓦片是列表中任意一个时,才可能生成植物。如果为空,则不检查此条件。
mapCellSizeXN/A整数100地图生成区域的宽度(以单元格数量计)。
mapCellSizeYN/A整数100地图生成区域的高度(以单元格数量计)。
preventOverlapN/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通常使用驼峰式命名)。
  • 示例:请参考上方的 MapGeneratorDef 示例中 value 标签内的内容。
requiredBaseTileDefNames 字段 (所需基础瓦片定义列表)
  • 说明:这是一个JSON数组,包含一个或多个 瓦片定义 (TileDef)defName 字符串。PlantMapGenerator 在尝试在某个格子生成植物之前,会检查该格子在基础层的瓦片是否与此列表中的任意一个 defName 匹配。
  • JSON定义方式
    "requiredBaseTileDefNames":["ForestSoil", "FertileLand"]
    
    上述配置表示,植物只会在 "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