建筑定义 (<BuildingDef>)

功能说明

建筑定义用于在游戏中创建各种静态或动态的建筑对象。它继承自 实体定义 (<EntityDef>),这意味着建筑也具备通常实体的属性、行为和外观。 BuildingDef 特别之处在于其 buildingType 字段,它决定了建筑是作为背景瓦片存在(Static),还是作为一个可互动、有碰撞、可触发事件的实体(Dynamic)。当 buildingTypeDynamic 时,建筑可以拥有一个激活按键 (activateKey) 和检测范围 (detectionRadius),允许玩家在靠近时触发预定义的事件。

可用参数

由于 <BuildingDef> 继承自 <EntityDef>,它包含了所有 <EntityDef> 的参数,以及自身特有的参数。

BuildingDef 自身参数
参数名类型默认值说明
defName字符串必需。该建筑定义的唯一标识符。
label字符串(空)可选。该建筑在游戏中显示的名称。
description字符串(空)可选。该建筑的详细描述。
buildingType枚举 (字符串)Static必需。建筑类型,决定其作为瓦片还是实体。详见下文**buildingType 字段**。
slowDown浮点数0.0可选。当实体经过此建筑时,移动速度降低的百分比(0为不减速,1为完全停止)。
tile定义可选。当 buildingTypeStatic 时使用,定义建筑作为什么 瓦片定义。详见下文**tile 字段**。
activateKey字符串 (KeyCode)F可选。当 buildingTypeDynamic 时,玩家在触发器范围内用于激活事件的按键。
detectionRadius浮点数3.0可选。当 buildingTypeDynamic 时,玩家可激活此建筑的触发器范围。
triggerPosition字符串(空)可选。当 buildingTypeDynamic 时,触发器中心的相对坐标(例如:"0,0")。
triggerEvents事件定义数组可选。当 buildingTypeDynamic 且被 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: 静态建筑。这类建筑被视为地图的背景瓦片,不具备独立的实体属性(如生命值、碰撞体),不会移动,也不受伤害。它们主要用于填充地图,定义可通行区域或视觉效果。当 buildingTypeStatic 时,tile 字段是必需的,它定义了这个静态建筑所代表的实际 瓦片定义
    • Dynamic: 动态建筑。这类建筑被视为一个独立的游戏实体,拥有自己的属性 (attributes)、外观 (drawingOrder)、碰撞体 (colliderSize, colliderPosition),可以被破坏,也可以进行互动。当 buildingTypeDynamic 时,activateKeydetectionRadiustriggerPositiontriggerEvents 等字段可用于定义其互动逻辑。
  • 示例
    <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>