CD Code Digest Hub /GTA V

载具交通与持有资产

7 分钟阅读 7 个章节 1 张图

返回总览。载具脚本侧的核心问题是“哪辆车应在何处,以什么状态存在”,而不是实现轮胎物理、全部交通 AI 或渲染。

1. 三类车辆需要不同的生命周期#

类别内容层关注点主要关联
环境交通模型/密度/道路条件与局部干预原生车辆人口、交通 AI
任务载具创建位置、乘员、路线、损坏/失败、清理剧情脚本、TASK、录制路径
玩家/资产载具持有关系、改装、存放、取回、扣押vehicle_gen、商店、保存、在线资产

它们可以转换角色,例如任务结束把车辆交回世界,但不能只凭模型相同就认为是同一持有资产。

2. 单机 vehicle_gen 是资产实例化控制器#

vehicle_gen_controller.sc 有车库/机库模型适用性检查、一次性生成清理、自定义损坏应用、附近相同模型检查、具体生成点处理、blip、属性、阻挡区域、出售标志及处理列表。[S1]

它还处理购买车库、选车、放车、提前请求车库车辆、车辆传送与扣押场取回。保存中的车辆描述和当前世界里的车辆句柄因此是两层数据:需要时从资产状态恢复实体,离开或存入时再更新长期状态。

车辆“正在世界存在”和“仍属于玩家”不等价。跨场景、角色切换和任务接管都需要处理这种差别;player_controller 还会监控保存主角车辆,与 vehicle_gen 协作。[S2]

3. 创建链路中的资源和权限#

CommandCreateVehicle 检查模型加载、模型类型、世界坐标、任务车辆容量和网络脚本身份。bRegisterAsNetworkObject 与 bScriptHostObject 分别影响是否注册网络对象和 host object 规则。[S3]

因此“已经知道模型 hash”不足以创建;模型必须就绪,当前脚本必须符合权限和生命周期要求。在线跨机器传递网络 ID,本地实体句柄只用于本机操作。删除、修复、改装和任务下达还要按接口验证控制权。

4. 驾驶 AI 与录制路径各有用途#

任务脚本可调用车辆驾驶/追逐/逃离任务,也可使用车辆录制保证关键镜头、路线和时间点。re_bikethief 在必要时停止录制并转为 TASK_VEHICLE_MISSION_PED_TARGET 逃离玩家;大型剧情任务还组织预设警车、直升机、船和列车事件。[S4][S5]

可借鉴的策略是:戏剧节点用可控路线,开放追逐交给原生 AI,失去车辆或玩家偏离路线时用明确的恢复/失败状态处理。不要每帧重置驾驶任务,否则可能不断破坏车辆的路径和行动进度。

5. 改装是一段带回滚的交互#

carmod_shop_core.sch 承载多种场所的共享改装流程;各 *_carmod.sc 入口使它适配车会、地堡、机库、移动设施等环境。[S6] 展示中的预览改装、确认购买后的持久状态、在线交易结果应分别处理。付款完成前预览模型发生变化,不应被误认为已经永久拥有该配置。

在线车辆的存放与房产实例、所有者、其他乘客、场所进入/退出都有关。房产脚本中甚至单独判断非房主能否驾驶当前私人车辆离开,说明权限不是“车在眼前就能带走”。[S7]

6. 扩展与排查方法#

先判断问题属于资产记录、实体创建、模型资源、控制权、驾驶任务还是场所流程,再追对应脚本。新增车辆服务应明确唯一资产身份、重复生成防护、所有权转移和结束后的去向;追加路线任务应补足上车失败、车辆损坏、玩家离开和任务取消。

本篇没有测量道路 AI 或车辆同步性能;车辆生成脚本中的检查和处理列表也不能替代原生交通人口系统的完整分析。

源码证据#

[S1] vehicle_gen_controller.sc L191/208 适用性;L1983 生成;L3355 处理列表;L3699/4585 车库;L7986 扣押。 [S2] player_controller.sc L2275。 [S3] commands_vehicle.cpp L104。 [S4] re_bikethief.sc L653、L825。 [S5] Franklin1.sc L23258、L24103。 [S6] carmod_shop_core.sch,L88122 CARMOD_SCRIPT_MAIN_UPDATE。 [S7] AM_MP_PROPERTY_INT.sc L18651。

[S1]: <../../../GTAV Source/script/dev_ng/singleplayer/scripts/vehiclecontrol/vehicle_gen_controller.sc> [S2]: <../../../GTAV Source/script/dev_ng/singleplayer/scripts/playercontrol/player_controller.sc> [S3]: <../../../GTAV Source/src/dev_ng/game/script/commands_vehicle.cpp> [S4]: <../../../GTAV Source/script/dev_ng/singleplayer/scripts/Ambient/WorldPoint/re_bikethief.sc> [S5]: <../../../GTAV Source/script/dev_ng/singleplayer/scripts/missions/Franklin/Franklin1.sc> [S6]: <../../../GTAV Source/script/dev_ng/singleplayer/scripts/shops/carmod_shop_core.sch> [S7]: <../../../GTAV Source/script/dev_ng/multiplayer/scripts/modes/freemode/Ambient/AM_MP_PROPERTY_INT.sc>