条件瓦片生成器工作类 (ConditionalTileGenerator)
功能说明
ConditionalTileGenerator 是一个高级地图生成器工作类,它允许您在地图的指定区域内,根据预设的条件(例如:下方是否存在特定瓦片类型或柏林噪声值是否达到阈值)有选择性地放置新的瓦片。这使得您可以创建更动态和有逻辑的地形生成规则,例如:在水域边缘生成芦苇,或在草地上随机分布小石块。
该生成器通过 MapGeneratorDef 中的 workClass 字段引用,其具体的行为由 value 字段中提供的 JSON 配置来控制。
可用参数
ConditionalTileGenerator 通过解析 MapGeneratorDef 中 value 字段里的 JSON 配置来工作。此 JSON 配置对应 ConditionalTileGeneratorConfig。
| JSON参数名 | XML参数名 (N/A) | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
outputTileDefName | N/A | 字符串 | 无 | 必需。符合所有条件时,要放置的 瓦片定义 (TileDef) 的 defName。 |
outputLayer | N/A | 字符串 | 无 | 必需。放置 outputTileDefName 瓦片的目标地图层。可选值有 "base", "building", "plant"。详见下文**outputLayer/conditionLayer 字段**。 |
conditionTileDefNames | N/A | 字符串列表 | 无 | 可选。如果非空,则只有在目标层(由 conditionLayer 指定)的当前位置存在列表中任意一个 TileDef 时,才可能生成 outputTileDefName。如果为空,则不检查此瓦片条件。 |
conditionLayer | N/A | 字符串 | 无 | 可选。当 conditionTileDefNames 非空时,检查条件瓦片的地图层。可选值有 "base", "building", "plant"。详见下文**outputLayer/conditionLayer 字段**。 |
positionX | N/A | 整数 | 无 | 必需。要进行条件检查和瓦片生成操作的矩形区域的起始X坐标(左上角)。 |
positionY | N/A | 整数 | 无 | 必需。要进行条件检查和瓦片生成操作的矩形区域的起始Y坐标(左上角)。 |
width | N/A | 整数 | 1 | 必需。生成区域的宽度(单元格数量)。 |
height | N/A | 整数 | 1 | 必需。生成区域的高度(单元格数量)。 |
usePerlinNoise | N/A | 布尔值 | false | 可选。如果为 true,则在放置瓦片前会进行柏林噪声检查。详见下文柏林噪声配置 (Perlin Noise)。 |
perlinScale | N/A | 浮点数 | 10.0 | 当 usePerlinNoise 为 true 时,柏林噪声的缩放因子(频率)。值越大,地形特征越粗糙;值越小,特征越平滑。 |
perlinThreshold | N/A | 浮点数 | 0.5 | 当 usePerlinNoise 为 true 时,柏林噪声的阈值(0.0到1.0之间)。只有柏林噪声值高于此阈值的格子才会生成瓦片。 |
perlinOffsetX | N/A | 浮点数 | 0.0 | 当 usePerlinNoise 为 true 时,柏林噪声的X轴偏移。 |
perlinOffsetY | N/A | 浮点数 | 0.0 | 当 usePerlinNoise 为 true 时,柏林噪声的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通常使用驼峰式命名)。
- 所有JSON属性名(如
- 示例:请参考上方的
MapGeneratorDef示例中value标签内的内容。
outputLayer / conditionLayer 字段 (地图层级字符串)
- 说明:这两个字段都用于指定地图的层级。这是一个字符串值,而不是一个枚举数字。
- 可选值:
"base": 基础地形层,用于放置地面、水体等。"building": 建筑层,用于放置建筑结构、墙壁等。"plant": 植物层,用于放置树木、草丛等植被。
- 示例:
"outputLayer":"plant""conditionLayer":"base"
conditionTileDefNames 字段 (条件瓦片定义列表)
- 说明:这是一个JSON数组,包含一个或多个 瓦片定义 (
TileDef) 的defName字符串。当ConditionalTileGenerator检查一个格子时,如果该格子在conditionLayer指定的层上拥有此列表中任意一个defName对应的瓦片,则条件检查通过。 - JSON定义方式:
上述配置表示,如果下方瓦片是“Grass”、“Dirt”或“Sand”中的任意一种,则条件满足。"conditionTileDefNames":["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