ReactiveGWM: Steering NPC in Reactive Game World Models
Paper: arXiv:2605.15256 Code: INV-WZQ/ReactiveGWM Code reference:
main@a3ca9594(2026-05-18)
1. Motivation(研究动机)
现有 game world model 大多从玩家视角建模未来帧:给定初始帧 、玩家动作序列 和一个描述场景的 vanilla prompt ,模型直接预测未来视频 。问题在于,这种 prompt 会把玩家动作、背景、NPC 行为全部缠在一起,NPC 只是画面里被动出现的像素模式,而不是一个会依据战术意图作出反应的 agent。结果是,模型虽然能把玩家输入渲染成视频,却很难生成真正“会对打、会压制、会防守”的 NPC 互动。
这篇论文要解决的不是“如何再提升视频质量”,而是更具体的问题:如何在保持玩家动作精细可控的同时,让 NPC 也能根据高层策略指令作出自主反应,例如 Offense、Control、Defense 这三类战术风格。这个问题值得研究,因为一旦做成,world model 就从“玩家动作驱动的视频渲染器”更接近“有交互逻辑的模拟器”。对于游戏生成、NPC 行为设计、跨游戏可迁移控制来说,这比单纯 next-frame prediction 更接近真正可玩的世界模型。
Figure 1 解读:Figure 1 用 SF3 可视化展示了论文最想证明的能力:在玩家动作持续输入的同时,NPC 还能表现出可区分的战术风格,而不是随背景纹理随机波动。图中同一框架下可以切换不同 strategy prompt,说明作者的目标不是只生成“像街霸”的视频,而是让 NPC 的交互逻辑可被显式操控。
2. Idea(核心思想)
核心洞察是把“玩家控制”和“NPC 自主行为”在条件注入层面显式拆开。玩家动作属于低层、逐帧、离散的控制信号,更适合直接注入视频生成 backbone;NPC 战略属于高层、长时程、语义化的控制信号,更适合通过文本 cross-attention 去影响视觉时序 latent。
对应地,ReactiveGWM 用一个轻量 additive action bias 处理玩家动作,用 strategy-aware NPC prompt 通过 cross-attention 处理 NPC 战术。与传统 player-centric world model 相比,最大的不同不在于换了 backbone,而在于条件分工发生了变化:以前所有动态都挤进一个 vanilla prompt;现在玩家动作决定“我方怎么动”,NPC prompt 决定“对手想怎么打”。更进一步,作者声称 cross-attention 学到的是 game-agnostic 的 NPC control logic,因此只迁移 cross-attention 模块就能把某个游戏里学到的战术行为零样本转移到另一个 vanilla world model 上。
3. Method(方法)
3.1 从 vanilla player-centric world model 到 reactive world model
论文先把现有方法形式化为: 其中 描述整个场景,包括玩家相关事件和 NPC 所在环境。作者认为这会让 NPC 行为只能作为 prompt distribution 的副产物出现。ReactiveGWM 改写为: 这里的 不再描述整幅场景,而只描述 NPC 的高层战术意图。于是模型必须同时处理两件事:一是忠实执行玩家动作,二是让 NPC 在长期动态上符合战略指令。这个改写听起来简单,但它改变的是控制信号的职责边界,也是整篇论文最关键的 conceptual move。
3.2 Strategy-aligned data construction
方法成立的前提是有能够监督 的训练三元组 。作者选了两个 2D 格斗游戏作为主实验环境:Street Fighter II: Champion Edition(SF2)和 Street Fighter Alpha 3(SF3)。 数据构造流程分三步。第一步,使用 stable-retro 程序化采集 gameplay。随机 agent 从 13 个离散行为里均匀采样,直到一局 KO 结束;去掉开局前 5 秒后,把剩余视频切成 5 秒 clip,每段对应 100 帧、20 FPS。第二步,记录每帧玩家输入,把它保存成二值按钮向量。附录 A 给出了两款游戏的攻击键语义映射以及 13 个离散行为定义,其中方向键共享,攻击键在 SF2/SF3 之间不同。第三步,用 Gemini 对每个 clip 做 NPC strategy annotation,先抽取 factual observations,再做 deterministic rule-based classification,最后拼成 NPC prompt。 NPC prompt 形式为:
其中 Active 包含 punch、kick、projectile 等主动行为标签,Passive 包含 block、hit-stun、knockdown 等被动状态,Strategy 则在 Offense、Control、Defense 三类之间取值。作者报告每个游戏大约构造了 个训练三元组。
Figure 2 解读:Figure 2 展示了数据管线的关键点不是“给视频配一段文字”,而是把 NPC 标注拆成 raw gameplay、VLM factual observation、再到 structured prompt 三层。与 vanilla prompt 相比,NPC prompt 把场景描述压缩成高层行为约束,从而强迫模型把 NPC 当成一个需要服从战术语义的交互主体。
附录 A 还给出了更细的标注规则。Stage 1 里,Gemini 回答 12 个封闭集问题,例如是否 punch/kick、是否 jumps、是否 sonic boom、是否 advances、是否 crouches guard、谁更积极攻击等。Stage 2 再依据规则映射到三类策略,例如:
- Offense:
range=close ∧ advances=yes ∧ has_melee ∧ sonic_boom=0 ∧ pressure=yes ∧ who=guile - Control:
range ∈ {mid, far} ∧ advances=no ∧ sonic_boom≥1 ∧ ¬has_melee ∧ takes_damage=no - Defense:
¬has_melee ∧ sonic_boom=0 ∧ crouches_guard=yes,并满足更强的 passive / active 标签约束
这种两阶段设计的直觉是:高层策略太抽象,直接让 VLM 输出 strategy label 容易幻觉;先输出事实,再用规则引擎做 deterministic classification,可以把误差限制在可观察事实层面。
3.3 动作注入:每个 DiT block 前加 additive action bias
ReactiveGWM 的 backbone 是 Wan2.2-TI2V-5B。作者在 DiT block 里加入 action module,让模型在 latent 空间里感知玩家动作。
Figure 3 解读:Figure 3 的结构很直接但很重要。视频 latent 主干仍然经过 Self-Attention、Cross-Attention 和 FFN;新加的 Action Module 只负责把动作序列投影成一个与 video token 同维度的 bias,再在进入 self-attention 之前做加法。也就是说,玩家动作不是作为文本 token 去和视觉 token 竞争注意力,而是作为 residual bias 直接推动 latent 轨迹。
设每步离散动作为 ,这里两款游戏都取 个按钮列(UP DOWN LEFT RIGHT Y X Z A B C)。令输入视频长度为 ,VAE 的 temporal compression ratio 为 ,则 latent 时间长度为 。论文先对动作在时间轴上做 adaptive max-pooling,把原始按钮序列对齐到 latent 帧率。对第 个时间 bin :
于是 。接着对每个 DiT block ,学习一个无 bias 的线性投影 ,再把得到的动作 embedding 广播到整个空间 patch 网格:
其中 ,。这个设计的直觉是:玩家动作应该像控制杆一样,直接以低带宽方式推动 backbone 的隐状态,而不需要引入更重的 adapter 或额外 cross-attention。
从 released code 看,这个设计在 inference/models/dit.py 里实现为 WanModelAction。每个 block 都有一个 nn.Linear(num_buttons, dim, bias=False) 存在 action_embedders 里;_bin_action 里通过 F.adaptive_max_pool1d(..., output_size=f) 做时间对齐;_inject_action 再把 [B, f, C] 广播成 [B, f*h*w, C] 并加回 token sequence。
3.4 NPC strategy grounding:cross-attention 学语义战术,backbone 维持游戏动力学
作者把 NPC strategy grounding 放在 cross-attention 路径上。训练 source game(Game 1)时,使用完整的 strategy-aligned dataset 对整套架构做 full-parameter fine-tuning,包括 Action Module、Self-Attention、Cross-Attention、FFN。这里 cross-attention 的职责是把 中的高层文字战术对齐到视觉时序 latent 上。
Figure 4 解读:Figure 4 把方法拆成两个阶段。左侧是 source game 上的 supervised training:用 strategy-aligned prompt 训练出能表现自主 NPC 的 ReactiveGWM_base。右侧是 transfer:目标游戏先有一个 vanilla world model,再把 source game 学到的 cross-attention 直接替换进去,而保留目标游戏 backbone 的 Action Module、Self-Attention 和 FFN,从而获得 ReactiveGWM_transfer。图里强调的是“只换跨模态策略通道,不动原生视觉动力学”。
这个 transfer 设计的核心假设是:backbone 的大部分参数负责维持目标游戏的视觉和物理动力学,cross-attention 只负责注入一个相对低带宽、但方向上有意义的策略信号。论文在第 4.4 节给出了定量分析支持这个假设。
3.5 为什么只 transfer cross-attention 也能工作
论文把每个 transformer block 中 residual update 的三个来源写成 Self-Attention(SA)、Cross-Attention(CA)和 FFN,并定义 cross-attention 能量占比:
在 SF2 transfer analysis 中,作者测得 ReactiveGWM_transfer 的 只有 0.71%,几乎与 vanilla 模型的 0.70% 相同。这说明从“幅值”上讲,cross-attention 更像一个低带宽控制通道,并不会主导主体视觉结构。
但与此同时,作者定义 transferred 与 vanilla 的 cross-attention 差分方向:
并观察到 token-averaged cosine similarity 降到 0.55。也就是说,虽然 CA 占比不大,但它引入了一个足够不同的方向信号;这个信号在 30 个 block、30 个 diffusion steps 上累积,就能改变 NPC 战略轨迹而不破坏主要视觉动力学。
这一段的直觉解释很关键:作者不是说 cross-attention 很强,而是说它“足够小,不伤原画面;又足够偏,不同方向能改行为”。
3.6 论文公式与 released code 实现差异
这里需要明确写出一个 released code 与论文描述的差异。
- 论文第 3.3 节写的是:原始动作序列先通过 adaptive max-pooling 对齐到 latent 时间长度 ,然后每个 block 用线性层投影后广播注入。
- released inference 代码里,这个 adaptive max-pooling 仍然存在于
inference/models/dit.py的WanModelAction._bin_action。 - 但在更前面,
inference/utils/actions.py的load_actions还多做了一步hold_last_upsample:把 parquet 里的 10 Hz 键位流先按固定窗口 forward-broadcast,再喂给 DiT。该文件注释明确写着这是 “Mirrors training-time densification”。
因此,更准确的 released code 路径是:actions.parquet 先做 hold-window densification,再做 adaptive max-pooling 到 latent 时间轴。论文正文只强调了后者,没有显式展开前者。这个差异不影响总体方法主张,但如果按论文公式直接重写代码,会漏掉 released inference 里与训练时一致的 densification 处理。
3.7 Pseudocode
伪代码 1:构造 strategy-aligned NPC prompt
def build_npc_prompt(video_clip, vlm, rule_engine):
facts = vlm.observe_clip(video_clip)
# facts include melee actions, projectile count, range, advances,
# takes_damage, crouches_guard, initiative, active/passive tags
strategy = rule_engine.classify(facts)
active_tags = facts["active_tags"]
passive_tags = facts["passive_tags"]
prompt = {
"Active": active_tags,
"Passive": passive_tags,
"Strategy": strategy,
}
return prompt伪代码 2:每个 DiT block 的动作注入
import torch
import torch.nn.functional as F
def inject_action_bias(x, keyboard_action, action_embedder, h, w):
# keyboard_action: [B, T_raw, K]
# x: [B, f * h * w, C]
B, L, C = x.shape
f = L // (h * w)
action_binned = F.adaptive_max_pool1d(
keyboard_action.transpose(1, 2), output_size=f
).transpose(1, 2) # [B, f, K]
emb = action_embedder(action_binned.to(x.dtype)) # [B, f, C]
bias = emb.unsqueeze(2).expand(-1, -1, h * w, -1)
bias = bias.reshape(B, f * h * w, C)
return x + bias伪代码 3:ReactiveGWM transfer
def build_transfer_model(vanilla_model, reactive_source_model):
transfer_model = copy_model(vanilla_model)
for block_t, block_s in zip(transfer_model.blocks, reactive_source_model.blocks):
block_t.cross_attn.load_state_dict(block_s.cross_attn.state_dict())
return transfer_model伪代码 4:released inference pipeline
def run_inference(pipe, image, actions_parquet, prompt, negative_prompt):
keyboard = load_actions(
actions_parquet,
num_frames=101,
hold_window=10,
device="cuda",
dtype=torch.bfloat16,
)
ctx_pos = pipe.encode_prompt(prompt)
ctx_neg = pipe.encode_prompt(negative_prompt)
latents = init_noisy_latents(num_frames=101, seed=2)
first_frame_latent = pipe.encode_first_frame(image)
latents[:, :, 0:1] = first_frame_latent
pipe.scheduler.set_timesteps(num_inference_steps=30, shift=5.0)
for t in pipe.scheduler.timesteps:
eps_pos = pipe.dit(latents, t, ctx_pos, keyboard_action=keyboard)
eps_neg = pipe.dit(latents, t, ctx_neg, keyboard_action=keyboard)
eps = eps_neg + 5.0 * (eps_pos - eps_neg)
latents = pipe.scheduler.step(eps, t, latents)
latents[:, :, 0:1] = first_frame_latent
return pipe.vae.decode(latents)Code reference:
main@a3ca9594(2026-05-18) — pseudocode and mapping based on this commit
| Paper Concept | Source File | Key Class/Function | 说明 |
|---|---|---|---|
| Inference entrypoint | inference/inference.py | main | CLI 参数、默认 steps / CFG / seed、调用 SFPipeline |
| End-to-end pipeline | inference/pipeline.py | SFPipeline.from_pretrained, SFPipeline.__call__ | 载入 Wan2.2 backbone、执行 CFG/action CFG、固定首帧 latent |
| Action-conditioned DiT | inference/models/dit.py | WanModelAction, _bin_action, _inject_action | 每层 action linear、adaptive max-pool、残差注入 |
| Text-conditioned NPC control | inference/models/dit.py | _CrossAttention, _DiTBlock.forward | strategy prompt 经 T5 embedding 后进入 cross-attention |
| Action parquet preprocessing | inference/utils/actions.py | hold_last_upsample, load_actions | 10 Hz 动作流 densify 后转成 [1, T, 10] tensor |
| Variant defaults | inference/constants.py | VARIANT_DEFAULTS, NEG_PROMPT, SF_BUTTON_COLS | SF2/SF3 默认 prompt、训练分辨率、按钮列顺序 |
| Flow-matching scheduler | inference/utils/scheduler.py | FlowMatchScheduler.set_timesteps, step | 30-step Wan-style flow matching denoising |
4. Experimental Setup(实验设置)
4.1 Datasets
- Strategy-aligned training dataset:每个游戏约
10k个 action-annotated 5 秒 clip,分别为 SF2 和 SF3 各一套。 - Vanilla dataset:每个游戏另有一套等规模 vanilla dataset,也约
10k个 clip,使用普通 descriptive prompt,用来训练 baseline vanilla world model。 - Player Action Following benchmark:固定
100次测试,由10个初始帧× 10个单键动作构成,每个 rollout 生成41帧。 - NPC Strategy Following benchmark:固定
99个 curated clips,按33个 Control、33个 Defense、33个 Offense 划分。 - ClipAttackNet training data:约
5kclips,用于训练 attack classifier。
4.2 Baselines
论文比较了以下方法:
Vanilla:同一 backbone,但用 vanilla prompt 和 vanilla dataset 训练。ReactiveGWM_base:在 source game 上用 strategy-aligned dataset 全参数微调得到。ReactiveGWM_transfer:把 source game 学到的 cross-attention 注入到 target game 的 vanilla model。Matrix-Game-3.0LingBot-World-Base (Act)
其中后两者由于动作注入机制不同,只参与 NPC Strategy Following 和 Visual Quality 的参考比较,不参与玩家动作控制主评估。
4.3 Evaluation metrics
- Move-Acc:用 SAM2.1 和 Grounding DINO 跟踪玩家角色位移,在归一化坐标空间里按阈值判断动作是否执行成功。
- Att-Acc:用
ClipAttackNet(ResNet-18 + 4-layer dilated TCN)做逐帧 6 类攻击分类,置信度阈值为0.7。 - NPC Instruction Accuracy:用 Gemini 和 Qwen3-VL-8B 组成 referee ensemble,对 101 帧生成视频判断三分类战略是否匹配。
- SSIM:帧平均结构相似度。
- LPIPS:AlexNet backbone 的 full-frame LPIPS,越低越好。
- Human study:19 名熟悉 2D fighting games 的参与者,分别对 player action following 与 NPC strategy following 做主观评估。
4.4 Training config
论文明确给出的训练相关配置主要有:
- Backbone:
Wan2.2-TI2V-5B - 训练分辨率:SF2 为
480 × 608,SF3 为480 × 832 - Clip 长度:
5秒,20 FPS - ReactiveGWM 训练方式:source game 上做 full-parameter fine-tuning
- Transfer 分析的 rollout 设置:每个模型、每种策略各跑一次,共
2 × 3 = 6个 forward passes;每次生成101帧,分辨率480 × 608,30diffusion steps
但论文没有公开 GPU 类型、GPU 数量、全模型训练 batch size、learning rate、optimizer、训练步数、权重衰减等关键超参数;released GitHub 仓库当前也没有放出训练脚本或 experiment config。 因此,这里不能把 inference 默认值误写成训练配置。比如 released inference 代码里的 --steps=30、--cfg=5.0、--seed=2 只对应公开推理脚本默认值,不等于训练超参。
从 released inference code 可核对的默认推理参数包括:
num_frames=101num_inference_steps=30cfg_scale=5.0action_cfg_scale=1.0seed=2height/width默认跟随 variant:SF2480 × 608,SF3480 × 832
5. Experimental Results(实验结果)
5.1 主结果表
Figure 5 解读:Figure 5 是动作控制的定性补充。它展示了在 ReactiveGWM_base 下,玩家角色可以稳定执行 Jump、Crouch、Light Punch、Medium Kick、Heavy Punch 等细粒度指令。这个图的作用不是证明 NPC 战略,而是证明加入 autonomous NPC 后,玩家可控性并没有丢。
Table 1 的主结果如下:
| Game | Method | Move-Acc | Att-Acc | Gemini | Qwen | SSIM | LPIPS |
|---|---|---|---|---|---|---|---|
| SF2 | Matrix-Game-3.0 | - | - | 3.0 | 24.2 | 0.084 | 0.755 |
| SF2 | LingBot-World-Base | - | - | 30.3 | 46.5 | 0.142 | 0.679 |
| SF2 | Vanilla | 97.5 | 96.7 | 43.4 | 44.4 | 0.427 | 0.315 |
| SF2 | ReactiveGWM_base | 95.0 | 93.3 | 75.8 | 76.8 | 0.428 | 0.319 |
| SF2 | ReactiveGWM_transfer | 97.5 | 93.3 | 64.6 | 64.6 | 0.421 | 0.318 |
| SF3 | Matrix-Game-3.0 | - | - | 32.5 | 32.3 | 0.117 | 0.685 |
| SF3 | LingBot-World-Base | - | - | 33.5 | 40.9 | 0.202 | 0.572 |
| SF3 | Vanilla | 100.0 | 100.0 | 41.8 | 49.5 | 0.392 | 0.397 |
| SF3 | ReactiveGWM_base | 100.0 | 100.0 | 79.8 | 78.8 | 0.394 | 0.391 |
| SF3 | ReactiveGWM_transfer | 95.0 | 100.0 | 63.6 | 73.7 | 0.367 | 0.414 |
最重要的结论有三条。 第一,NPC autonomy 提升非常明显。相对 vanilla,ReactiveGWM_base 在 SF2 上把 Gemini/Qwen 的策略识别准确率从 43.4/44.4 提高到 75.8/76.8;在 SF3 上从 41.8/49.5 提高到 79.8/78.8。这说明 strategy prompt 确实被转化为可见、稳定的 NPC 战术行为。 第二,玩家动作控制基本不掉。例如 SF3 上 Vanilla 与 ReactiveGWM_base 的 Move-Acc / Att-Acc 都是 100.0 / 100.0;SF2 上虽然 ReactiveGWM_base 从 97.5/96.7 下降到 95.0/93.3,但仍保持高可控性。也就是说,把 NPC autonomy 加进去,并没有把玩家控制搞乱。 第三,transfer 版本具备实用价值。ReactiveGWM_transfer 在不重新标注目标游戏策略数据的情况下,仍能在 SF3 上达到 63.6/73.7 的 Gemini/Qwen 指标,同时保留较好的 Move-Acc / Att-Acc 和视觉质量。这是这篇工作最有“系统味”的一部分,因为它支持“训练一次策略模块,多游戏复用”这个命题。
5.2 定性结果:三种 strategy 和 active behaviors
Figure 6 解读:Figure 6 把 Vanilla、ReactiveGWM_base 和 ReactiveGWM_transfer 放在同一个 strategy 下比较。作者想说明的是,Vanilla 即便收到类似文字指令,也不会稳定表现出 Offense 策略;而带有 strategy grounding 的两个 ReactiveGWM 变体都能让 NPC 主动逼近、进攻或保持特定战术节奏。
Figure 7 解读:Figure 7 检查的是 strategy prompt 里 Active 行为标签的作用。三行分别对应 “Standing Punch + Throw”、“Jumping Attack + Standing Punch”、“Standing Kick + Crouching Kick”。这表明模型不只是学到抽象风格词,而是能把具体动作片段组织成与战略目标一致的 NPC 行为链。
Figure 8 解读:Figure 8 用 SF2 展示三种 strategy 的可感知差异。Offense 会持续压近并贴身输出;Defense 会更保守、重视规避和防守姿态;Control 则用中远距离 projectile 控制空间。这个图的重要性在于,它把定量指标里的“分类准确率”转成了人眼可理解的行为模式。
5.3 Transfer analysis:为什么视觉保持住了
论文第 4.4 节最有解释力的结果不是单纯“transfer 能成功”,而是为什么它成功。
- cross-attention 相对能量占比 :
ReactiveGWM_transfer = 0.71%,Vanilla =0.70% - transferred 与 vanilla cross-attention 的 token-averaged cosine similarity:
0.55
这说明 transferred cross-attention 既是低带宽通道,又提供了不同方向的行为信号。前者保证主体视觉结构和场景外观主要还是由目标游戏自己的 backbone 决定;后者保证战术控制不会退化成 vanilla 模型原有的被动行为。
这个分析很有启发性,因为它意味着“可迁移的世界模型控制模块”未必需要大规模替换 backbone,只要找到一个语义上可复用、结构上低耦合的注入路径即可。ReactiveGWM 选择的就是 cross-attention。
5.4 Human study
Figure 10 解读:Figure 10 评估的是人类主观感受到的玩家动作一致性。三种模型在 SF2 和 SF3 上都处在 4.32 到 4.60 的区间,且差异基本都在一个 SEM 之内。这和定量 Move-Acc / Att-Acc 结论一致:ReactiveGWM 引入 NPC autonomy 后,玩家动作跟随性仍然可靠。
Figure 10 的具体均值为:
- SF2:Vanilla
4.39,ReactiveGWM_base4.49,ReactiveGWM_transfer4.56 - SF3:Vanilla
4.60,ReactiveGWM_base4.49,ReactiveGWM_transfer4.32
Figure 11 解读:Figure 11 评估的是人类是否能从视频里识别出 NPC 正在执行哪一种 strategy。这里 ReactiveGWM 的优势比自动 VLM 评估还要明显,说明其战术控制不是“只被 judge 模型看出来”,而是对人类观察者也足够显著。
Figure 11 的 overall human strategy recognition accuracy 为:
- SF2:Vanilla
43.9%,ReactiveGWM_base86.0%,ReactiveGWM_transfer84.2% - SF3:Vanilla
17.5%,ReactiveGWM_base77.2%,ReactiveGWM_transfer61.4%
per-class breakdown 也很说明问题。Vanilla 在某些策略上几乎崩掉,例如 SF2 上 Offense 只有 10.5%,SF3 上 Defense 和 Offense 也只有 11% 左右;ReactiveGWM_base 在两款游戏上每一类都高于 63%。而 ReactiveGWM_transfer 的主要弱点出现在 SF3 的 Control 类,只有 16%,对比其 Offense 的 100% 很低。作者解释说,Control 更依赖 game-specific 的远程 projectile 动画、时序和空间效果,因此比 offense / defense 更难跨游戏迁移。
5.5 Limitations
作者明确写了两个局限:
- 评估场景局限于 2D fighting games。这很适合测试细粒度动作控制和战术策略,但还不足以证明 game-agnostic interaction logic 真能推广到更广泛的游戏类型,如 2D FPS 或 multi-agent strategy games。
- 扩散 backbone 推理延迟高。这意味着当前系统仍然更像 reactive video renderer,而不是可实时交互的游戏引擎。作者建议未来沿 autoregressive video generation 和 model distillation 两条线继续做,以减少 latency 并保持战术与视觉质量。
整体上,这篇论文证明了一个很有价值的观点:如果把玩家动作与 NPC 战略在条件通道上拆开,并把高层策略压到 cross-attention 上,world model 就能从“单边可控的视频生成器”变成“双方都有行为逻辑的交互模拟器”。更重要的是,这个 NPC control module 在一定程度上可以跨游戏迁移,说明模型学到的不只是某个游戏的视觉模式,而是更抽象的交互策略表示。