XML 使用说明 - 定义实体事件处理
在游戏配置文件中,您可以使用 <EntityEventDef> 元素来定义与游戏实体生命周期和行为相关的各种事件触发器。每个 <EntityEventDef> 元素都必须包含在顶层的 <Define> 元素之内,并遵循其通用的属性定义规则。
功能介绍
<EntityEventDef> 提供了一种强大的机制,用于在实体执行特定动作(如移动、攻击)、经历生命周期事件(如生成、死亡)或满足特定条件时,自动触发预设的游戏事件。这使得游戏的动态性和交互性大大增强,无需硬编码即可实现复杂的事件联动。
参数说明
所有参数都必须通过嵌套元素的方式进行赋值。
-
<defName>(必需,字符串)- 该实体事件定义的唯一标识符。在整个游戏配置中,此名称必须是全局唯一的,除非您有意覆盖现有定义。
- 作为匿名定义时,此字段可以省略。
-
<label>(可选,字符串)- 提供一个人类可读的标签,用于更好地理解该实体事件定义的用途。
-
<description>(可选,字符串)- 提供更详细的文本描述,解释该实体事件定义的具体内容或特殊用途。
特定行为触发事件数组
以下字段都是可选的,每个字段都是一个事件数组,当实体发生对应行为时,数组中的所有事件都会被顺序触发。数组的定义方式为:<数组名><li>事件引用/匿名定义</li><li>事件引用/匿名定义</li></数组名>。数组元素可以是已定义的 EventDef 的 defName 字符串,也可以是直接在这里定义的匿名 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>元素都可以是以下两种形式之一: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>