建筑地图生成器工作类 (BuildingMapGenerator)
功能说明
BuildingMapGenerator 是一个专门用于在地图上生成预定义建筑图案的工作类。它通过解析一个JSON格式的配置,将一个二维整数数组表示的图案(pattern)映射到具体的瓦片或建筑定义(mapping),然后将这些瓦片放置在地图的指定位置。这使得您可以轻松地在地图上放置复杂的预设结构,如房间、堡垒或其他定型建筑。
该生成器通过 MapGeneratorDef 中的 workClass 字段引用,其具体的行为由 value 字段中提供的 JSON 配置来控制。
可用参数
BuildingMapGenerator 通过解析 MapGeneratorDef 中 value 字段里的 JSON 配置来工作。此 JSON 配置对应 BuildingGeneratorConfig。
| JSON参数名 | XML参数名 (N/A) | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
defName | N/A | 字符串 | 无 | 可选。此建筑图案配置的内部名称。 |
mapping | N/A | 字典 (int -> string) | 无 | 必需。将 pattern 数组中的整数值映射到 瓦片定义 (TileDef) 或 建筑定义 (BuildingDef) 的 defName 的字典。详见下文**mapping 字段**。 |
pattern | N/A | 二维整数数组 | 无 | 必需。一个二维整数数组,表示建筑的布局图案。数组中的每个整数值都应在 mapping 字典中找到对应的定义。详见下文**pattern 字段**。 |
baseTileDefName | N/A | 字符串 | 无 | 可选。生成建筑图案所需的基底瓦片类型(例如,必须在"Grass"瓦片上建造)。如果指定,生成器会在放置建筑前检查下方瓦片是否匹配。 |
autoExpand | N/A | 布尔值 | false | 可选。如果为 true,生成器会在指定 positionX/positionY 附近寻找一个合适的空闲区域来放置建筑。如果为 false,则严格按照 positionX/positionY 放置。 |
positionX | N/A | 整数 | 无 | 必需。建筑图案放置起始位置的X坐标(左上角)。 |
positionY | N/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通常使用驼峰式命名)。
- 所有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])将放置在positionX和positionY指定的地图坐标处。
- JSON定义方式:
"pattern":[ [1,1,1], [1,0,1], [1,1,1] ]