本文档对《王者荣耀世界》PvE Boss 战 AI 队友(Bot)系统进行逆向分析。该系统使用强化学习训练 AI 操控英雄角色,在线上 PvE 副本中与人类玩家协同挑战 Boss,而非控制 Boss 本身 推断。文档包含技术架构与Boss 战实战指南两部分:前者从配置文件还原 RL 训练框架与工程决策;后者从 AI 队友的奖惩信号反推出面向玩家的通关策略——AI 被奖励的行为 = 官方认可的最优操作。
一、系统概览
该系统为《王者荣耀世界》训练 PvE Boss 战 AI 队友(Bot)。AI Bot 操控英雄角色,在线上 PvE 副本中与人类玩家协同挑战 Boss。AI 控制英雄执行移动、技能释放、目标锁定、视角控制等操作。Boss 本身不使用强化学习——在训练系统中仅作为观测输入,无策略输出头。推断 Boss 可能由引擎脚本/行为树驱动,具体机制在 RL 配置之外,未确认。
模型不使用图像 CNN 处理画面像素,而是从游戏引擎直接提取结构化状态向量 + 射线检测作为观察空间,通过 TCNN 推断(时序卷积网络,配置仅标注 backend: "tcnn")和 LSTM 进行时序推理,使用 PPO 算法配合多头奖励函数进行训练。当前部署模式为 online(线上服务),由游戏服务器(DS)在线下发难度等级控制 AI 队友的表现水平。
| 指标 | 数值 |
|---|---|
| 动作组合数 | 124 万(10×11×10×15×15×5) |
| 特征维度 | ~1200 维 |
| 奖励头数 | 7 |
| 并发 Bot 数 | 360 |
二、系统架构
Go 推理服务连接 UE4 游戏引擎和 Python 训练后端,形成完整的在线强化学习闭环。
数据流水线
游戏帧数据(UE4 Protobuf) → 特征提取(XML 驱动) → 批量推理(最大 64,5ms) → TCNN + LSTM(512 维隐状态) → 动作解码(6 维离散) → 游戏指令(移动/技能/视角)
三、模型架构
模型采用 TCNN + LSTM 架构,而非图像 CNN。推断 TCNN 可能为时序卷积网络,配置中仅标注 backend: "tcnn",具体架构未公开。所有视觉信息通过射线检测(Raycast)编码为结构化向量,不处理像素。
输出张量
| 输出键 | 形状 | 说明 |
|---|---|---|
logits | [10, 11, 10, 15, 15, 5] | 6 个策略头的原始输出 |
actions | [6] | 从策略分布中采样的动作 |
neglogps | [6] | 动作的负对数概率(PPO 重要性采样比) |
lstm_state_result | [2, 512] | LSTM 隐藏状态 (h, c) |
total_vf | [7] | 多头价值函数估计 |
四、动作空间
6 维多离散动作空间,各维度独立采样,总组合数约 124 万。
| 维度 | 大小 | 取值 | 说明 |
|---|---|---|---|
move 移动 | 10 | 0° 45° 90° 135° 180° 225° 270° 315° 停止 空 | 8 方向移动 + 停止 + 空操作 |
skill 技能 | 11 | 普攻、跳跃、闪避、蓄力攻击、Q、E、R、T、切换流派、无、F | 技能释放 |
target 目标 | 10 | 目标 0–9 | 在最多 10 个可见实体中选择锁定目标 |
turn-up 俯仰 | 15 | −30° … 0 … +30° | 相机俯仰角调整 |
turn-right 偏航 | 15 | −60° … 0 … +60° | 相机偏航角调整 |
nav-fwd 导航 | 5 | 0, 1, 2, 3, 停止 | 导航前进方向选择 |
五、特征空间
XML 驱动的特征提取框架。每个特征通过 func 属性绑定 Go 侧提取函数,通过 type 定义归一化方式。
主角色 × 1
| 特征 | 内容 | 维度 |
|---|---|---|
| GameVector | 剩余游戏时间 | 1 维 |
| StateVector | 英雄 ID、血量、体力、位置、朝向、速度、连击数、角色专属标志 | ~55 维 |
| SkillVector × 13 | 技能等级、可用性、封印状态、所属流派、最大/剩余 CD | 78 维 |
| PlayerBuffVector × 20 | Buff 类型(7)、层数、剩余时间(3 档)、持续时间(3 档) | 260 维 |
| RayCastVector | 21 条射线 × 3 距离档 (2m/10m/50m) + 区域可见性 | 134 维 |
| LegalActionVector | 合法动作掩码 | 24 维 |
其他玩家 × 6
| 特征 | 内容 | 维度 |
|---|---|---|
| SoldierVector | 士兵类型(10) | 10 维 |
| StateSoldierVector | 血量、体力、法力、位置(3)、朝向(3)、相机(3)、速度(3) | 15 维 |
| PlayerBuffVector × 20 | 同主角色 | 260 维 |
| PlayerInteractVector | 距离(4 尺度)、位置差(5)、相对角度、技能 R 位置 | 16 维 |
Boss × 3
| 特征 | 内容 | 维度 |
|---|---|---|
| BossVector | Boss 类型(10)、相对位置(3) | 13 维 |
| StateBossVector | 血量、活力、体力、法力、位置(3)、朝向(3)、相机(3)、速度(3)、破防/红光标志 | 20 维 |
| PlayerBuffVector × 20 | Boss Buff 追踪 | 260 维 |
| PlayerInteractVector | 同其他玩家 | 16 维 |
弹道 × 15
| 特征 | 内容 | 维度 |
|---|---|---|
| BulletVector | 距离(4 档)、位置差(5)、ID(10)、类型(7 one-hot)、时间(9)、前摇标志、阵营(3)、数量、旋转(3)、尺寸(3)、是否在打击范围内 | ~48 维 |
导航 Agent(独立模型)
| 特征 | 内容 | 维度 |
|---|---|---|
| NavStateVector | 位置(3)、前向(1)、移动状态(23 多热编码) | 27 维 |
| NavRaycastVector | 环境射线检测编码 | 252 维 |
| NavLegalActionVector | 扩展合法动作掩码 | 49 维 |
| NavAreaVector | 目标角度、下一路径点偏差、距离 | 9 维 |
六、奖励结构
采用多头奖励设计,每个奖励头对应独立的价值函数和折扣因子 γ,避免不同维度的奖励信号相互干扰。
方案 A:标准战斗(3 头)
头 2:伤害(主奖励头)γ = 0.98
| 奖励项 | 权重 | 状态 |
|---|---|---|
| 伤害输出 (damage) | +0.0004 | 启用 |
| 击杀 (kill) | +0.3 | 启用 |
| 承受伤害 (damageTaken) | −0.0001 | 启用 |
| 远程英雄奖励 (yuanCheng) | +1.0 | 启用 |
| 跳跃惩罚 (new_jumpPern) | −0.0015 | 启用 |
| 时间惩罚 (timePern) | −0.002 | 启用 |
| Boss 远程惩罚 (bossYuanCheng) | +0.001 | 启用 |
| Boss 近战奖励 (bossJinZhan) | +0.001 | 启用 |
| Z 轴远离惩罚 (zDistance) | −0.001 | 启用 |
| 攀爬奖励 (climbPern) | +0.0002 | 启用 |
方案 B:角色专属 — 主战/梦王(7 头)推测
「主战」「梦王」为拼音缩写 zhuzhan / mnwj 的猜测翻译,配置中无中文原文。
| 奖励头 | γ | 奖励项 | 设计意图 |
|---|---|---|---|
| H0 伤害 | 0.99 | 造成伤害 +10,承受伤害 −2 | 主伤害信号,高权重 |
| H1 击杀 | 0.999 | 击杀 +0.1,被击杀 −0.5 | 长期击杀目标,高 γ 鼓励远期规划 |
| H2 技能 | 0.98 | 技能使用 −0.0001,保持流派 +0.0008 | 抑制技能滥用,鼓励保持流派 |
| H3 操作 | 0.99 | 完美闪避 +0.07 | 鼓励完美闪避(高技巧操作) |
| H4 空战 | 0.99 | 空中攻击 +0.0003,乱跳 −0.0005 | 空中攻击奖励 vs 乱跳惩罚的权衡 |
| H5 环境 | 0.99 | 区域惩罚 +0.004 | 位置区域控制 |
| H6 状态 | 0.99 | Buff 惩罚 +0.004 | 状态效果管理 |
七、训练配置
| 参数 | 值 | 说明 |
|---|---|---|
| 算法 | PPO(近端策略优化) | On-policy,基于 clip 的策略梯度 |
| LSTM 隐藏维度 | 512 | 跨帧时序记忆 |
| GAE λ | 0.97 | 优势估计平滑系数 |
| 轨迹长度 | 64 帧 | LSTM 展开长度 |
| 折扣因子 γ | [0.99, 0.999, 0.98, 0.99, 0.99, 0.99, 0.99] | 每个奖励头独立设置 |
| 每 Bot 批大小 | 16 条样本 | MemPool 批量发送 |
| 推理批大小 | 最大 64,超时 5ms | 流水线并行 |
| 模型同步 | 每 30 秒,保留 20 个历史版本 | ModelPool 热更新 |
| 最大并发 Bot | 360 | 并行环境数 |
| 帧跳过 | 1 | 每帧都响应 |
| 蒸馏 | Teacher-Student(可选) | 基于 logits 的 KL 散度蒸馏 |
八、动态难度系统
10 级渐进难度,从"笨拙 AI"平滑过渡到"完美反应"。DS 可在线下发难度等级(diffi: 2 表示在线模式)。
| 参数 | 最低难度(笨拙) | 最高难度(完美) |
|---|---|---|
| 感知延迟 | 4.0s | 0s |
| 闪避失误率 | 90% | 0% |
| 普攻冷却 | 0.352s | 0s |
| 技能额外冷却 | ×1.82 | ×0 |
| 策略抑制率 | 40% | 0% |
| 普攻失误率 | 14.2% | 0% |
九、多 Actor 配置
三套独立的 Actor 配置,对应不同场景和角色,各自使用独立模型和奖励函数。
| 地图 ID | 名称 | 模型路径 | 奖励配置 | 用途 |
|---|---|---|---|---|
| 0 | ngr_pvp | models/default/ | config_battle.json(3 头) | 标准 PvE Boss 战,双流派 |
| 1 | ngr_pvp_nav | models/nav/ | config_battle.json | 导航专项模型,独立特征提取器 |
| 2 | ngr_pvp_mnwj | models/fight_mnwj/ | config_battle_mnwj.json(7 头) | 角色专属战斗模型 推测 mnwj = 梦王? |
十、为什么选择 PPO?推断
从配置中的 neglogps、gae_length、tdlamda 可确认使用 PPO。以下算法对比和优势分析为基于系统架构的推断,非来自官方文档。
算法对比
| 算法 | 结论 | 原因 |
|---|---|---|
| DQN / Rainbow | ❌ 不可行 | 需要对每个动作估计 Q 值,124 万种组合不可行。只能输出确定性策略,易被针对 |
| SAC | ❌ 不适配 | 擅长连续动作空间,本系统为离散动作。需要经验回放 + off-policy,与 MemPool 管线不兼容 |
| IMPALA / V-trace | ❌ 稳定性风险 | 理论吞吐更高,但在多头奖励 + LSTM 场景下稳定性不如 PPO 的 clip 机制 |
| PPO | ✅ 最终选择 | 多离散动作天然分解;LSTM 需要 on-policy 轨迹;clip 保证训练稳定;logits 输出支持蒸馏 |
PPO 的 5 个核心优势
- 多离散动作分解 — 6 个维度独立输出 Categorical 分布,联合训练但独立采样
- 多头价值 + 多 γ — Actor-Critic 框架天然支持多头价值函数,每个头独立 GAE 计算
- LSTM + On-Policy 兼容 — 轨迹由当前策略生成,避免 off-policy 的隐状态过期问题
- 蒸馏友好 — logits 概率分布输出天然支持 KL 散度蒸馏到 Student 模型
- 工业级稳定性 — Clip ratio 限制更新幅度,360 Bot 并发 + 30 秒同步下不会突然崩溃
十一、技术栈
| 层次 | 技术 | 职责 |
|---|---|---|
| 游戏引擎 | UE4 | 游戏环境,PvE Boss 战场景 |
| 推理服务 | Go | AIsvr 推理服务,特征提取,动作解码,样本收集 |
| 模型后端 | C++ / TCNN | TCNN 推理引擎(CGO 调用),模型加载 & 批量推理 |
| 训练端 | Python | PPO 训练循环,多头 GAE,模型优化 |
| 通信层 | MCP++ / Protobuf | 样本传输(MemPool),游戏状态通信 |
| 模型管理 | ModelPool | 版本管理,30 秒热更新,保留 20 个历史版本 |
十二、反推代码结构 推测
从配置中引用的模块名、函数名和数据路径反推的代码组织。以下文件名和目录结构均为推测,实际源码不可见。仅确认存在的是配置中引用的函数名(如 StateVector、SkillVector 等 func 属性)和模型路径(如 models/fight_zhuzhan/)。
aisvr/ # Go 推理服务端
├── main.go # 入口,加载 globalConfig.yaml
├── server/
│ ├── server.go # TCP :15010,pprof :6060
│ ├── pipeline.go # 流水线并行(预处理 + 全局凑 batch)
│ └── batch_predictor.go # 最大 batch=64,超时 5ms
├── actor/
│ ├── multi_actor.go # 3 个 Actor: pvp / nav / mnwj
│ └── actor.go # 特征提取 → 推理 → 解码 → 发样本
├── feature/
│ ├── extractor.go # XML 驱动的特征提取框架
│ ├── state_vector.go # func="StateVector"
│ ├── skill_vector.go # func="SkillVector" × 13
│ ├── buff_vector.go # func="PlayerBuffVector" × 20
│ ├── raycast_vector.go # func="RayCastVector" (126+8)
│ ├── boss_vector.go # func="BossVector"
│ ├── bullet_vector.go # func="BulletVector" × 15
│ ├── soldier_vector.go # func="SoldierVector"
│ ├── interact_vector.go # func="PlayerInteractVector"
│ ├── nav_state_vector.go # func="NavStateVector"
│ ├── nav_raycast_vector.go # func="NavRaycastVector" (252)
│ ├── nav_area_vector.go # func="NavAreaVector"
│ └── legal_action_vector.go # func="LegalActionVector" (24 / 49)
├── reward/
│ ├── calculator.go # 多头奖励分发计算
│ └── heads.go # 伤害、击杀、技能、闪避、空战、环境、Buff
├── action/
│ ├── decoder.go # Logits → 游戏指令
│ └── difficulty.go # 10 级动态难度
├── model/
│ ├── tcnn_predictor.go # CGO → C++ TCNN 推理后端
│ ├── model_pool.go # 30 秒同步,20 个历史版本
│ └── lstm_state.go # h/c 隐状态管理(512 维)
├── sample/
│ └── mempool_sender.go # MCP++ → 样本池
└── distill/
├── teacher.go # 教师模型服务
└── student.go # 学生模型 + KL 损失
trainer/ # Python 训练端
├── learner.py # PPO 训练主循环
├── model/
│ ├── tcnn_model.py # 时序一维卷积网络
│ ├── lstm.py # LSTM(hidden=512)
│ ├── policy_heads.py # 6 个 Categorical 策略头
│ └── value_heads.py # 7 头价值函数
├── gae.py # 多头 GAE(λ=0.97, T=64)
└── utils/
├── mempool_reader.py # 从样本池消费数据
└── model_saver.py # 发布到模型池
十三、核心设计洞察 推断
「设计原因」列为基于配置的推断分析。
| 决策 | 具体做法 | 设计原因 |
|---|---|---|
| 不用图像 CNN | 关闭 use_mapperc_feature、use_dmap_feature、use_benchmark_depth | 结构化特征足以描述战斗状态,避免 CNN 计算开销和样本效率损失 |
| 射线检测替代视觉 | 180° 视野,21 条射线,3 个距离档(2m/10m/50m) | 轻量替代图像输入,提供空间感知 |
| 多尺度距离编码 | 弹道用 4 个尺度(500/1000/2000/5000cm) | 不同尺度归一化提供粗/细粒度距离感知,避免远近信号被压缩 |
| 多头奖励 | 3–7 个独立头,各自设定 γ | 解耦奖励信号,让伤害和闪避等不同目标独立优化 |
| 角色专属配置 | mnwj / zhuzhan / 通用各自独立奖励 + 模型 | 不同角色操作范式差异大,统一模型难以收敛 |
| 导航与战斗分离 | 导航和战斗使用独立模型 | 任务分解:导航只需环境感知,战斗需要敌方状态 |
Boss 灼绒 — 实战指南
从 AI 队友的训练配置中提炼,翻译为面向玩家的实战建议。
核心逻辑:AI 被奖励的行为 = 开发者认可的最优操作
识别出的可玩角色(10 位)
从特征配置 state.xml、奖励配置和技能 XML 中提取。
| 代号 | 角色名 | 专属机制 | AI 配置中的特殊处理 |
|---|---|---|---|
| DFY | 东方曜 | 能量系统、上一技能记忆、空中攻击 | 专属奖励头 H4(空中攻击 +0.0003),流派切换增益追踪 |
| LengChun | 冷春 | R1/R2 二段大招、Q 技能 | 专属冷却限制 Q=2s;R 血量惩罚机制 |
| JL | 嘉洛 | 独立资源系统 | R 技能冷却 10–18 秒(最长 CD 角色) |
| KAI | 铠 | 大招充能、强化普攻 | 大招状态 + 强普状态追踪,强普间隔 750ms |
| XS | 西施 | 发球机制、Q 能量、球数量、E 能量 | 三套独立能量系统并行追踪 |
| MY | 萌芽 | 子弹数量、热量管理 | 弹药 + 过热双资源管控 |
| SB | 孙膑 | 炸弹系统、Q 叠层(最多 2 层) | 炸弹存在标志 + 持续时间追踪 |
| WZJ | 王昭君 | 冰系技能 | 冰冻状态标志追踪 |
| YCZL | 元初 | 追击技能、破命技能、Z 轴能量 | 追击标志 + 破命技时间窗口监控 |
| MoCha | 墨茶 | 标记机制 | 标记状态标志追踪 |
Boss 战信息
| 配置项 | 值 | 说明 |
|---|---|---|
| Boss 名称 | 灼绒(ZhuoRong) | 从资源包逆向提取,关联 FireLeopard(火豹)形象 |
| Boss 配置 ID | 201101 | PvE 地图 10001 的固定 Boss |
| 关卡名称 | NGR_EastWorld / bigworld_redboss | 大世界红色 Boss 关卡 |
| Boss 额外血条 | 1064 | Boss 有多段血条(ext HP),需要多次击破 |
| 大招最大能量 | 10000 | 大招需要积攒大量能量才能释放 |
| Boss 可检测数量 | 最多 3 个 | 战斗中可能有多阶段或多 Boss 同时存在 |
| 弹道监控数量 | 最多 15 个 | Boss 攻击弹幕密度高,同屏最多 15 个弹道 |
| 怪物等级 / 玩家等级 | 30 / 30 | 公平等级,无等级压制 |
| 流派模式 | bot_mode: 1(双流派) | AI 队友需掌握两套流派并适时切换 |
注意:Boss 灼绒不由强化学习控制——在训练系统中 Boss 仅作为观测输入(BossVector / StateBossVector),无策略输出头。推断 Boss 行为可能由引擎脚本或行为树驱动,但具体机制不在本 RL 系统范围内,未确认。强化学习训练的是与人类玩家协同作战的 AI 队友(Bot),由游戏服务器在线下发难度等级(10 级)控制 Bot 表现水平。
从 AI 奖惩信号推导的通关策略
以下策略从 4 套奖励配置中提取。● = 被强化的行为,● = 被抑制的行为。
核心输出
| 信号 | 权重 | 建议 |
|---|---|---|
| ● 造成伤害 | +0.0004 ~ +10 | 伤害是第一优先级,权重在所有角色配置中都最高 |
| ● 击杀(打完一段血条) | +0.1 ~ +0.3 | 单次击破奖励极高,要集中火力打段位 |
生存优先
| 信号 | 权重 | 建议 |
|---|---|---|
| ● 承受伤害 | −0.0001 ~ −2 | 受伤惩罚远低于输出奖励 → 进攻优先,但别白送 |
| ● 被击杀 | −0.5 | 死亡惩罚是击杀奖励的 5 倍,不要贪刀,活着最重要 |
闪避与跳跃
| 信号 | 权重 | 建议 |
|---|---|---|
| ● 完美闪避 | +0.07 | 完美闪避奖励极高,是所有单次操作中回报最大的行为。掌握 Boss 出招节奏,精准闪避 |
| ● 乱跳 / 无意义跳跃 | −0.0005 ~ −0.0015 | 不要用跳跃当闪避用,跳跃会持续扣分 |
位置控制
| 信号 | 权重 | 建议 |
|---|---|---|
| ● 近战英雄贴近 Boss | +0.001 | 近战角色(铠、东方曜等)要贴脸输出 |
| ● 远程英雄保持距离 | +0.001 ~ +1.0 | 远程角色(王昭君、西施等)要拉开安全距离输出 |
| ● Z 轴距离过远 | −0.001 | 不要在 Boss 上方飘太高,保持攻击距离 |
技能管理
| 信号 | 权重 | 建议 |
|---|---|---|
| ● 滥用技能 | −0.0001 / 次 | 每次放技能都有微惩罚,技能要精准命中而非乱放 |
| ● 保持流派 | +0.0008 / 帧 | 频繁切换流派会丢失加成,找到合适流派后尽量保持 |
其他
| 信号 | 权重 | 建议 |
|---|---|---|
| ● 空中攻击(东方曜) | +0.0003 | 东方曜要利用空中连招,这是他的核心优势 |
| ● 待在安全区域 | +0.004 | 注意场地机制,避开危险区域 |
| ● 拖延时间 | −0.002 / 帧 | 每帧都有时间惩罚 → 速战速决,不要磨血 |
| ● 利用攀爬 | +0.0002 | 攀爬有微弱正奖励,场景中有可利用的垂直地形 |
角色专属 Boss 战节奏 推断
以下节奏建议从奖励信号和特征配置推导,非官方攻略。
东方曜 (DFY) — 空战流
利用空中攻击(+0.0003)打出连招,掌握流派切换时机。能量系统需要规划释放窗口,记住上一技能衔接。
节奏:地面起手 → 空中连段 → 完美闪避 Boss 反击 → 循环
铠 (KAI) — 强普爆发
强化普攻间隔 750ms,大招充能后爆发。近战贴脸(+0.001)是核心收益来源。
节奏:蓄能 → 大招开启 → 强普连续输出 → 闪避 → 蓄能
冷春 (LengChun) — R 技能二段
Q 技能 CD 2 秒,需要高频使用。R 有两段释放(R1/R2),存在血量惩罚机制。
节奏:Q 起手 → 普攻填充 → R1 爆发 → R2 追击 → 闪避重置
嘉洛 (JL) — 资源管理
R 技能冷却最长(10–18 秒),有独立资源系统。核心是资源积累和大招窗口把握。
节奏:普攻/小技能攒资源 → 资源满后 R 爆发 → 长 CD 期间安全输出
西施 (XS) — 三能量体系
Q 能量 + 球数量 + E 能量三套系统联动。发球机制需要精确管理。
节奏:发球蓄能 → Q/E 消耗能量输出 → 保持安全距离 → 循环
萌芽 (MY) — 热量控制
子弹 + 热量双资源。过热会导致无法攻击。
节奏:持续射击 → 热量接近上限时停火/换技能 → 冷却后继续
孙膑 (SB) — 炸弹消耗
炸弹有存在时间和状态追踪,Q 可叠 2 层。
节奏:Q 叠层 → 炸弹布置 → 引爆时机配合 Boss 硬直 → 闪避
元初 (YCZL) — 追击连段
追击技能 + 破命技时间窗口 + Z 轴能量系统。
节奏:消耗蓄能 → 追击突进 → 破命技窗口内爆发 → 脱离
Boss 弹道分析(AI 视角的 15 弹道追踪)
AI 对每个弹道追踪 ~48 维特征。从特征设计可以反推攻击模式的复杂度(注意:弹道追踪覆盖所有实体,不仅限于 Boss)。
| 追踪维度 | 特征 | 对玩家的启示 推断 |
|---|---|---|
| 距离感知(4 档) | 50m / 20m / 10m / 5m | Boss 攻击有远、中、近、贴身四档威胁判定,不同距离需要不同应对 |
| 类型识别(7 类) | one-hot 编码 7 种弹道类型 | 战场中至少有 7 种不同类型的弹道,需要分别识别和躲避 |
| 时间窗口(3 档) | 持续/剩余/爆炸时间各 3 个精度 | Boss 攻击有延迟爆炸机制,不要在弹道消失前掉以轻心 |
| 前摇检测 | is_startup 标志 | AI 会检测 Boss 攻击前摇,说明预判闪避比反应闪避更重要 |
| 范围判定 | is_inside 是否在 HitBox 内 | Boss 有 AOE 范围攻击,需要判断自己是否在打击范围内 |
| 旋转 + 尺寸 | rotation(3) + size(3) | Boss 弹道有旋转和大小变化,不是简单直线,要注意形变 |
难度系统揭秘:AI 队友如何变笨/变强
动态难度分 10 级,由游戏服务器(DS)在线下发。以下是 AI 队友在不同难度下被施加的"枷锁"——当你觉得 AI 队友反应迟钝或闪避不精准时,可能是低难度在起作用。
| 枷锁 | 最低难度(笨拙) | 最高难度(完美) | 意味着什么 |
|---|---|---|---|
| 感知延迟 | 4 秒 | 0 秒 | 低难度下 AI 看到攻击后 4 秒才反应,高难度即时反应 |
| 闪避失误率 | 90% | 0% | 低难度几乎不会闪避,高难度闪避精准 |
| 策略抑制 | 40% | 0% | 低难度有 40% 概率不执行最优策略 |
| 普攻失误 | 14.2% | 0% | 低难度普攻会打偏 |
| 技能额外 CD | ×1.82 | ×0 | 低难度技能冷却接近翻倍 |
附录 A:服务运维配置详解
以下从 globalConfig.yaml 和 privateConfig.yaml 中提取的完整运维参数。
服务端口与进程管理
| 配置项 | 值 | 来源 | 说明 |
|---|---|---|---|
| 推理服务端口 | :15010 | globalConfig.yaml | Go AIsvr 主端口 |
| pprof 性能分析 | :6060(已启用) | globalConfig.yaml | Go pprof 在线 profiling |
| Whiteboard 监控 | 9.219.248.171:50000 | privateConfig.yaml | 数据上报/白板服务 |
| GPU 服务 | 127.0.0.1 | privateConfig.yaml | 本机 GPU 推理 |
| ModelPool 地址 | 127.0.0.1:10016 | globalConfig.yaml | 模型权重同步服务 |
| 进程 PID 文件 | ../pid/aisvr.pid | globalConfig.yaml | 启动完成信号 |
内存与性能
| 配置项 | 值 | 说明 |
|---|---|---|
| Go 内存上限 | 8,053,063,680 字节(7.5 GB) | set_memory_limit,Go 1.19+ GOMEMLIMIT |
| 日志单文件上限 | 500 MB,保留 20 份,28 天 | 滚动日志策略 |
| 性能采样分位 | P98 | percentile: 0.98 |
| ELK 日志采样率 | 0.01% | elk_log_prob: 0.0001 |
超时配置
| 链路 | 超时 (ms) | 说明 |
|---|---|---|
| GameD → Connector | 200 | 游戏帧到连接层 |
| Connector → Actor | 1 | 连接层到 Actor |
| Actor → Agent | 120 | Actor 到推理 Agent |
| 预测帧超时 | 30 | 单帧推理最大时间 |
| 样本发送超时 | 120,000(2 分钟) | MemPool 样本丢弃阈值 |
| 批推理超时 | 5 | batch 凑齐等待上限 |
模型加载策略
| 配置项 | 值 | 说明 |
|---|---|---|
| 强制加载方式 | blobs | 直接加载二进制 blob |
| 模型同步间隔 | 30 秒 | ModelPool 拉取周期 |
| 历史版本保留 | 20 个 | 可回滚的版本数 |
| 历史快照间隔 | 3,600 秒(1 小时) | 长期存档频率 |
| 战斗中刷新模型 | false | 战斗期间不热更新 |
| 模型帧加载频率 | 每 256 帧 | load_model_frame_freq |
| 最大保存模型数 | 50 | model_save_num |
| 联赛模式 | false | 未启用 league 模式 |
流水线并行
| 配置项 | 值 | 说明 |
|---|---|---|
| 最大全局预测器 | 30 | max_global_predictor |
| 预处理并行 | true | 特征提取并行化 |
| 全局 Batch | false | 使用 Actor 级别 Batch |
| Pipeline 缓存帧数 | 3 | 缓冲帧数 |
| 请求合并策略 | none | 不合并请求 |
| 响应合并策略 | pipeline | 回包时合并所有玩家 |
附录 B:蒸馏(Distillation)系统配置
系统内置 Teacher-Student 蒸馏框架,当前部署为 is_distill: false(未启用)。
| 配置项 | 值 | 说明 |
|---|---|---|
| 蒸馏模式 | student / teacher 可选 | 当前设为 student |
| 样本类型 | student | 蒸馏样本归属 |
| Student 接收地址 | 127.0.0.1:7070 | 学生端样本接收 |
| Teacher 地址 | 127.0.0.1:15001 | 教师模型服务 |
| Teacher 多节点 | teacher_1、teacher_2 各 ratio=1 | 多教师负载均衡 |
| 动作同步 | true → 127.0.0.1:7080 | 蒸馏时动作对齐 |
| 状态同步 | true → 127.0.0.1:9090 | 蒸馏时隐状态对齐 |
附录 C:战斗对抗(Battle)系统配置
系统内置 Master-Slave 对抗框架,当前部署为 is_battle: false(未启用)。
| 配置项 | 值 | 说明 |
|---|---|---|
| 对抗类型 | master / slave 可选 | 当前设为 master |
| Master 接收地址 | 127.0.0.1:7071 | 主节点接收 |
| Slave 多节点 | slave_1、slave_2 各 ratio=1 | 多从节点配置 |
附录 D:游戏参数详解
基础参数
| 参数 | 值 | 来源 | 说明 |
|---|---|---|---|
| 引擎 | UE4 | privateConfig.yaml | 游戏引擎 |
| 队伍数 | 2 | num_team | 双队伍制 |
| 最大 HP | 500 | max_hp | 角色血量上限 |
| 坐标范围 X | [−9000, 9000] cm | x_range | 相对坐标范围 |
| 坐标范围 Z | [−9000, 9000] cm | z_range | 相对坐标范围 |
| 默认视野角 | 90° | fov.default | 相机视野 |
| 局部视野 | true | local_vision_flag | 非全透视,有视野迷雾 |
| 帧跳过 | 1 | frame_skip_num | 每帧都响应 |
| 事件类型 | battle | event | 战斗事件 |
地图坐标(离线导航)
| 轴 | 范围 | 说明 |
|---|---|---|
| X | [176,400, 730,800] cm | 导航可达区域 X 范围 |
| Y | [−730,800, −176,400] cm | Y 轴反向 |
| Z | [−2,000, 500,000] cm | 高度范围极大(含空战高度) |
地图中心坐标:[18734, 90018, 41387](三套地图配置均相同)
角色专属冷却限制
| 角色 | 参数 | 标准/梦王模式 | 导航模式 | 说明 |
|---|---|---|---|---|
| 冷春 | Q 技能 CD | 2,000 ms | 2,000 ms | 三个模式一致 |
| 嘉洛 | R 技能 CD | 10,000 ms | 18,000 ms | 导航模式大幅增加冷却 |
| 通用 | 闪避 CD | 2,000 ms | 2,000 ms | dash_cd_ms |
| 通用 | 蓄力攻击 CD | 2,000 ms | 2,000 ms | charge_atk_cd_ms |
| 通用 | 蓄力释放时间 | 100 ms | 100 ms | charge_atk_release_ms |
| 通用 | 移动频率 | 300 ms | 300 ms | move_freq_ms |
| 铠 | 强普间隔 | 750 ms | 750 ms | qiangpu_atk_ms |
| 通用 | 目标切换 CD | 1 ms | 1 ms | 几乎无限制 |
| 通用 | 视角转动频率 | 500 ms | 500 ms | rot_freq_ms |
| 通用 | 观察期 | 10 秒 | 10 秒 | ob_seconds |
疲劳系统(未启用)
| 参数 | 值 | 说明 |
|---|---|---|
| 启用 | false | fatigue_flag |
| 最大疲劳值 | 180 | max_fatigue |
| 恢复间隔 | 每 1 帧 | fatigue_rec_gap_frame |
| 每帧恢复量 | 60 | fatigue_rec_per_frame |
附录 E:动作空间精确配置
从 general_action_config.json 中提取的精确动作值。
移动方向(10 选 1)
[0°, 45°, 90°, 135°, 180°, 225°, 270°, 315°, −1(停止), 9999(空)]
技能(11 选 1)
["normal_atk", "jump", "dash", "charge_atk", "q", "e", "r", "t", "switch", "none", "f"]
目标选择(10 选 1)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
俯仰角 turn-up(15 选 1)— 非对称分布
[−30, −25, −20, −15, −10, −5, −3, 3, 5, 10, 15, 20, 25, 30, 0]
注意:0° 在最后而非中间,且正负侧不对称(负侧有 −3°,正侧有 3°)。
偏航角 turn-right(15 选 1)— 非对称分布
[−60, −50, −40, −30, −20, −10, −5, 5, 10, 20, 30, 40, 50, 60, 0]
同样 0° 在末尾,正负不完全对称。
导航前进 Nav-f-slct(5 选 1)
[0, 1, 2, 3, −1(停止)]
未启用:turn-down(13 选 1)
[−21, −15, −10, −6, −3, −1, 1, 3, 6, 10, 15, 21, 9999]
used_by_model: false
附录 F:射线与视觉感知详细配置
从 feature_extractor/config.json 中提取。
| 参数 | 值 | 说明 |
|---|---|---|
| 射线范围 | 180° | 前方半圆扇形 |
| 射线数量 | 21 条 | 均匀分布 |
| 英雄高度 | 180 cm | 射线发射高度 |
| 距离档位 | 200 / 1,000 / 5,000 cm | 即 2m / 10m / 50m |
| 高度变体 | [60, 150] cm | 两个高度层的射线 |
| 可见持续帧 | 5 帧 | 目标消失后保持可见的帧数 |
Face Screen(面部屏幕)感知
| 参数 | 值 | 说明 |
|---|---|---|
| 通道数 | 4 | 4 类信息通道 |
| 垂直分辨率 | 30 格 | 垂直方向 30 个网格 |
| 水平分辨率 | 30 格 | 水平方向 30 个网格 |
| 射线长度 | 5,000 cm(50m) | 最大感知距离 |
| 垂直角度 | 30° | 上下各 15° |
| 水平角度 | 60° | 左右各 30° |
| 终端距离 | [60, 30, 10] cm | 三级精度 |
俯视图感知
| 参数 | 值 | 说明 |
|---|---|---|
| 全局俯视格数 | 30×30 | top_view_grid_num |
| 全局格间距 | 300 cm | 覆盖 90m×90m |
| 高度范围 | −1,000 ~ 5,000 cm | 俯视高度切片 |
| 最大视距 | 20,000 cm(200m) | 俯视最大感知距离 |
| 局部俯视格数 | 30×30 | local_top_view |
| 局部格间距 | 30 cm | 覆盖 9m×9m 近身范围 |
| 局部射线长度 | 600 cm | 6m 局部射线 |
移动状态半高
[90, 60, 40] cm — 站立 / 蹲下 / 匍匐三种姿态的碰撞半高。
附录 G:难度系统详细参数
从 difficulty_confs/config.json 中提取。当前部署 enable: false(由 DS 在线下发,不使用本地配置)。
等级范围(Level 1 → Level 10)
| 参数 | 最弱(Level 1) | 最强(Level 10) | 说明 |
|---|---|---|---|
| 感知延迟 | 4.0 秒 | 0 秒 | 看到攻击后反应时间 |
| 闪避失误率 | 90% | 0% | 触发闪避但失败的概率 |
| 闪避延迟率 | 20% | 0% | 闪避动作延迟执行 |
| 起身失误率 | 20% | 0% | 被击倒后起身失误 |
| 闪避 CD | 5 秒 | 0 秒 | 闪避冷却时间 |
| 技能额外 CD 倍率 | ×1.82 | ×0 | 技能冷却额外加成 |
| 普攻失误率 | 14.2% | 0% | 普攻打偏概率 |
| 普攻 CD | 0.352 秒 | 0 秒 | 普攻间隔 |
| 闪避攻击失误率 | ×1.82 | 0 | 闪避后反击失误 |
| 策略抑制率 | 40% | 0% | 不执行最优动作概率 |
| 空间误差范围 | 0.25 | 0.05 | 位置判断偏差 |
Normal 模式 Level 1 覆盖值
当使用 normal 模式第 1 级时,部分参数有独立覆盖值:
| 参数 | 覆盖值 | 与 range 的差异 |
|---|---|---|
| 感知延迟 | 2.0 秒 | range 是 4.0 秒 |
| 闪避失误率 | 40% | range 是 90% |
| 普攻失误率 | 50% | range 是 14.2% |
| 普攻 CD | 1.2 秒 | range 是 0.352 秒 |
| 伤害倍率 | 0.8 | range 中无此参数 |
| 策略抑制率 | 20% | range 是 40% |
注意:damage_ratio: 0.8 仅出现在 normal level 1 中,意味着低难度下 AI 只造成 80% 伤害。
难度模式说明(diffi 字段)
| 值 | 含义 |
|---|---|
| 0 | 无难度配置 |
| 1 | 离线难度配置(使用本地 config.json) |
| 2 | DS 在线难度配置(当前部署) |
附录 H:第四套奖励配置 — config_battle2.json
除了 config_battle.json(3 头标准)和 config_battle_mnwj.json(7 头梦王)外,还存在两套未在主配置中激活的奖励变体。
config_battle2.json(3 头 — 防御导向变体)
| 头 | 名称 | 奖励项 | 权重 | 状态 | 描述 |
|---|---|---|---|---|---|
| H0 | navHeadDense | dodgeDamage 避免伤害 | −0.0001 | 启用 | 主标准版无此项 |
| H1 | navHeadArrive | circleRange 圆形区域远离 | −0.001 | 启用 | 距离圆形安全区域太远的惩罚 |
| bossRange Boss 距离 | +0.001 | 禁用 | 距 Boss 一定距离内的奖励 | ||
| jumpPern 跳跃 | −0.01 | 启用 | 跳跃惩罚(权重比标准版高 10 倍) | ||
| H2 | damageHead | damage 伤害 | +0.001 | 禁用 | 伤害奖励已禁用 |
| damageTaken 受伤 | −0.01 | 启用 | 受伤惩罚(标准版的 100 倍) | ||
| bossRange Boss 距离 | +0.01 | 启用 | 启用,权重高 | ||
| jumpPern 跳跃 | −0.01 | 启用 | 跳跃惩罚 |
关键差异:这是一个防御/站位导向的训练配置——伤害奖励被禁用,受伤惩罚提高 100 倍,强调保持 Boss 距离和避免乱跳。
config_battle_zhuzhan.json(7 头 — 主战变体)
与 config_battle_mnwj.json 对比:
| 头 | mnwj 版 | zhuzhan 版 | 差异 |
|---|---|---|---|
| H0 伤害 | 伤害 +10,受伤 −2 | 相同 | 无差异 |
| H1 击杀 | 击杀 +0.1,被杀 −0.5 | 相同 | 无差异 |
| H2 技能 | skillPern −0.0001,genreStay +0.0008 | rangeHead:bossYuanCheng +0.0005(❌),bossJinZhan +0.0005(❌) | 完全不同的头! |
| H3 操作 | perfectDash +0.07 | 相同 | 无差异 |
| H4 空战 | airAttack +0.0003,jumpPern −0.0005 | 相同 | 无差异 |
| H5 环境 | areaPern +0.004 | 相同 | 无差异 |
| H6 状态 | buffPern +0.004 | 相同 | 无差异 |
关键差异:zhuzhan 版的 H2 头用距离控制(远程/近战奖惩)替代了 mnwj 版的技能管理(滥用惩罚 + 流派保持),但这两项都被设为use: false(禁用)。同时models/fight_zhuzhan/目录存在tcnn.struct和tcnn.weights模型文件,但未在multiActorConfig.yaml中激活。
四套奖励配置总览
| 配置文件 | 头数 | 定位 | 激活状态 |
|---|---|---|---|
| config_battle.json | 3 | 标准战斗(通用) | Actor 0 (ngr_pvp) |
| config_battle_mnwj.json | 7 | 角色专属(mnwj) | Actor 2 (ngr_pvp_mnwj) |
| config_battle_zhuzhan.json | 7 | 角色专属(zhuzhan) | 未激活(模型存在) |
| config_battle2.json | 3 | 防御/站位导向 | 未激活 |
附录 I:数据可视化系统
从 common/datavis.json 中提取(当前 disabled: false,已启用)。
| 数据通道 | 可视化类型 | 说明 |
|---|---|---|
| height_map | heatmap | 高度图热力图 |
| depth_map | heatmap | 深度图热力图 |
| raycast | raycast | 射线可视化 |
| feature | multilines | 特征向量多线图 |
| action | multilines | 动作分布多线图 |
| reward | multilines | 奖励信号多线图 |
| value | multilines | 价值函数多线图 |
可视化服务端口::8080
附录 J:分析方法与数据来源
本报告为 静态配置逆向分析——未运行任何训练/推理代码,未反编译任何二进制,未抓取游戏运行时数据。所有结论均从 AILab/pve/ 目录下的配置文件、模型元数据以及 NGR/Content/Paks/ QTSF 包的明文片段中推导而来。
J.0 分析步骤
- 配置提取 — 逐文件解析 YAML/JSON/XML,抽取全部字段及其取值,形成原始事实集合
- 交叉引用对齐 — 将
feature_config.xml的特征名与reward/*.json的引用字段、action/config.json的输出维度进行关联;将multiActorConfig.yaml的 actor 名称与map_confs/*.yaml对齐 - 语义反推 — 从奖励函数的正负号与权重推断 AI 被鼓励/惩罚的具体行为;从特征选择反推引擎暴露给 AI 的状态信号
- 规模核算 — 对动作空间(10×11×10×15×15×5 = 124 万)、特征维度、并发 Bot 数等关键指标做算术核验
- Pak 资源二进制扫描 — 由于 Boss 名称等元数据不在 AI 配置中,针对
NGR/Content/Paks/下的 QTSF 二进制包(.db分片)编写 Python 脚本做字符串扫描(详见 J.0.1) - 证据分级 — 对任何无法从上述文件直接读出的结论,标注 推断 或 推测
- 玩法映射 — 将奖励信号反向投影到玩家视角,得到「AI 被奖励 = 官方认可的最优行为」的实战指南
J.0.1 Pak 资源二进制扫描细节
背景: AI 训练配置(map_confs/*.yaml)只引用了数字 Boss ID 201101,不包含人类可读名称。Boss 名称、模型资产、关卡数据均打包进 UE4 的 QTSF 虚拟文件系统(NGR/Content/Paks/),不是标准 UE4 .pak 格式,无法用 UnrealPak/FModel 直接提取。
扫描方法:
- 编写一次性 Python 脚本,对
NGR/Content/Paks/*/下约 169 个子目录中的所有.db分片做字节级字符串搜索(ASCII + UTF-16LE) - 搜索关键字:
201101(Boss ID 的 ASCII 与 int32 形式)、monster、boss、dt_、datatable - 对
Paks/main/Globalindex/GlobalIndexOverride.data和Paks/Watchdog/StorageStatus.db做同样扫描 - 所有一次性脚本在完成扫描后删除,未留存在工作目录中
扫描局限:
- QTSF 包内数据部分为压缩/加密格式,字节级搜索只能命中明文片段,真实的资源清单、蓝图、行为树均无法读取
- 未反编译
.uasset/ 未解包 QTSF 压缩段,Boss 的技能脚本、行为树仍然不可见 - 扫描结果仅用于交叉验证 AI 配置中的 ID 映射,不用于分析 Boss 实际逻辑
J.0.2 证据分级规则
| 标记 | 含义 | 示例 |
|---|---|---|
| 无标记 | 配置文件中直接可见的事实 | 动作头维度 = 6,并发 Bot = 360,模型同步间隔 = 30 秒 |
| 推断 | 基于多项配置证据的合理推断 | TCNN 是时序卷积网络(仅凭 backend: "tcnn" 字面) |
| 推测 | 缺乏直接证据的猜测,列出以供参考 | Boss 由行为树驱动;Go 源码目录结构 |
J.0.3 分析局限性
- 无源码 — 未查阅 Go 推理服务、Python 训练器、UE4 引擎的任何源代码,代码层面的结论均为推测
- 无运行时数据 — 未实际启动服务、未抓包、未观察训练过程或推理输出
- 模型权重未解析 —
tcnn.weights未做反序列化,网络结构与层数从tcnn.struct元数据和训练配置推断 - Boss 行为不在范围 — Boss 技能脚本、AI 逻辑由 RL 系统之外的模块控制,本报告不涉及
- 客户端逻辑不在范围 — UE4 客户端的表现层、特效、伤害计算等不在分析目标内
- 版本差异未验证 — 本目录配置与线上生产环境的差异(若有)未做比对
以下 J.1–J.5 列出本报告全部一手证据文件。AI 配置路径相对于 AILab/pve/,游戏资源路径相对于 NGR(2001829)/。
J.1 AI 训练与部署配置
| 类别 | 文件 | 用途 |
|---|---|---|
| 服务部署 | configs/globalConfig.yaml | 全局服务参数(端口 / 并发 / 内存上限 / 同步间隔) |
| 服务部署 | configs/multiActorConfig.yaml | 多 Actor 实例配置(3 套:ngr_pvp / ngr_pvp_nav / ngr_pvp_mnwj) |
| 服务部署 | configs/privateConfig.yaml | 私有部署参数(含 model_version: "20250807"、ds_version: "CL6040877") |
| 地图/场景 | configs/map_confs/ngr_pvp.yaml 等 3 个 | 副本与 Boss 参数 |
| 动作空间 | configs/action/config.json | 6 维 multi-discrete 动作头定义 |
| 动作空间 | configs/action/general_action_config.json | 通用动作语义 |
| 特征空间 | configs/feature_extractor/config.json | 特征管线入口 |
| 特征空间 | configs/feature_extractor/feature_config.xml | 战斗特征定义(~1200 维) |
| 特征空间 | configs/feature_extractor/nav_feature_config.xml | 导航特征定义 |
| 特征空间 | configs/feature_extractor/feature/{game,nav,player,unit}/ | 分组特征模板 |
| 特征空间 | configs/feature_extractor/feature/transfer.py | 特征变换脚本 |
| 奖励函数 | configs/reward/config_battle.json | 主战斗奖励(3 头) |
| 奖励函数 | configs/reward/config_battle_mnwj.json | mnwj 版奖励(7 头,实际激活) |
| 奖励函数 | configs/reward/config_battle_zhuzhan.json | zhuzhan 版奖励(7 头,未激活) |
| 奖励函数 | configs/reward/config_battle2.json | 第二套奖励(见附录 H) |
| 难度系统 | configs/difficulty_confs/config.json | 10 档难度曲线 |
| 数据可视化 | configs/common/datavis.json | 运维可视化面板配置 |
J.2 模型文件
| 文件 | 大小 | 用途 |
|---|---|---|
models/fight_zhuzhan/tcnn.struct | 19 KB | 网络结构元信息 |
models/fight_zhuzhan/tcnn.weights | 5.15 MB | 权重(未解析,仅用于佐证模型规模) |
models/nav/ | — | 导航子模型 |
J.3 游戏资源(Pak 二进制扫描)
| 文件 | 用途 |
|---|---|
NGR/Config/Level/LevelStreamingConfig.json | 关卡流配置,含 Boss 副本关卡名 NGR_EastWorld / 别名 bigworld_redboss / 地图 ID 10001 / 障碍物图 nishiki |
NGR/Content/Paks/qtsvfspackage.txt | QTSF 虚拟文件系统包清单(165 个包,515 行) |
NGR/Content/Paks/*/ | 约 169 个 QTSF 包目录下的 .db 二进制分片 |
NGR/Content/Paks/main/Globalindex/GlobalIndexOverride.data | 资源索引覆盖文件 |
NGR/Content/Paks/Watchdog/StorageStatus.db | 存储状态数据库(扫描目标之一) |
J.4 扫描产出(从 Pak 二进制中提取的关键字符串)
| 来源偏移 | 提取内容 |
|---|---|
Paks/1020/1020_0.db @ offset 57103760 | ZhuoRong_201101 — Boss 内部代号 |
Paks/1/1_0.db, 1/1_1.db, 1018/1018_2.db, 1020/1020_2.db, 1023/1023_0.db, 1043/1043_2.db, 1052/1052_0.db, 1054/1054_2.db, 1054/1054_3.db, 1160/1160_1.db, 1160/1160_3.db, 1164/1164_6.db | 含 201101 字节序列的其他引用(索引/引用) |
LevelStreamingConfig.json:32 | NGR_EastWorld / bigworld_redboss / 10001 / nishiki |
J.5 未使用的来源
以下文件位于相关目录但未纳入本次分析:
configs/multiActorConfig.yaml.bak— 旧版备份NGR/Content/Gamelet/— Gamelet 子包- 所有
.uasset/.umap二进制(需专用 UE4 工具解包)