建筑地图生成器工作类 (BuildingMapGenerator)

功能说明

BuildingMapGenerator 是一个专门用于在地图上生成预定义建筑图案的工作类。它通过解析一个JSON格式的配置,将一个二维整数数组表示的图案(pattern)映射到具体的瓦片或建筑定义(mapping),然后将这些瓦片放置在地图的指定位置。这使得您可以轻松地在地图上放置复杂的预设结构,如房间、堡垒或其他定型建筑。

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

可用参数

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

JSON参数名XML参数名 (N/A)类型默认值说明
defNameN/A字符串可选。此建筑图案配置的内部名称。
mappingN/A字典 (int -> string)必需。将 pattern 数组中的整数值映射到 瓦片定义 (TileDef)建筑定义 (BuildingDef)defName 的字典。详见下文**mapping 字段**。
patternN/A二维整数数组必需。一个二维整数数组,表示建筑的布局图案。数组中的每个整数值都应在 mapping 字典中找到对应的定义。详见下文**pattern 字段**。
baseTileDefNameN/A字符串可选。生成建筑图案所需的基底瓦片类型(例如,必须在"Grass"瓦片上建造)。如果指定,生成器会在放置建筑前检查下方瓦片是否匹配。
autoExpandN/A布尔值false可选。如果为 true,生成器会在指定 positionX/positionY 附近寻找一个合适的空闲区域来放置建筑。如果为 false,则严格按照 positionX/positionY 放置。
positionXN/A整数必需。建筑图案放置起始位置的X坐标(左上角)。
positionYN/A整数必需。建筑图案放置起始位置的Y坐标(左上角)。

示例

以下是一个 MapGeneratorDef 示例,它使用了 BuildingMapGenerator 来生成一个简单的方形房间:

<Define>
    <!-- 瓦片定义示例 -->
    <TileDef>
        <defName>Grass</defName>
        <label>草地</label>
        <texture>tileMap_Grass</texture>
        <collider>None</collider>
        <tileCost>0</tileCost>
    </TileDef>
    <BuildingDef>
        <defName>WoodWall</defName>
        <label>木墙</label>
        <description>坚固的木制墙壁。</description>
        <!-- ... 其他建筑属性 ... -->
    </BuildingDef>
    <BuildingDef>
        <defName>WoodDoor</defName>
        <label>木门</label>
        <description>一扇普通的木门。</description>
        <!-- ... 其他建筑属性 ... -->
    </BuildingDef>
    <BuildingDef>
        <defName>Empty</defName>
        <label>空</label>
        <description>表示空单元格。</description>
        <!-- 一个特殊的空定义,用于mapping中的0 -->
    </BuildingDef>

    <MapGeneratorDef>
        <defName>SimpleRoomGenerator</defName>
        <label>简单房间生成器</label>
        <description>在指定位置生成一个木制房间。</description>
        <workClass>BuildingMapGenerator</workClass>
        <value>
        {
            "defName":"SquareWoodRoom",       // 建筑图案的内部名称
            "mapping":{                       // 整数到瓦片/建筑定义的映射
                "0":"Empty",                  // 0表示地板(空地)
                "1":"WoodWall",               // 1表示木墙
                "2":"WoodDoor"                // 2表示木门
            },
            "pattern":[                       // 2D整数数组定义房间布局
                [1,1,1,1,1],
                [1,0,0,0,1],
                [1,0,2,0,1],
                [1,0,0,0,1],
                [1,1,1,1,1]
            ],
            "baseTileDefName":"Grass",        // 房间必须建在草地上
            "autoExpand":false,               // 不自动扩展搜索区域,严格按坐标放置
            "positionX":50,                   // 放置在地图的X坐标50
            "positionY":50                    // 放置在地图的Y坐标50
        }
        </value>
    </MapGeneratorDef>
</Define>

复杂参数说明

value 字段 (JSON配置)
  • 说明MapGeneratorDef 中的 value 字段是一个特别说明,它不使用标准的XML元素赋值方式,而是直接作为文本内容包含一个JSON格式的字符串。这个JSON字符串容纳了 BuildingGeneratorConfig 的所有配置参数,用于指导 BuildingMapGenerator 的具体生成行为。您需要确保提供的JSON字符串是语法正确的。
  • JSON属性与C#映射关系
    • 所有JSON属性名(如 defName, mapping, pattern 等)与C#类中的对应属性名一致(JSON通常使用驼峰式命名)。
  • 示例:请参考上方的 MapGeneratorDef 示例中 value 标签内的内容。
mapping 字段 (图案值到定义名称的映射)
  • 说明:这是一个JSON对象,用于将 pattern 数组中的整数编码映射到具体的瓦片或建筑定义的 defName。在JSON中,字典的键必须是字符串,但 BuildingGeneratorConfig 在内部会将其解析为整数键。
    • 例如,"1":"WoodWall" 表示在 pattern 中值为1的单元格将被替换为 WoodWall 建筑。
    • 您可以根据需要定义 0 对应一个空地瓦片或特殊的Empty建筑定义。
  • JSON定义方式
    "mapping":{
        "0":"FloorTile",
        "1":"Wall",
        "2":"Door"
    }
    
pattern 字段 (建筑图案)
  • 说明:这是一个JSON格式的二维数组,由多个整数数组组成,代表了建筑的行和列。每个整数值都必须在 mapping 字典中找到对应的 defName
    • 数组的第一个维度代表行,第二个维度代表列。
    • 图案的左上角(pattern[0][0])将放置在 positionXpositionY 指定的地图坐标处。
  • JSON定义方式
    "pattern":[
        [1,1,1],
        [1,0,1],
        [1,1,1]
    ]