XML 使用说明 - 定义阵营关系

在游戏配置文件中,您可以使用 <AffiliationDef> 元素来定义不同阵营(Affiliation)之间的关系。每个 <AffiliationDef> 元素都必须包含在顶层的 <Define> 元素之内,并遵循其通用的属性定义规则。

功能介绍

<AffiliationDef> 用于配置游戏中各个阵营(或势力)对于其他阵营的默认态度。通过定义友好、敌对和中立列表,可以构建复杂的势力关系网,影响实体之间的行为逻辑,例如攻击目标选择、协作或互动方式。

参数说明

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

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

    • 该阵营关系定义的唯一标识符。通常,这会是某个特定阵营的名称。在整个游戏配置中,此名称必须是全局唯一的,除非您有意覆盖现有定义。
    • 作为匿名定义时,此字段可以省略。
  • <label> (可选,字符串)

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

    • 提供更详细的文本描述,解释该阵营关系定义的具体内容或特殊用途。
  • <defaultRelation> (可选,枚举类型,默认为 Neutral)

    • 定义本阵营对未在其他列表中明确指定的任何其他阵营的默认关系。
    • 可选值包括:
      • Neutral (中立)
      • Hostile (敌对)
      • Friendly (友好)
  • <hostileFactions> (可选,字符串数组)

    • 一个字符串数组,列出本阵营视为敌对的其他阵营的 defName
    • 数组的定义方式为 <hostileFactions><li>阵营1defName</li><li>阵营2defName</li></hostileFactions><li> 元素本身会被忽略。
  • <neutralFactions> (可选,字符串数组)

    • 一个字符串数组,列出本阵营视为中立的其他阵营的 defName
    • 数组的定义方式为 <neutralFactions><li>阵营1defName</li><li>阵营2defName</li></neutralFactions><li> 元素本身会被忽略。
  • <friendlyFactions> (可选,字符串数组)

    • 一个字符串数组,列出本阵营视为友好的其他阵营的 defName
    • 数组的定义方式为 <friendlyFactions><li>阵营1defName</li><li>阵营2defName</li></friendlyFactions><li> 元素本身会被忽略。

关系冲突与优先级

当一个目标阵营同时出现在多个关系列表中时(例如,既在 hostileFactions 又在 friendlyFactions 中),系统会根据预设的优先级规则来解决冲突,以确定最终的关系。

优先级顺序(从高到低):

  1. Friendly (友好)
  2. Hostile (敌对)
  3. Neutral (中立)

这意味着,如果一个阵营在 friendlyFactionshostileFactions 都被列出,它最终会被判定为 Friendly。只有当一个阵营未在任何特定列表中被提及,才会回落到 defaultRelation 定义的关系。

示例

示例 1:定义“Player”阵营的关系

<Define>
    <AffiliationDef defName="PlayerAffiliation">
        <label>玩家阵营</label>
        <description>玩家及其盟友的阵营。</description>
        <defaultRelation>Neutral</defaultRelation> <!-- 默认对所有未指定者中立 -->
        <hostileFactions>
            <li>MonsterAffiliation</li> <!-- 对 MonsterAffiliation 敌对 -->
            <li>BanditAffiliation</li> <!-- 对 BanditAffiliation 敌对 -->
        </hostileFactions>
        <friendlyFactions>
            <li>AllyAffiliation</li> <!-- 对 AllyAffiliation 友好 -->
        </friendlyFactions>
        <neutralFactions>
            <!-- 没有特别指定的,因为 defaultRelation 已经是 Neutral -->
            <!-- 假设将来可能某个阵营默认是Friendly,但这里想设置为Neutral,就可以在这里列出 -->
            <li>WildLifeAffiliation</li>
        </neutralFactions>
    </AffiliationDef>
</Define>

示例 2:利用优先级规则的定义

假设我们希望 SomeTroubledFactionPlayerAffiliation 友好,但由于配置失误,它也被列入了 hostileFactions

<Define>
    <AffiliationDef defName="SomeTroubledFaction">
        <label>麻烦的阵营</label>
        <description>一个关系复杂的阵营。</description>
        <defaultRelation>Neutral</defaultRelation>
        <friendlyFactions>
            <li>PlayerAffiliation</li> <!-- 明确对玩家友好 -->
        </friendlyFactions>
        <hostileFactions>
            <li>PlayerAffiliation</li> <!-- 错误地将玩家也列为敌对 -->
        </hostileFactions>
    </AffiliationDef>
</Define>

在此示例中,尽管 PlayerAffiliation 同时出现在 friendlyFactionshostileFactions 中,但由于 友好(Friendly)关系优先级高于敌对(Hostile)SomeTroubledFaction 最终会视为 PlayerAffiliation友好 阵营。

示例 3:仅定义敌对关系,其他默认为中立

<Define>
    <AffiliationDef defName="MonsterAffiliation">
        <label>怪物阵营</label>
        <description>对所有非同类阵营都敌对。</description>
        <defaultRelation>Hostile</defaultRelation> <!-- 假设怪物对所有未明确的都敌对 -->
        <friendlyFactions>
            <li>MonsterAffiliation</li> <!-- 对自己(同类)友好 -->
        </friendlyFactions>
        <!-- 不需要定义 hostileFactions,因为 defaultRelation 已经是 Hostile -->
    </AffiliationDef>
</Define>

注意事项

  • defName 唯一性: AffiliationDefdefName 通常应与游戏中实际存在的阵营ID或名称保持一致,并确保其全局唯一性。
  • 双向关系: 阵营关系默认是单向的。如果 A 阵营将 B 视为 Friendly,不代表 B 阵营也自动将 A 视为 Friendly。您需要在 B 阵营的 AffiliationDef 中单独配置其对 A 的关系。
  • 列表内容: hostileFactionsneutralFactionsfriendlyFactions 列表中应填入其他 AffiliationDefdefName
  • 优先级: 务必牢记友好的最高优先级,这在设计关系网时尤为关键,可以避免意外的冲突导致错误的阵营行为。