实体生成器事件工作类 (Event_EntityGenerater)

功能说明

Event_EntityGenerater 是一个功能强大的事件工作类,它用于在游戏世界中生成各种类型的实体(如角色、怪物、建筑、物品等)。此事件配置高度灵活,允许您指定要生成的实体数量、哪些实体定义可供选择(将从中随机选取),以及实体生成的具体位置类型和相关参数。它支持在地图内外、特定坐标周围、目标实体周围或随机位置生成实体,为游戏事件、环境填充和动态内容生成提供了核心支持。

该事件工作类通过 EventDef 中的 workClass 字段引用,其具体的行为由 parameter 字段中提供的 JSON 配置来控制。

可用参数

Event_EntityGenerater 通过解析 EventDefparameter 字段里的 JSON 配置来工作。此 JSON 配置对应 EntityGenerateConfig 数据结构。

EntityGenerateConfig 字段列表
JSON参数名XML参数名 (N/A)类型默认值说明
DefinitionsToChooseFromN/AList<EntityDefinitionEntry>必需。一个列表,包含可供随机选择生成的实体定义条目。每个条目都指定一个实体 defName 和其 DefType
CountN/A整数1可选。要生成的实体总数。每次调用 Run 时,系统将尝试生成该数量的实体。
LocationTypeN/AEntitySpawnLocationTypeNone可选。指定实体生成的位置类型。请参见下方的 EntitySpawnLocationType 枚举说明。
CenterCoordinatesN/AVector3(0,0,0)可选。仅当 LocationTypeAroundSpecificCoordinates 时生效。指定生成区域的中心坐标。
RadiusN/A浮点数10.0f可选。仅当 LocationTypeAroundSpecificCoordinatesAroundTargetEntity 时生效。指定以中心点或目标实体为圆心的生成半径。
BuildingTypeDefNameN/A字符串null可选。仅当 LocationTypeInsideSpecificBuildingType 时生效。指定目标建筑的建筑定义 (BuildingDef) defName。当前未实现。
TargetFactionDefNameN/A字符串null可选。仅当 LocationTypeAroundTargetEntity 时生效。指定目标派系的派系定义 (FactionDef) defName。系统将会在该派系的随机一个实体周围生成。
SpawnPointTileMapDefNameN/A字符串null可选。仅当 LocationTypeAtPredefinedSpawnPoint 时生效。指定预定义生成点的 defName。当前未实现。
OffMapOffsetN/A浮点数5.0f可选。仅当 LocationTypeOffMap 时生效。指定实体应在地图边界之外的额外偏移量。
EntityDefinitionEntry 内部字段列表 (在 DefinitionsToChooseFrom 列表中使用)
JSON参数名XML参数名 (N/A)类型默认值说明
DefNameN/A字符串必需。要生成的具体实体定义的 defName
DefTypeN/AEntityDefTypeIdentifierNone必需。此 DefName 对应的实体定义类型。请参见下方的 EntityDefTypeIdentifier 枚举说明。

EntitySpawnLocationType (枚举)

指定实体生成的可能位置类型。

  • None (0): 未指定或无效的生成位置类型。
  • OffMap: 在地图的可玩区域边界之外按随机方向生成实体。
  • InsideSpecificBuildingType: 在指定类型建筑的内部或附近生成实体。当前未实现。
  • AroundSpecificCoordinates: 在指定 CenterCoordinates 周围 Radius 范围内生成实体。
  • AroundTargetEntity: 在指定 TargetFactionDefName 派系中的一个随机实体周围 Radius 范围内生成实体。
  • RandomlyOnMap: 在地图上的随机可生成点生成实体。
  • AtPredefinedSpawnPoint: 在预定义的生成点(通过 SpawnPointTileMapDefName 指定)生成实体。当前未实现。

EntityDefTypeIdentifier (枚举)

指定支持的实体定义类型标识符,用于 EntityDefinitionEntry 中。

  • None (0): 未指定或无效的实体定义类型。
  • CharacterDef: 角色定义类型 (例如:NPC、玩家)。
  • MonsterDef: 怪物定义类型 (例如:敌人、野兽)。
  • BuildingDef: 建筑定义类型 (例如:墙壁、工作台)。
  • BulletDef: 子弹定义类型 (例如:投射物)。
  • ItemDef: 物品定义类型 (用于可拾取物,例如:材料、普通工具)。
  • WeaponDef: 武器定义类型 (继承自 ItemDef 的特殊物品,例如:刀剑、弓箭)。

示例

以下是 EventDef 的示例,展示了 Event_EntityGenerater 的不同用法:

<Define>
    <!-- 假设已有 Character_Villager, Monster_Wolf, Item_GoldBar 等 [实体定义](DefineTypes.md) -->

    <!-- 示例1: 在地图外生成3只狼 -->
    <EventDef>
        <defName>SpawnWolvesOffMap</defName>
        <label>在地图外生成狼</label>
        <description>在地图边界外生成3只野狼。</description>
        <workClass>Event_EntityGenerater</workClass>
        <parameter>
        {
            "DefinitionsToChooseFrom": [
                {"DefName": "Monster_Wolf", "DefType": "MonsterDef"}
            ],
            "Count": 3,
            "LocationType": "OffMap",
            "OffMapOffset": 8.0
        }
        </parameter>
    </EventDef>

    <!-- 示例2: 在特定坐标附近生成单个村民 -->
    <EventDef>
        <defName>SpawnVillagerAtCamp</defName>
        <label>在营地生成村民</label>
        <description>在指定营地坐标附近生成一个村民。</description>
        <workClass>Event_EntityGenerater</workClass>
        <parameter>
        {
            "DefinitionsToChooseFrom": [
                {"DefName": "Character_Villager", "DefType": "CharacterDef"}
            ],
            "Count": 1,
            "LocationType": "AroundSpecificCoordinates",
            "CenterCoordinates": {"x": 50.0, "y": 30.0, "z": 0.0},
            "Radius": 5.0
        }
        </parameter>
    </EventDef>

    <!-- 示例3: 在玩家派系实体周围生成2个金条 (随机选择) -->
    <EventDef>
        <defName>PlayerFactionGoldDrop</defName>
        <label>玩家派系金条掉落</label>
        <description>在玩家派系中的一个随机实体周围生成2个金条。</description>
        <workClass>Event_EntityGenerater</workClass>
        <parameter>
        {
            "DefinitionsToChooseFrom": [
                {"DefName": "Item_GoldBar", "DefType": "ItemDef"}
            ],
            "Count": 2,
            "LocationType": "AroundTargetEntity",
            "TargetFactionDefName": "Faction_Player",
            "Radius": 3.0
        }
        </parameter>
    </EventDef>

    <!-- 示例4: 在地图上随机位置生成一棵树 (建筑) -->
    <EventDef>
        <defName>SpawnRandomTree</defName>
        <label>随机生成树</label>
        <description>在地图上的随机位置生成一棵树。</description>
        <workClass>Event_EntityGenerater</workClass>
        <parameter>
        {
            "DefinitionsToChooseFrom": [
                {"DefName": "Building_Tree", "DefType": "BuildingDef"}
            ],
            "Count": 1,
            "LocationType": "RandomlyOnMap"
        }
        </parameter>
    </EventDef>

    <!-- 示例5: 混合生成:3个敌人或2个宝箱,在地图任意位置随机生成 -->
    <EventDef>
        <defName>MixedRandomGeneration</defName>
        <label>混合随机生成</label>
        <description>在地图随机位置生成3个怪物(可能狼或熊)或2个宝箱。</description>
        <workClass>Event_EntityGenerater</workClass>
        <parameter>
        {
            "DefinitionsToChooseFrom": [
                {"DefName": "Monster_Wolf", "DefType": "MonsterDef"},
                {"DefName": "Monster_Bear", "DefType": "MonsterDef"},
                {"DefName": "Item_TreasureChest", "DefType": "ItemDef"}
            ],
            "Count": 3,
            "LocationType": "RandomlyOnMap"
        }
        </parameter>
    </EventDef>
</Define>

复杂参数说明

parameter 字段 (JSON配置)
  • 说明EventDef 中的 parameter 字段是一个特别说明,它不使用标准的XML元素赋值方式,而是直接作为文本内容包含一个JSON格式的字符串。这个JSON字符串包含了 EntityGenerateConfig 的所有配置参数,用于指导 Event_EntityGenerater 的具体行为。您需要确保提供的JSON字符串是语法正确的,并且其内容符合 EntityGenerateConfig 的结构。
  • JSON属性与C#映射关系
    • 所有JSON属性名(如 DefinitionsToChooseFrom, Count 等)与C#内部数据类 EntityGenerateConfig 中的对应属性名一致(JSON通常使用驼峰式命名)。
  • Vector3 的JSON表示: 在JSON中,Vector3 类型的字段需要以一个包含 x, y, z 三个浮点数字段的JSON对象形式表示。
    • 例如:"CenterCoordinates": { "x": 50.0, "y": 30.0, "z": 0.0 }
  • 枚举值的JSON表示: 在JSON中,所有枚举类型(如 LocationType, DefType)都应以其字符串名称来表示。
    • 例如:"LocationType": "OffMap"
    • 例如:"DefType": "MonsterDef"
DefinitionsToChooseFrom 字段 (实体定义列表 - 必填)
  • 说明:这是一个必需的列表,其中包含一个或多个 EntityDefinitionEntry 对象。每次生成实体时,Event_EntityGenerater 会从这个列表中随机选择一个实体定义来生成。
  • EntityDefinitionEntry 结构:每个对象都需要包含:
    • "DefName" (字符串):具体的实体定义名称(例如 "Monster_Wolf"),此名称必须在 实体定义 (Define) 中能够找到对应条目。
    • "DefType" (EntityDefTypeIdentifier 枚举):此 DefName 所属的实体定义类型(例如 "MonsterDef")。这是为了帮助系统正确查找并实例化对应的定义。
LocationType 字段 (生成位置类型 - 关键)
  • 说明:这个字段是实体生成位置逻辑的核心。根据您选择的 LocationType,其他相关的定位参数(如 CenterCoordinates, Radius, TargetFactionDefName 等)才会生效。请仔细查阅上述 EntitySpawnLocationType 枚举的说明,并根据您的需求选择合适的位置类型。
  • 当前未实现的类型:请注意 InsideSpecificBuildingTypeAtPredefinedSpawnPoint 当前未实现,如果使用这些类型,事件将无法正常生成实体并返回错误。