实体生成器事件工作类 (Event_EntityGenerater)
功能说明
Event_EntityGenerater 是一个功能强大的事件工作类,它用于在游戏世界中生成各种类型的实体(如角色、怪物、建筑、物品等)。此事件配置高度灵活,允许您指定要生成的实体数量、哪些实体定义可供选择(将从中随机选取),以及实体生成的具体位置类型和相关参数。它支持在地图内外、特定坐标周围、目标实体周围或随机位置生成实体,为游戏事件、环境填充和动态内容生成提供了核心支持。
该事件工作类通过 EventDef 中的 workClass 字段引用,其具体的行为由 parameter 字段中提供的 JSON 配置来控制。
可用参数
Event_EntityGenerater 通过解析 EventDef 中 parameter 字段里的 JSON 配置来工作。此 JSON 配置对应 EntityGenerateConfig 数据结构。
EntityGenerateConfig 字段列表
| JSON参数名 | XML参数名 (N/A) | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
DefinitionsToChooseFrom | N/A | List<EntityDefinitionEntry> | 无 | 必需。一个列表,包含可供随机选择生成的实体定义条目。每个条目都指定一个实体 defName 和其 DefType。 |
Count | N/A | 整数 | 1 | 可选。要生成的实体总数。每次调用 Run 时,系统将尝试生成该数量的实体。 |
LocationType | N/A | EntitySpawnLocationType | None | 可选。指定实体生成的位置类型。请参见下方的 EntitySpawnLocationType 枚举说明。 |
CenterCoordinates | N/A | Vector3 | (0,0,0) | 可选。仅当 LocationType 为 AroundSpecificCoordinates 时生效。指定生成区域的中心坐标。 |
Radius | N/A | 浮点数 | 10.0f | 可选。仅当 LocationType 为 AroundSpecificCoordinates 或 AroundTargetEntity 时生效。指定以中心点或目标实体为圆心的生成半径。 |
BuildingTypeDefName | N/A | 字符串 | null | 可选。仅当 LocationType 为 InsideSpecificBuildingType 时生效。指定目标建筑的建筑定义 (BuildingDef) defName。当前未实现。 |
TargetFactionDefName | N/A | 字符串 | null | 可选。仅当 LocationType 为 AroundTargetEntity 时生效。指定目标派系的派系定义 (FactionDef) defName。系统将会在该派系的随机一个实体周围生成。 |
SpawnPointTileMapDefName | N/A | 字符串 | null | 可选。仅当 LocationType 为 AtPredefinedSpawnPoint 时生效。指定预定义生成点的 defName。当前未实现。 |
OffMapOffset | N/A | 浮点数 | 5.0f | 可选。仅当 LocationType 为 OffMap 时生效。指定实体应在地图边界之外的额外偏移量。 |
EntityDefinitionEntry 内部字段列表 (在 DefinitionsToChooseFrom 列表中使用)
| JSON参数名 | XML参数名 (N/A) | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
DefName | N/A | 字符串 | 无 | 必需。要生成的具体实体定义的 defName。 |
DefType | N/A | EntityDefTypeIdentifier | None | 必需。此 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通常使用驼峰式命名)。
- 所有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枚举的说明,并根据您的需求选择合适的位置类型。 - 当前未实现的类型:请注意
InsideSpecificBuildingType和AtPredefinedSpawnPoint当前未实现,如果使用这些类型,事件将无法正常生成实体并返回错误。