条件瓦片生成器工作类 (ConditionalTileGenerator)

功能说明

ConditionalTileGenerator 是一个高级地图生成器工作类,它允许您在地图的指定区域内,根据预设的条件(例如:下方是否存在特定瓦片类型或柏林噪声值是否达到阈值)有选择性地放置新的瓦片。这使得您可以创建更动态和有逻辑的地形生成规则,例如:在水域边缘生成芦苇,或在草地上随机分布小石块。

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

可用参数

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

JSON参数名XML参数名 (N/A)类型默认值说明
outputTileDefNameN/A字符串必需。符合所有条件时,要放置的 瓦片定义 (TileDef)defName
outputLayerN/A字符串必需。放置 outputTileDefName 瓦片的目标地图层。可选值有 "base", "building", "plant"。详见下文**outputLayer/conditionLayer 字段**。
conditionTileDefNamesN/A字符串列表可选。如果非空,则只有在目标层(由 conditionLayer 指定)的当前位置存在列表中任意一个 TileDef 时,才可能生成 outputTileDefName。如果为空,则不检查此瓦片条件。
conditionLayerN/A字符串可选。当 conditionTileDefNames 非空时,检查条件瓦片的地图层。可选值有 "base", "building", "plant"。详见下文**outputLayer/conditionLayer 字段**。
positionXN/A整数必需。要进行条件检查和瓦片生成操作的矩形区域的起始X坐标(左上角)。
positionYN/A整数必需。要进行条件检查和瓦片生成操作的矩形区域的起始Y坐标(左上角)。
widthN/A整数1必需。生成区域的宽度(单元格数量)。
heightN/A整数1必需。生成区域的高度(单元格数量)。
usePerlinNoiseN/A布尔值false可选。如果为 true,则在放置瓦片前会进行柏林噪声检查。详见下文柏林噪声配置 (Perlin Noise)
perlinScaleN/A浮点数10.0usePerlinNoisetrue 时,柏林噪声的缩放因子(频率)。值越大,地形特征越粗糙;值越小,特征越平滑。
perlinThresholdN/A浮点数0.5usePerlinNoisetrue 时,柏林噪声的阈值(0.0到1.0之间)。只有柏林噪声值高于此阈值的格子才会生成瓦片。
perlinOffsetXN/A浮点数0.0usePerlinNoisetrue 时,柏林噪声的X轴偏移。
perlinOffsetYN/A浮点数0.0usePerlinNoisetrue 时,柏林噪声的Y轴偏移。

示例

以下是一个 MapGeneratorDef 的示例,它使用了 ConditionalTileGenerator 在特定区域的沙地上生成一些仙人掌:

<Define>
    <!-- 瓦片定义示例 -->
  
    <TileDef>
        <defName>Sand</defName>
        <label>沙地</label>
        <texture>tileMap_Sand</texture>
    </TileDef>
    <!-- 注意:CactusBuildingDef 应该是 BuildingDef 类型,这里简化为 TileDef -->
    <TileDef>
        <defName>Cactus</defName>
        <label>仙人掌</label>
        <texture>tileMap_Cactus</texture>
        <outputLayer>plant</outputLayer>
    </TileDef>

    <MapGeneratorDef>
        <defName>GenerateCactiOnSand</defName>
        <label>在沙地上生成仙人掌</label>
        <description>在地图特定沙地区域内随机生成仙人掌。</description>
        <workClass>ConditionalTileGenerator</workClass>
        <value>
        {
            "outputTileDefName":"Cactus",        // 生成仙人掌
            "outputLayer":"plant",               // 放置在植物层
            "conditionTileDefNames":["Sand"],    // 条件:下方必须是沙地
            "conditionLayer":"base",             // 检查基础层是否有沙地
            "positionX":10,                      // 检查区域的起始X坐标
            "positionY":10,                      // 检查区域的起始Y坐标
            "width":50,                          // 检查区域宽度50格
            "height":50,                         // 检查区域高度50格
            "usePerlinNoise":true,               // 使用柏林噪声进行随机性检查
            "perlinScale":20.0,                  // 柏林噪声频率,数值越大越粗糙(点状分布)
            "perlinThreshold":0.6,               // 只有噪声值高于0.6才生成仙人掌,控制密度
            "perlinOffsetX":100.0,               // 噪声X轴偏移
            "perlinOffsetY":200.0                // 噪声Y轴偏移
        }
        </value>
    </MapGeneratorDef>
</Define>

复杂参数说明

value 字段 (JSON配置)
  • 说明MapGeneratorDef 中的 value 字段是一个特别说明,它不使用标准的XML元素赋值方式,而是直接作为文本内容包含一个JSON格式的字符串。这个JSON字符串包含了 ConditionalTileGeneratorConfig 的所有配置参数,用于指导 ConditionalTileGenerator 的具体生成行为。您需要确保提供的JSON字符串是语法正确的。
  • JSON属性与C#映射关系
    • 所有JSON属性名(如 outputTileDefName, conditionTileDefNames 等)与C#类中的对应属性名一致(JSON通常使用驼峰式命名)。
  • 示例:请参考上方的 MapGeneratorDef 示例中 value 标签内的内容。
outputLayer / conditionLayer 字段 (地图层级字符串)
  • 说明:这两个字段都用于指定地图的层级。这是一个字符串值,而不是一个枚举数字。
  • 可选值
    • "base": 基础地形层,用于放置地面、水体等。
    • "building": 建筑层,用于放置建筑结构、墙壁等。
    • "plant": 植物层,用于放置树木、草丛等植被。
  • 示例
    "outputLayer":"plant"
    
    "conditionLayer":"base"
    
conditionTileDefNames 字段 (条件瓦片定义列表)
  • 说明:这是一个JSON数组,包含一个或多个 瓦片定义 (TileDef)defName 字符串。当 ConditionalTileGenerator 检查一个格子时,如果该格子在 conditionLayer 指定的层上拥有此列表中任意一个 defName 对应的瓦片,则条件检查通过。
  • JSON定义方式
    "conditionTileDefNames":["Grass", "Dirt", "Sand"]
    
    上述配置表示,如果下方瓦片是“Grass”、“Dirt”或“Sand”中的任意一种,则条件满足。
柏林噪声配置 (usePerlinNoise, perlinScale, perlinThreshold, perlinOffsetX, perlinOffsetY)
  • 说明:当 usePerlinNoise 设置为 true 时,生成器会在每个候选位置计算一个柏林噪声值。只有当这个噪声值高于 perlinThreshold 时,瓦片才会被放置。这为生成过程引入了自然的随机性和分布模式。
    • perlinScale:控制柏林噪声的“粒度”。值越大,噪声图案变化越快,特征越小;值越小,图案变化越慢,特征越大。
    • perlinThreshold:决定瓦片放置的密度。较高的阈值意味着只有噪声值非常高的位置才能放置瓦片,从而导致稀疏分布;较低的阈值则会生成更密集的瓦片。
    • perlinOffsetX, perlinOffsetY:用于偏移柏林噪声的起始点,可以改变生成图案的位置,每次生成都可以使用不同的偏移值来获得不同的随机布局。
  • 示例
    "usePerlinNoise":true,
    "perlinScale":15.0,
    "perlinThreshold":0.7,
    "perlinOffsetX":50.0,
    "perlinOffsetY":120.0