上次,Claude 通过全新的原生 MCP 在虚幻引擎 5.8 里搭出了一个世界—— 而那期视频下方点赞最高的评论,毫无悬念是: “好吧,但你能用一个本地、免费、开源的 AI 做到这些吗?” 问得好。Claude 确实出色——直到你看到账单为止。
所以这一次:没有云端、没有 API key、没有订阅。 Qwen3.6-27B——270 亿参数,大约 17 GB 的权重躺在一块消费级 GPU 上——通过同一个原生 MCP 直连正在运行的虚幻编辑器。17 条提示词,而且每一条都是全新对话:模型在 步骤之间什么都不记得。思考模式关闭。而 Cline 历史里的每个任务,角落里都挂着同一个 数字:$0.00。

真正的问题从来不是“它能不能打开编辑器”,而是一个本地模型能否扛住一个真实项目:编写蓝图、搭一个 28 控件的 HUD、接好输入系统,还要钻进 引擎肚子里追踪自己的 bug——还是在第一次工具调用时就崩掉。据我们所知,在这之前还 没有人发布过通过 UE 原生 MCP 成功完成的本地 LLM 构建;我们找到的唯一一次公开尝试, 在发布当天以失败告终。下面是完整的搭建方法、它做出了什么,以及一个诚实的结论。
1. 模型:Qwen3.6-27B,以及它真正需要的硬件
选择的是 Qwen3.6-27B——一个稠密的开放权重模型,目前在开源模型的 智能体编码基准中名列前茅,这一代还内置了工具调用方面的改进。这里使用的具体版本来自 unsloth GGUF 仓库,用的是 UD-Q4_K_XL 量化 (UD = Unsloth Dynamic)——权重大约 17 GB。

2. 用 llama.cpp 在本地启动它(这些参数就是全部胜负手)
一条命令装好 llama.cpp——在 Windows 上就是 winget install llama.cpp——然后 启动服务器。-hf 参数会在第一次运行时 直接从 Hugging Face 拉取指定的量化版本,所以不需要单独的下载步骤:
winget install llama.cpp # macOS/Linux: curl -LsSf https://llama.app/install.sh | sh
llama serve -hf unsloth/Qwen3.6-27B-GGUF:UD-Q4_K_XL -a Qwen3.6-27B \
--host 127.0.0.1 --port 1235 \
-ngl 99 -fa on -c 40960 \
--cache-type-k q8_0 --cache-type-v q8_0 \
--jinja --reasoning off \
--temp 0.7 --top-p 0.80 --top-k 20 --min-p 0.0 \
--presence-penalty 1.5 --repeat-penalty 1.0每一组参数都在做什么——因为它们每一个都有存在的理由:
-ngl 99 把所有层都放到 GPU 上(99 的意思就是“全部”)。-fa on 启用 flash attention。-c 40960 是 Qwen3 的原生上下文上限——显存吃紧就调低它。q8_0 的 K/V 缓存参数把注意力缓存压缩到 8 位:内存几乎减半,质量几乎不动。-a Qwen3.6-27B 给 API 里的模型命名——稍后你要在 Cline 里输入的正是这个字符串。--reasoning off 关闭思考模式:智能体循环需要的是每回合一次快速工具调用,而不是一段独白——延迟更低,也不浪费 token。--repeat-penalty 1.0,意思是关闭。llama.cpp 默认给它设成 1.1,而那种老式惩罚会实实在在地伤害 Qwen。--jinja 强制 llama.cpp 使用模型的原生对话模板。没有它,服务器就无法解析 Qwen 用来格式化工具调用的 标签——Cline 将永远看不到任何一次工具调用。模型看起来一切正常,聊得很开心,却对 你的编辑器什么也不做。如果你的本地智能体“只说不做”,第一个要检查的就是 这个参数。
3. 把 Cline 指向你自己的服务器
Cline 就是这里的智能体框架——一个免费开源的 VS Code 扩展。llama-server 暴露的是 OpenAI 兼容端点,所以 Cline 与你的 GPU 对话时,就像在调用一个云端 API:
API Configuration
Provider 选 OpenAI Compatible;Base URL 填 http://127.0.0.1:1235/v1(其中的 /v1 路径必不可少);Model 填 Qwen3.6-27B——必须与 -a 参数完全一致;API Key—— 随便填一个非空字符串(服务器从不校验它,但 Cline 要求这一栏不为空)。Context Window 填 40960,与服务器保持同步。Reasoning Effort 选 None,对应 --reasoning off。
对虚幻智能体真正重要的功能开关
Native Tool Call 开——使用模型真正的工具调用格式,而不是提示词 补丁。Parallel Tool Calling 关——反正你也无法并行操作虚幻编辑器; 它一次只能做一个操作。Auto Compact 关——这里一个对话就是一个 任务,永远不会有需要压缩的长历史。
Yolo Mode 开(可选,但这正是重点)
Yolo Mode 会自动批准每一次工具调用——相当于本地版的 bypass-permissions。用云端 智能体时,每一次“继续吗?”都在消耗你的注意力和钱;这里模型是 你自己的,放手让它跑。

4. 把它接进虚幻引擎 5.8
虚幻这一侧还是我们在 上一章 讲过的那个原生 MCP 服务器——启用插件、打开 Auto Start Server,编辑器就会在 http://127.0.0.1:8000/mcp 上监听。 (MCP 插件目前仍标记为 Experimental,而且有时确实看得出来——下文细说。)唯一的 新东西是在 cline_mcp_settings.json 里把它告诉 Cline:
{
"mcpServers": {
"unreal-mcp": {
"type": "streamableHttp",
"url": "http://127.0.0.1:8000/mcp"
}
}
}第一个任务,在全新对话里:“check mcp connection to unreal engine.” 第一条 execute_python_code 调用就失败了, 抛出一个 AttributeError——一次写错的 Python API 调用。而这恰恰是第一个真正令人 振奋的时刻:模型读了 traceback,自己得出结论——连接没问题,错的只是它的 代码——然后用修正后的代码重试。8 毫秒之后:“MCP connection to Unreal Engine: SUCCESSFUL.”

一个任务之间毫无记忆的本地模型,生死全系于它的规则文件。这一份—— BurgerTower_SystemPrompt.md—— 装着项目约定、编辑器 API 笔记、编译纪律,以及那些否则每个都要吃掉一条提示词的引擎 陷阱(float 必须声明为 real 类型, 否则会悄悄变成 int;每次工具调用只做一个系统;编译两遍以清除默认值警告)。放进你 的项目里,按需修改。
5. 压力测试:17 条提示词做出一个完整游戏
项目叫 BurgerTower——一个单键街机叠塔游戏。一块食物在不断长高的 塔上方来回摆动;点一下就落下。落得干净可以得分加成,外加一泼肉汁;塔身歪斜就会 倒塌,一局结束。每叠一层,镜头就爬得更高——城市、云层、平流层、太空。项目里只带了美术资源:八个食物网格、一张全景贴图、一张空荡荡的摄影棚地图。每一张蓝图、 每个图表、控件、输入资产、材质和特效,都要由模型通过 Python 在编辑器里现场编写。

还有一条让这次测试成为真正基准而非演示的规矩: 每条提示词都是一个全新的 Cline 任务,上下文干干净净。模型在步骤 之间什么都不记得——连续性全靠提示词本身来传递,就像把活儿委托给一个每天早上醒来都 失忆的承包商。总共 17 份委托。
提示词 1-6:整副骨架,一次 Play 都没按
前六条提示词把每个部分分开构建,只靠编译来验证:带物理配置和网格池的下落 方块 Actor(网格必须就是根组件——物理只模拟根,挂在空根下面的网格会在物理唤醒的 一瞬间被撕下来);它的事件图,其中一个三重过滤的 Hit 事件把一次物理接触变成恰好 一个“我落地了”的信号;一个从引擎模板复制出来的 Niagara 爆发特效;带 19 个状态变量的摄像机 Pawn;还有 HUD。

HUD 值得单独说一句:28 个控件——记分卡、金色的 BEST 徽章、 PERFECT!/COMBO 提示、带 CITY/CLOUDS/STRATOSPHERE/SPACE 刻度的海拔仪,以及带 RETRY 按钮的完整死亡界面——排版、锚定、上色、样式全部用代码完成,只用了两次 工具调用,UMG 设计器里一下都没点。第二次调用是本地模型连续流式输出了大约两分半钟的 一整段代码。一次编译通过。
提示词 7-13:接线成型、第一次 Play、第一次游戏结束
第二幕按依赖顺序把各部分连起来:先是 Pawn 上的落地接收器,然后是 Tick 心跳(摆动 正弦、平滑的镜头爬升、逐帧 HUD 更新、由物理驱动的失败判定)、Enhanced Input 资产、 BeginPlay 引导,以及游戏模式——包括一个隐蔽陷阱:设置默认 Pawn 之后必须重新编译游戏模式,否则 Play 会一直生成引擎自带的 Pawn。模型重新编译并回读 数值做了验证。整个系列的第一次 Play 直到第 11 条提示词之后才出现:Pawn 生成,HUD 从零起步,一块面包在塔基上方摆动。

第 12 条提示词是投放按钮——在按下的一瞬间判定完美、唤醒方块的物理、棘轮式抬升 镜头、生成下一块——也是整个系列最大的代码块:大约三分钟的流式输出,然后引擎又花了 三分半编译这张图。任务进行到一半,MCP 端点掉线了;Cline 自己把同一条调用 原样重发,构建继续进行。这类传输失败在整个项目里发生了三次,智能体每一次 都当着镜头自愈了。然后:Play、第一次投放、一串“PERFECT! x4”连击、塔身 倾斜、在 5,316 米处倒塌、GAME OVER、RETRY——整个游戏循环跑通了。第 13 条 提示词是经典的手感打磨:加大摆幅、加快速度、把 FOV 从 70 开到 80。

提示词 14-15:按公式写出的着色器,然后是发布前收尾
第 14 条提示词是炫技环节:用代码构建背景材质——通过 MaterialEditingLibrary 连出约 18 个材质节点——把一张竖长的全景贴图映射到屏幕空间,可见窗口随镜头爬升同步 上移。纯粹的着色器数学,在提示词里以公式口述,由模型转写成节点连线。这个任务也产生 了整个系列唯一真正的波折:一条响应在传输中丢失,重试与第一次调用已经创建的资产 撞车,虚幻弹出了覆盖确认对话框。模型没有陷入循环——它判断材质已经存在,径直进入 第二部分。第 15 条提示词是发布前收尾:接上从第 7 条起就故意留空的那根 exec 连线 (停在门后的完美命中爆发特效)、把特效重新调成肉汁棕,并做一次点名——八个资产, 全部编译通过。

提示词 16:真正的 bug——以及回答标题之问的时刻
发布收尾之后,完美命中的飞溅在游戏里仍然是白色——尽管工具报告 一路绿灯,颜色值也确确实实写进了资产。第 16 条提示词把这个谜题交给模型:查明颜色 为什么始终没到屏幕上。它给出的诊断是整个项目最聪明的瞬间:Niagara 在后台编译 系统,而游戏一直在播放这个特效的旧编译副本。它的修复方案:在全部三个发射器上 重设颜色、保存,然后在编辑器里打开该系统以强制重建。下一次 Play:两次完美命中, 深棕色的飞溅带着火花。这不是照着教程做模式匹配——这是在推理引擎的资产管线。
第 17 条提示词是饭后甜点:导入一张新全景——汉堡城市上方一个大口咬合的巨头——并把 材质的采样器重新指向它。一次导入、一次重指向;平移数学放在完全不碰贴图的标量参数 里,所以背景在会话中途就在视口里实时换掉了。

6. 诚实的结论
- 它扛住了一个真实项目。17 条全新上下文的提示词,每个系统都编译 通过,还诊断并修复了一个真正的引擎级 bug。游戏的骨架在一次 Play 都没按的情况下 搭完。
- 它比云端前沿模型慢。大代码块在单块消费级 GPU 上要流式输出两到 三分钟,最重的那张图还要引擎再编译约 3.4 分钟。请预留一个从容的晚上,而不是 午休时间。
- 框架在干实活。Cline 三次重发了掉线的 MCP 调用;模型从自己写错 的 API 调用和一次资产冲突重试中都恢复了过来。要预期 Experimental 级别的 MCP 端点会打嗝——也要预期这套循环能把它消化掉。
- 提示词承载着你没花钱买的那份智力。 精确、一次一个系统的任务书加上规则文件,才是让一个无记忆本地模型表现得像资深 工程师的原因。含糊的提示词撑不过第一回合。
- 它能取代 Claude 吗?对这样的结构化构建——说真的,$0.00 的 API 成本,它把活儿干完了。对混乱、开放式的工作,前沿模型仍能给你 27B 本地模型没有 的容错余量。按项目选择,别按立场选择。

是的,数字命理学也对上了:17 条提示词、一个 约 17 GB 的模型、一座 17.7 千米高的最终高塔—— 越过太空边缘,落进巨人张开的嘴里,还配着一个像模像样的游戏结束界面。每一步的账单 都是 $0.00。
你到手的究竟是什么
这就是整条流程:一条 llama.cpp 命令、一页 Cline 设置、一条 MCP 配置——一个本地 模型就驱动着与云端智能体相同的编辑器。喂养这类项目的生成工具在不断更替;新工具一 落地,就会直接进入 竞技场,让你在投入前先做盲测对比。想看这个故事的前几章,请见 虚幻引擎 5.8 原生 MCP + Claude 以及 Claude Code + 虚幻引擎 5。
观看完整构建过程
完整的搭建过程和全部 17 条提示词,从头到尾,全程在 YouTube 上。
Stefan Vaskevich