界面交互与地图导航
返回总览。HUD、暂停菜单、交互菜单、地图图标和世界交互提示共用屏幕、输入和文字资源,因此需要统一仲裁与明确生命周期。
1. 规则与显示分层#
脚本确定当前显示内容、可选操作和反馈;Native 桥接将数据传给 GTA frontend/HUD、Scaleform 和文本系统。commands_graphics.cpp 中 CommandRequestScaleformMovieCommon 申请 UI 资源,CommandBeginScaleformMovieMethod 校验 movie ID 并进入方法调用路径。[S1]
因此 UI 脚本不是任意前端语言应用;它与专用 movie 方法和资源约定耦合。脚本与实际 UI 资源版本不匹配时,仅阅读 .sc 无法确认最终画面。
2. Context controller 仲裁同一个交互按钮#
多个活动都可能想显示“按键进入”。context_controller 的 intention list 保存是否使用/激活、注册线程、接受状态、优先级和待删除状态。GET_HIGHEST_USED_INDEX 比较优先级;CHECK_CONTEXT_ENTRIES_FOR_DEAD_SCRIPTS 撤销已经结束线程留下的意图。[S2]
这让商店、门口、活动、ATM 等不必同时争抢提示和按键。注册方线程 ID 是资源归属线索,死线程回收则防止长期残留交互。某些任务触发场景还会抑制帮助显示,说明 UI 优先级与任务入口距离/阶段有关。
新增世界交互时,应明确它什么时候可见、什么时候可接受、优先级如何、终止时谁注销。只画一个按键提示而不进入意图仲裁,不能获得与已有世界交互一致的行为。
3. 地图图标是状态的投影#
blip_controller 有小时变化、通缉变化、室内变化、任务状态变化、ambient 状态变化检测,再据此更新静态图标;安全屋图标还维护距离与可见性。[S3]
这比每帧重建全部地图图标更合适:大部分输入不变时不必重新配置。图标句柄、任务解锁和当前可触发状态则应分开;“有图标”不是任务一定能启动的充分条件。
单机 RC 控制器、在线 launcher 和活动脚本还会管理自己的动态目标图标。中央 blip controller 并不独占全部地图标记;需要按图标来源追踪所有者和清理。
4. 暂停菜单和交互菜单连接世界状态#
PauseMenu_Multiplayer.sc 涉及书签刷新、播放列表加载、job 列表、云错误、网络权限提示、保存相关退出警告等。[S4] 它不是静态导航页:某些选择会改变任务加入流程或要求等待保存、内容加载和会话条件。
SP 的 PauseMenu、PI_menu、shared 的菜单头、多人 HUD/观战/排行榜共同组成展示层。[S5] 在线暂停菜单通常只是改变本地交互,并不能据“PauseMenu”名称认为整个会话仿真停止。
5. 每帧覆盖与资源清理#
*_THIS_FRAME 提示隐藏、输入禁用、雷达/绘制覆盖需要在生效期持续调用;movie、纹理、blip、headshot 等则有明确的申请/释放生命周期。统一退出时要撤销持续状态、销毁所属对象并归还输入,而不是只把菜单阶段设置为 CLOSED。
显示层也不能直接决定在线收益和任务完成。它提交用户选择,等待业务模块确认,再更新成功/失败反馈。把回执尚未返回当成成功,会让 UI 与保存状态分离。
6. 维护建议与局限#
排查“按钮不响应”时,依次检查 intention 是否仍由活动线程持有、优先级、当前输入覆盖、movie 是否加载、返回值是否取得以及业务资格。排查“地图图标残留”时,先查来源脚本和注销路径。
本文仅验证源码组织和接口,没有运行 UI 或检查实际 Scaleform 资源的视觉布局、无障碍和分辨率效果。
源码证据#
[S1] commands_graphics.cpp L5475、L5569、L6115、L6185。 [S2] context_controller.sc L140、L192、L232、L278、L330。 [S3] blip_controller.sc L359–439、L569、L695。 [S4] PauseMenu_Multiplayer.sc L9828、L10027、L10161、L10383。 [S5] 单机 hud、shared PauseMenu、多人数据信息与 HUD 目录。
[S1]: <../../../GTAV Source/src/dev_ng/game/script/commands_graphics.cpp> [S2]: <../../../GTAV Source/script/dev_ng/singleplayer/scripts/contextcontrol/context_controller.sc> [S3]: <../../../GTAV Source/script/dev_ng/singleplayer/scripts/blipcontrol/blip_controller.sc> [S4]: <../../../GTAV Source/script/dev_ng/shared/PauseMenu/PauseMenu_Multiplayer.sc> [S5]: <../../../GTAV Source/script/dev_ng/multiplayer/scripts/hud>