建筑定义 (<BuildingDef>)
功能说明
建筑定义用于在游戏中创建各种静态或动态的建筑对象。它继承自 实体定义 (<EntityDef>),这意味着建筑也具备通常实体的属性、行为和外观。
BuildingDef 特别之处在于其 buildingType 字段,它决定了建筑是作为背景瓦片存在(Static),还是作为一个可互动、有碰撞、可触发事件的实体(Dynamic)。当 buildingType 为 Dynamic 时,建筑可以拥有一个激活按键 (activateKey) 和检测范围 (detectionRadius),允许玩家在靠近时触发预定义的事件。
可用参数
由于 <BuildingDef> 继承自 <EntityDef>,它包含了所有 <EntityDef> 的参数,以及自身特有的参数。
BuildingDef 自身参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
defName | 字符串 | 无 | 必需。该建筑定义的唯一标识符。 |
label | 字符串 | (空) | 可选。该建筑在游戏中显示的名称。 |
description | 字符串 | (空) | 可选。该建筑的详细描述。 |
buildingType | 枚举 (字符串) | Static | 必需。建筑类型,决定其作为瓦片还是实体。详见下文**buildingType 字段**。 |
slowDown | 浮点数 | 0.0 | 可选。当实体经过此建筑时,移动速度降低的百分比(0为不减速,1为完全停止)。 |
tile | 定义 | 无 | 可选。当 buildingType 为 Static 时使用,定义建筑作为什么 瓦片定义。详见下文**tile 字段**。 |
activateKey | 字符串 (KeyCode) | F | 可选。当 buildingType 为 Dynamic 时,玩家在触发器范围内用于激活事件的按键。 |
detectionRadius | 浮点数 | 3.0 | 可选。当 buildingType 为 Dynamic 时,玩家可激活此建筑的触发器范围。 |
triggerPosition | 字符串 | (空) | 可选。当 buildingType 为 Dynamic 时,触发器中心的相对坐标(例如:"0,0")。 |
triggerEvents | 事件定义数组 | 无 | 可选。当 buildingType 为 Dynamic 且被 activateKey 触发时,将要执行的 事件定义 数组。详见下文**triggerEvents 字段**。 |
继承自 EntityDef 的参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
attributes | 定义 | (匿名定义默认值) | 定义实体的战斗属性(如生命值、移动速度等)。可以是引用或匿名定义。 |
drawingOrder | 定义 | (空) | 定义实体在不同状态和方向下的纹理绘制顺序。这是一个匿名嵌套定义。 |
behaviorTree | 定义 | (空) | 可选。定义实体的 行为树,控制其AI行为。可以是引用或匿名定义。 |
affiliation | 定义 | (空) | 可选。定义实体的 阵营,影响其与世界其他实体的交互。可以是引用或匿名定义。 |
eventDef | 定义 | (空) | 可选。定义实体特有的 事件。可以是引用或匿名定义。 |
colliderSize | 字符串 | (空) | 可选。定义实体的碰撞体大小(例如:"1,1"表示一个1x1的方形碰撞体)。 |
colliderPosition | 字符串 | (空) | 可选。定义实体的碰撞体相对于实体的中心偏移(例如:"0,0")。 |
示例
静态建筑示例 (装饰墙)
<Define>
<!-- 瓦片定义,用于静态建筑 -->
<TileDef>
<defName>DecorativeWallTile</defName>
<label>装饰墙</label>
<texture>Resources/Terrain/Wall_Decorative.png</texture>
<movementCost>1</movementCost>
</TileDef>
<!-- 静态建筑定义,直接作为瓦片存在 -->
<BuildingDef>
<defName>DecorativeWall</defName>
<label>装饰墙</label>
<description>一堵漂亮的装饰性墙壁,没有任何互动功能。</description>
<buildingType>Static</buildingType>
<tile>DecorativeWallTile</tile> <!-- 引用上面定义的瓦片 -->
<slowDown>0.5</slowDown> <!-- 经过时减速 -->
</BuildingDef>
</Define>
动态建筑示例 (可互动终端)
<Define>
<!-- 图像定义 -->
<ImageDef>
<defName>TerminalTexture</defName>
<path>Resources/Buildings/Terminal.png</path>
</ImageDef>
<!-- 事件定义 -->
<EventDef>
<defName>OpenShopEvent</defName>
<workClass>Event_OpenUI</workClass>
<parameter>{"UIName":"ShopPanel"}</parameter>
</EventDef>
<!-- 动态建筑定义,可互动 -->
<BuildingDef>
<defName>InteractiveTerminal</defName>
<label>数据终端</label>
<description>一个可以访问商店功能的数据终端。</description>
<buildingType>Dynamic</buildingType>
<!-- 继承自EntityDef的属性 -->
<attributes>
<health>100</health>
<defense>5</defense>
<!-- 动态建筑默认没有移动速度 -->
</attributes>
<drawingOrder>
<idle_down>
<textures>
<li>TerminalTexture</li>
</textures>
</idle_down>
</drawingOrder>
<!-- 碰撞体 -->
<colliderSize>1,1</colliderSize>
<colliderPosition>0.5,0.5</colliderPosition>
<!-- BuildingDef 自身的互动属性 -->
<activateKey>E</activateKey>
<detectionRadius>1.5</detectionRadius>
<triggerPosition>0,0</triggerPosition>
<triggerEvents>
<li>OpenShopEvent</li> <!-- 引用上方定义的事件 -->
</triggerEvents>
</BuildingDef>
</Define>
复杂参数说明
buildingType 字段 (建筑类型)
- 说明:这是一个枚举值,决定了建筑在游戏中的表现形式:
Static: 静态建筑。这类建筑被视为地图的背景瓦片,不具备独立的实体属性(如生命值、碰撞体),不会移动,也不受伤害。它们主要用于填充地图,定义可通行区域或视觉效果。当buildingType为Static时,tile字段是必需的,它定义了这个静态建筑所代表的实际 瓦片定义。Dynamic: 动态建筑。这类建筑被视为一个独立的游戏实体,拥有自己的属性 (attributes)、外观 (drawingOrder)、碰撞体 (colliderSize,colliderPosition),可以被破坏,也可以进行互动。当buildingType为Dynamic时,activateKey、detectionRadius、triggerPosition和triggerEvents等字段可用于定义其互动逻辑。
- 示例:
<buildingType>Static</buildingType> <buildingType>Dynamic</buildingType>
tile 字段 (瓦片定义)
- 说明:当
buildingType设置为Static时,此字段必需。它指定了该静态建筑所使用的底层 瓦片定义。可以是预定义瓦片的defName引用,也可以是当前位置的匿名定义。 - 引用方式:
<tile>TileDef的defName</tile> - 匿名定义方式:
<tile> <label>草地</label> <texture>Resources/Terrain/Grass.png</texture> <movementCost>1</movementCost> <isWalkable>true</isWalkable> </tile>
triggerEvents 字段 (触发事件数组)
- 说明:这是一个数组,当
buildingTypeg 为Dynamic且玩家在建筑的detectionRadius范围内按下activateKey时,数组中的所有 事件定义 将按顺序被触发。每个<li>元素可以引用一个已定义的事件defName或进行匿名定义。 - 数组定义方式:
<triggerEvents> <li>EventDef的defName1</li> <li>EventDef的defName2</li> <li> <!-- 匿名定义一个事件 --> <workClass>Event_PlaySound</workClass> <parameter>{"SoundId":"ActivateBuildingSound"}</parameter> </li> </triggerEvents>