角色、玩家与群体
范围:Peds/、PedGroup/。行为任务和事件详见 AI,移动求路详见 Navigation。总入口:Summary。
1. 角色是多个系统的汇合点#
CPed : CPhysical 将角色接入场景和物理体系,但角色能力并不集中在一个更新函数内:intelligence 管理感知、决策、任务和目标,motion data 管理移动状态,weapon manager 管理武器,rendering 目录管理外观与变体,player 类增加玩家特有状态。
这种结构保留了传统对象继承,同时通过管理器、扩展和数据对象组合复杂功能。它不是纯 ECS:CPed 本身仍有大量直接访问接口、标志和跨系统责任。阅读时应从一个行为纵向追踪相关对象,不能仅用类大小评价其设计。
2. 数据归属#
| 层次 | 代表入口 | 核心作用 |
|---|---|---|
| 世界中的身体 | CPed、PedCapsule | 位置、碰撞表示、生命状态、物理与骨骼关联 |
| 行为控制 | CPedIntelligence | 事件组、任务管理、感知、目标、掩体、防御区域 |
| 移动状态 | PedMotionData、MovingGround | 当前/期望朝向、移动基底等连续状态 |
| 战斗与关系 | CombatBehaviour、Relationships、PedWeapons | 威胁、武器、关系组与战斗策略 |
| 玩家语义 | PlayerPed、PlayerInfo | 玩家实体与玩家长期/控制状态 |
| 外观内容 | rendering/PedVariation*、props | 组件变体、资源包、装载请求 |
| 环境生成 | pedpopulation、pedplacement、WildlifeManager | 世界人口与适合生成的位置 |
| 群体 | CPedGroup、formation | 成员、领导者、队形与群体协作 |
CPed 对当前与期望 heading、pitch、bound offset 分别提供访问接口。这说明“希望往哪里走”“角色当前朝向”“碰撞体姿态”是不同数据,动画、运动和物理之间需要协调,不宜用一次 SetPosition 替代完整角色移动。
3. Intelligence 的真实更新链#
CPedIntelligence::Process 1255 行附近提供了完整的局部证据:首先处理回放模式提前返回,再计算累计时间;维护附近实体列表,扫描事件,更新 decision maker、targeting、cover finder 和 enclosed regions;完整更新分支处理事件响应与防御区域;随后处理 firing pattern、任务及任务后的可查询状态。
这条链显示输入、决策和执行的顺序。射击模式在任务前准备,事件响应能够影响本次任务更新,而任务后的查询状态面向其他消费者。若脚本在错误阶段读取角色状态,可能看到的是上一轮结果;需要结合 CGame 的调用顺序解释。
ProcessPhysics 会按物理 timeslice 调用,ProcessPostMovement 在全部移动后运行,ProcessPostCamera 在相机更新后运行,ProcessPreRender2 注释指定在骨骼更新后、IK 前。角色不仅是“每帧 AI Update”,还跨多个有先后要求的阶段。
4. AI LOD 是多维降级#
CPedAILod 分别控制 event scanning、motion task、physics、navigation、entity scanning、车内 ragdoll、intelligence timeslicing、animation timeslicing。它们体现不同成本来源,不能用“远处 NPC 不更新”概括。
运动可以切换到简化 motion task;导航可以降低请求质量;某些物理降级路径可在 navmesh 表面移动;智能和动画可以分时。Process 使用 m_fTimeSinceLastAiUpdate + dt 积累逻辑时间,使间歇更新不直接丢失经过时间。累计时间能保持计时推进,却不意味着低频采样能完全复现逐帧交互。
任务角色和 active law 等有不同 blocked LOD flag 集合,说明重要性不只取决于距离。任务显式要求、可见性、对象数量和玩法身份共同影响降级。查看 bit 名称时还要检查具体测试语义,不能从 AL_LodPhysics 名字推断该位为 1 就一定启用完整物理。
5. 外观变体与生成#
角色外观具有独立的 PedVariationDS、Pack 和 Stream 层。CGame 在 streaming 之后注册 CPedVariationStream::ProcessStreamRequests,注释说明可能在此改变玩家模型。换装和换模型因此涉及资源就绪、组件组合和角色实例更新,并非仅替换一个纹理指针。
人口生成和 scenario 系统也相互依赖:随机行人、场景活动角色和任务角色有不同来源、资源需求与清理规则。生成点需要导航可达性和区域条件,角色的具体行为由任务与 scenario 继续接管。密度调高既增加模型内存,也增加感知、任务、动画与物理成本。
目录里存在 Horse/ 等跨项目/历史内容痕迹。仅有目录或类型不能证明它是 GTA V 当前配置的可用玩法;应核查编译宏、工程引用和创建入口。本报告不把此类残留扩展为已确认功能。
6. 群体身份与成员引用#
CPedGroupMembership::CPedGroupMember 同时保存 RegdPed 和 network ID,成员存在性判断可依据二者之一;领导者位置采用单独槽位约定,成员上限关联 formation。群体对象因此可以表达“身份已知但本地角色实例暂时不存在”的状态,适合流式世界和网络场景。
成员引用、网络身份、队形位置和个体任务必须保持一致。删除实体不等于成员身份自然消失,切换 leader 也不等于所有个体立即完成新路径。分析跟随异常时应分别核查 membership、formation 和个体任务/导航结果。
7. 性能与维护细节#
感知扫描、掩体查询、路径、任务、动画和物理都有独立调度/降级机制。角色总数只是粗粒度指标;相同数量的远景行人与近距离战斗角色成本不同。修改感知范围可能同时扩大候选实体、事件数和目标评分成本,不能只观察最终任务数量。
跨系统清理尤其重要:强制清任务接口有是否重启默认任务、是否中止 motion、ragdoll、task record 等参数,说明“清除 AI”并不是一个无条件删除指针的操作。后续验证应覆盖死亡、布娃娃、上下车、换模型、网络迁移和任务结束等交叉状态。
8. 源码依据#
| 源码 | 定位 |
|---|---|
| ped.h | CPed 继承、motion 和武器接口 |
| PedIntelligence.h | 事件、任务、多阶段 Process、Flush 参数 |
| PedIntelligence.cpp | Process、累计 timestep 与更新顺序 |
| PedAILod.h | 28 行附近多维 LOD flags |
| PedGroup.h | membership、注册引用、网络 ID、leader |
| PedVariationStream.h | 外观资源请求接口 |