XML 使用说明 - 定义实体事件处理

在游戏配置文件中,您可以使用 <EntityEventDef> 元素来定义与游戏实体生命周期和行为相关的各种事件触发器。每个 <EntityEventDef> 元素都必须包含在顶层的 <Define> 元素之内,并遵循其通用的属性定义规则。

功能介绍

<EntityEventDef> 提供了一种强大的机制,用于在实体执行特定动作(如移动、攻击)、经历生命周期事件(如生成、死亡)或满足特定条件时,自动触发预设的游戏事件。这使得游戏的动态性和交互性大大增强,无需硬编码即可实现复杂的事件联动。

参数说明

所有参数都必须通过嵌套元素的方式进行赋值。

  • <defName> (必需,字符串)

    • 该实体事件定义的唯一标识符。在整个游戏配置中,此名称必须是全局唯一的,除非您有意覆盖现有定义。
    • 作为匿名定义时,此字段可以省略。
  • <label> (可选,字符串)

    • 提供一个人类可读的标签,用于更好地理解该实体事件定义的用途。
  • <description> (可选,字符串)

    • 提供更详细的文本描述,解释该实体事件定义的具体内容或特殊用途。

特定行为触发事件数组

以下字段都是可选的,每个字段都是一个事件数组,当实体发生对应行为时,数组中的所有事件都会被顺序触发。数组的定义方式为:<数组名><li>事件引用/匿名定义</li><li>事件引用/匿名定义</li></数组名>。数组元素可以是已定义的 EventDefdefName 字符串,也可以是直接在这里定义的匿名 EventDef

  • <onSpawnEvents> (可选,EventDef 数组)
    • 当实体首次生成时触发的一系列事件。
  • <onMoveForwardEvents> (可选,EventDef 数组)
    • 当实体向前移动时触发的一系列事件。
  • <onMoveBackwardEvents> (可选,EventDef 数组)
    • 当实体向后移动时触发的一系列事件。
  • <onMoveLeftEvents> (可选,EventDef 数组)
    • 当实体向左移动时触发的一系列事件。
  • <onMoveRightEvents> (可选,EventDef 数组)
    • 当实体向右移动时触发的一系列事件。
  • <onMeleeAttackEvents> (可选,EventDef 数组)
    • 当实体执行近战攻击时触发的一系列事件。
  • <onRangedAttackEvents> (可选,EventDef 数组)
    • 当实体执行远程攻击时触发的一系列事件。
  • <onHitEvents> (可选,EventDef 数组)
    • 当实体受到攻击或伤害时触发的一系列事件。
  • <onDeathEvents> (可选,EventDef 数组)
    • 当实体生命值归零并死亡时触发的一系列事件。

条件触发事件

  • <conditionalEvents> (可选,ConditionalEvent 数组)
    • 这是一个特殊的事件数组,其中的每个元素都是一个 <ConditionalEvent>。这些事件会在满足特定条件时才被触发。数组的定义方式与普通事件数组相同。
    • 关于 <conditionalEvents> 的详细讲解,请参阅条件事件详解

引用方式和匿名定义

  • EventDef 引用/匿名定义: 在所有事件数组字段中,数组的每个 <li> 元素都可以是以下两种形式之一:
    1. 字符串引用: 一个已定义的 EventDefdefName。例如:<li>Event_SpawnMonsterA1_3</li>
    2. 匿名定义: 直接在 <li> 内部定义一个 EventDef 的完整结构,此时该 EventDef 不需要 defName 字段。例如:
      <li>
          <workClass>Event_PlaySound</workClass>
          <parameter>{"SoundID":"HitSound"}</parameter>
      </li>
      
  • ConditionalEvent 匿名定义:<conditionalEvents> 数组中,每个 <li> 元素必须是一个匿名的 <ConditionalEvent> 定义。

示例

带有多种实体事件的定义

<Define>
    <!-- 预定义的事件,可被引用 -->
    <EventDef>
        <defName>Event_PlayDeathSound</defName>
        <workClass>Event_PlaySound</workClass>
        <parameter>{"SoundID":"DeathCry"}</parameter>
    </EventDef>

    <EventDef>
        <defName>Event_DropLoot</defName>
        <workClass>Event_ItemDrop</workClass>
        <parameter>{"LootTable":"MonsterLootTable_Basic"}</parameter>
    </EventDef>

    <!-- 实体事件定义示例 -->
    <EntityEventDef>
        <defName>MonsterA_Events</defName>
        <label>A型怪物事件集</label>
        <description>定义A型怪物在不同行为下的事件触发。</description>

        <!-- 实体生成时触发事件 -->
        <onSpawnEvents>
            <li>
                <workClass>Event_EntityGenerater</workClass>
                <parameter>
                {
                    "DefinitionsToChooseFrom":[ { "DefName":"Effect_SpawnSmoke", "DefTypeName":"EffectDef" } ],
                    "LocationType":"AtEntity",
                    "Count":1
                }
                </parameter>
            </li>
            <li>Event_MonsterSpawnAnnounce</li> <!-- 引用另一个 EventDef -->
        </onSpawnEvents>

        <!-- 实体死亡时触发事件 -->
        <onDeathEvents>
            <li>Event_PlayDeathSound</li>    <!-- 引用已定义的事件 -->
            <li>Event_DropLoot</li>          <!-- 引用已定义的事件 -->
            <li>
                <workClass>Event_CustomAnimation</workClass>
                <parameter>{"AnimationStyle":"DeathExplosion"}</parameter>
            </li>
        </onDeathEvents>

        <!-- 实体受击时触发一个匿名事件 -->
        <onHitEvents>
            <li>
                <workClass>Event_ScreenShake</workClass>
                <parameter>{"Intensity":0.5, "Duration":0.1}</parameter>
            </li>
        </onHitEvents>
      
        <!-- 条件事件示例 -->
        <conditionalEvents>
            <li>
                <parameter>HasLowHealth()</parameter>
                <eventDefs>
                    <li>Event_MonsterFlee</li>
                    <li>
                        <workClass>Event_ApplyBuff</workClass>
                        <parameter>{"BuffDefName":"FearBuff"}</parameter>
                    </li>
                </eventDefs>
            </li>
            <li>
                <parameter>IsNightTime()</parameter>
                <eventDefs>
                    <li>Event_EnhanceMonsterStrength</li>
                </eventDefs>
            </li>
        </conditionalEvents>

    </EntityEventDef>
</Define>

条件事件详解

<conditionalEvents> 字段是一个特殊的数组,它包含零个或多个 <ConditionalEvent> 定义。每个 <ConditionalEvent> 允许您定义一个条件,当该条件为真时,就会触发一系列与之关联的事件。

参数说明(ConditionalEvent)

每个 <ConditionalEvent> 都必须是一个匿名定义,包含以下参数:

  • <parameter> (必需,字符串)

    • 这是一个字符串,其内容是一个条件表达式。这个表达式的语法和可用的函数与行为树中的条件判断非常相似。它将由游戏引擎进行求值,如果结果为真,则触发 eventDefs 中的事件。
    • 关于可用的条件表达式和语法,请参阅行为树章节
  • <eventDefs> (必需,EventDef 数组)

    • 这是一个事件数组,其中包含当 <parameter> 中定义的条件为真时需要触发的所有事件。其定义方式与上面描述的事件数组完全相同,可以引用已定义的 EventDef,也可以直接匿名定义。

示例 (conditionalEvents)

<conditionalEvents>
    <li>
        <!-- 条件:拥有低生命值 -->
        <parameter>HasLowHealth()</parameter>
        <eventDefs>
            <li>Event_MonsterFlee</li> <!-- 引用一个逃跑事件 -->
            <li>
                <workClass>Event_ApplyBuff</workClass>
                <parameter>{"BuffDefName":"FearBuff"}</parameter>
            </li>
        </eventDefs>
    </li>
    <li>
        <!-- 条件:是夜晚 -->
        <parameter>IsNightTime()</parameter>
        <eventDefs>
            <li>Event_EnhanceMonsterStrength</li> <!-- 引用一个增强力量的事件 -->
        </eventDefs>
    </li>
</conditionalEvents>