戰(zhàn):用自研 UE 插件 + MCP 服務(wù)打通虛幻編輯器 AI 協(xié)同開(kāi)發(fā))
1. 為什么要在虛幻編輯器里折騰 AI 協(xié)同開(kāi)發(fā)如果你正在做 UE 項(xiàng)目大概率遇到過(guò)這種場(chǎng)景策劃說(shuō)“給我在關(guān)卡里批量擺 50 個(gè)可交互道具”你打開(kāi)編輯器一個(gè)個(gè)拖藍(lán)圖、加組件、連變量半小時(shí)過(guò)去了?;蛘咝马?xiàng)目啟動(dòng)GameMode、PlayerController、Enhanced Input 的 Action 和 Mapping 要手動(dòng)配一遍重復(fù)勞動(dòng)拉滿。AIUEBridge 就是沖著這個(gè)痛點(diǎn)來(lái)的——它把虛幻編輯器的能力封裝成 AI 可調(diào)用的工具集讓大模型規(guī)劃、MCP 服務(wù)通信、UE 插件執(zhí)行三層各司其職最終實(shí)現(xiàn)“自然語(yǔ)言描述需求 → 編輯器里自動(dòng)落盤(pán)”的閉環(huán)。這套東西適合誰(shuí)一是想用 Cursor 或本地 Ollama 驅(qū)動(dòng) UE 做原型驗(yàn)證的獨(dú)立開(kāi)發(fā)者二是團(tuán)隊(duì)里想搭一套“AI 搭框架、C 寫(xiě)交互”工作流的 TD三是單純想看看 MCP 協(xié)議在游戲工具鏈里怎么落地的技術(shù)愛(ài)好者。它不替代編輯器也不替代你寫(xiě) C而是把那些重復(fù)的、結(jié)構(gòu)化的編輯器操作暴露成 HTTP Tool讓 AI 能真正“動(dòng)手”。我試過(guò)在 UE 5.3 里跑通整條鏈路從插件加載到 MCP 服務(wù)連通再到用 curl 創(chuàng)建藍(lán)圖、導(dǎo)出 Cursor 上下文中間踩了一些端口和配置的坑。下面按可復(fù)制的步驟拆開(kāi)講你跟著做就能在自己的項(xiàng)目里落地。2. TaoToken 前置給 AI 層準(zhǔn)備一個(gè)穩(wěn)定的模型入口AIUEBridge 的架構(gòu)里AI 規(guī)劃層是獨(dú)立于 UE 執(zhí)行層的。你可以用 Cursor 內(nèi)置的模型也可以用 Ollama 本地跑 qwen2.5:7b。但如果你想讓規(guī)劃層更穩(wěn)定、支持更長(zhǎng)的上下文和更可靠的 function calling建議給 AI 層配一個(gè)統(tǒng)一的模型接入點(diǎn)。TaoToken 在這里的角色就是模型對(duì)話與 API 調(diào)用的入口不碰你的 UE 工程只負(fù)責(zé)把自然語(yǔ)言請(qǐng)求轉(zhuǎn)成結(jié)構(gòu)化的 Tool 調(diào)用意圖。具體操作上你需要在 TaoToken 控制臺(tái)創(chuàng)建一個(gè) API Key然后把它配置到你的 AI 客戶端或 MCP 服務(wù)的環(huán)境變量里。如果你用的是 Cursor可以在 Cursor 的模型設(shè)置里填入自定義 API 地址和 Key如果你用的是自己寫(xiě)的 FastAPI Web Agent就在.env里加一行TAOTOKEN_API_KEY你的key然后在調(diào)用模型時(shí)把 base_url 指向https://taotoken.net/api。這里有個(gè)細(xì)節(jié)AIUEBridge 的 MCP Server 本身不綁定具體模型它只負(fù)責(zé)把 Tool Schema 暴露給 MCP 客戶端。所以你可以讓 Cursor 通過(guò) MCP 協(xié)議調(diào)用 AIUEBridge 的工具同時(shí)讓 Cursor 自己用 TaoToken 的模型來(lái)做規(guī)劃。這樣規(guī)劃層和執(zhí)行層解耦換模型不用動(dòng) UE 插件。如果你還沒(méi)建 Key可以直接去 TaoToken API Keys 頁(yè)面 創(chuàng)建一個(gè)記得把 Key 存到環(huán)境變量里別硬編碼進(jìn)代碼。3. 可復(fù)制配置UE 插件 MCP 服務(wù) Cursor 接入3.1 UE 插件側(cè)確認(rèn) HTTP 服務(wù)端口AIUEBridge 插件加載后會(huì)在編輯器內(nèi)啟動(dòng)一個(gè) HTTP Server默認(rèn)監(jiān)聽(tīng)18765。你打開(kāi)AIUEBridgeTest.uproject在 Output Log 里應(yīng)該能看到LogAIUEBridge: AIUEBridge HTTP server started on port 18765如果沒(méi)看到檢查插件是否在 Plugins 目錄下啟用以及 UE 版本是否匹配。端口可以在插件配置里改但改完要同步改 MCP 服務(wù)那邊的UE_BRIDGE_URL。3.2 MCP 服務(wù)側(cè)Python 環(huán)境與 .env 配置進(jìn)入mcp_server目錄復(fù)制配置模板并創(chuàng)建虛擬環(huán)境cd mcp_server copy .env.example .env python -m venv .venv .venv\Scripts\activate pip install -r requirements.txt然后編輯.env關(guān)鍵變量如下UE_BRIDGE_URLhttp://127.0.0.1:18765 OLLAMA_URLhttp://127.0.0.1:11434 OLLAMA_MODELqwen2.5:7b WEB_PORT8080 MAX_TOOL_ROUNDS8 ENABLE_SHELLtrue如果你用 TaoToken 作為模型入口可以額外加TAOTOKEN_BASE_URLhttps://taotoken.net/api TAOTOKEN_API_KEY你的key注意UE_BRIDGE_URL的端口必須和 UE 插件里的 MCPPort 一致否則 Web GUI 狀態(tài)燈會(huì)紅。3.3 Cursor MCP 接入.cursor/mcp.json在項(xiàng)目根目錄創(chuàng)建.cursor/mcp.json把 AIUEBridge 的 MCP Server 注冊(cè)進(jìn)去{ mcpServers: { aiue-bridge: { command: C:/path/to/mcp_server/.venv/Scripts/python.exe, args: [C:/path/to/AIUEBridge/mcp_server/server.py], env: { UE_BRIDGE_URL: http://127.0.0.1:18765 } } } }保存后重啟 Cursor在 MCP 面板里應(yīng)該能看到aiue-bridge已連接。如果連不上先確認(rèn)server.py能單獨(dú)跑起來(lái)再檢查路徑里的反斜杠和空格。3.4 啟動(dòng)順序與狀態(tài)驗(yàn)證日常使用保持三個(gè)服務(wù)同時(shí)開(kāi)著服務(wù)驗(yàn)證方式預(yù)期結(jié)果UE 編輯器 插件curl http://127.0.0.1:18765/api/health{status:ok,service:AIUEBridge,port:18765}Ollama瀏覽器打開(kāi)http://127.0.0.1:11434頁(yè)面可訪問(wèn)Web GUIpython web_app.py后打開(kāi)http://127.0.0.1:8080左側(cè)狀態(tài)燈綠Web GUI 左側(cè)有兩個(gè)狀態(tài)燈UE 插件綠、Ollama 綠才代表可以正常發(fā)指令。如果 Ollama 紅燈先ollama serve再ollama pull qwen2.5:7b。4. 驗(yàn)證請(qǐng)求從 curl 到 Web GUI 的完整鏈路4.1 健康檢查與創(chuàng)建藍(lán)圖先用 curl 確認(rèn)插件 HTTP 服務(wù)活著curl http://127.0.0.1:18765/api/health返回{status:ok,service:AIUEBridge,port:18765}就說(shuō)明 UE 側(cè)沒(méi)問(wèn)題。接著創(chuàng)建一個(gè) Actor 藍(lán)圖curl -X POST http://127.0.0.1:18765/api/tool/execute \ -H Content-Type: application/json \ -d {\tool\:\create_blueprint\,\params\:{\name\:\BP_Enemy\,\path\:\/Game/Characters\,\parent_class\:\Actor\}}執(zhí)行后去 Content Browser 的/Game/Characters下看應(yīng)該多了BP_Enemy。如果報(bào)錯(cuò)檢查路徑是否存在/Game/Characters目錄需要提前建好。4.2 添加組件與導(dǎo)出 Cursor 上下文給剛創(chuàng)建的藍(lán)圖加一個(gè) StaticMeshComponentcurl -X POST http://127.0.0.1:18765/api/tool/execute \ -H Content-Type: application/json \ -d {\tool\:\add_component\,\params\:{\asset_path\:\/Game/Characters/BP_Enemy\,\component_class\:\StaticMeshComponent\,\component_name\:\Mesh\}}然后導(dǎo)出藍(lán)圖上下文給 Cursor 寫(xiě) Ccurl -X POST http://127.0.0.1:18765/api/tool/execute \ -H Content-Type: application/json \ -d {\tool\:\export_for_cursor\,\params\:{\path\:\/Game\,\write_to_file\:true}}這會(huì)在項(xiàng)目里生成cursor_blueprint_context.md里面包含藍(lán)圖結(jié)構(gòu)、組件、變量、Input 映射等信息。你在 Cursor 里用引用這個(gè) md就能讓 AI 基于現(xiàn)有藍(lán)圖生成對(duì)應(yīng)的 C 類。4.3 Web GUI 自然語(yǔ)言操作不想記 curl 命令的話直接開(kāi) Web GUIpython web_app.py瀏覽器打開(kāi)http://127.0.0.1:8080在輸入框里寫(xiě)在 /Game/Test 下創(chuàng)建一個(gè)名為 BP_Demo 的 Actor 藍(lán)圖AI 回復(fù)下方會(huì)顯示“執(zhí)行了 N 個(gè) UE 工具”點(diǎn)開(kāi)能看到具體的 Tool 調(diào)用日志。左側(cè)還有快捷指令按鈕比如“列出藍(lán)圖”“搜索 Player”一鍵觸發(fā)對(duì)應(yīng) Tool。4.4 一鍵 GameMode 配置新項(xiàng)目腳手架可以用三個(gè) Tool 串起來(lái)# 創(chuàng)建 GameMode 藍(lán)圖 curl -X POST http://127.0.0.1:18765/api/tool/execute \ -H Content-Type: application/json \ -d {\tool\:\create_blueprint\,\params\:{\name\:\BP_GameMode2\,\path\:\/Game/Core\,\parent_class\:\GameModeBase\}} # 配置 GameMode 的 Classes curl -X POST http://127.0.0.1:18765/api/tool/execute \ -H Content-Type: application/json \ -d {\tool\:\configure_game_mode\,\params\:{\asset_path\:\/Game/Core/BP_GameMode2\,\pawn_class\:\BP_PlayerPawn\,\controller_class\:\BP_PlayerController\}} # 設(shè)為項(xiàng)目默認(rèn) GameMode curl -X POST http://127.0.0.1:18765/api/tool/execute \ -H Content-Type: application/json \ -d {\tool\:\set_project_default_game_mode\,\params\:{\game_mode_path\:\/Game/Core/BP_GameMode2\}}這套流程跑通后從需求到可運(yùn)行框架的時(shí)間能壓到幾分鐘。5. 本篇常見(jiàn)錯(cuò)排查Web GUI 打不開(kāi)先確認(rèn)python web_app.py在跑端口 8080 沒(méi)被占用。如果改了WEB_PORT瀏覽器地址也要跟著改。UE 狀態(tài)燈紅檢查 UE 編輯器是否打開(kāi)、插件是否加載、Output Log 里有沒(méi)有HTTP server started on port 18765。如果端口被占改插件端口后同步改.env里的UE_BRIDGE_URL。Ollama 狀態(tài)燈紅ollama serve是否在跑模型是否已 pull。OLLAMA_MODEL要和實(shí)際拉取的模型名一致比如qwen2.5:7b。發(fā)送指令后 AI 不操作 UE大概率是模型不支持 function calling。換qwen2.5:7b或通過(guò) TaoToken 接入支持工具調(diào)用的模型。另外檢查MAX_TOOL_ROUNDS是否太小復(fù)雜任務(wù)可以調(diào)到 12。端口不一致UE 插件里的 MCPPort 和.env里的UE_BRIDGE_URL必須一致。改完.env要重啟web_app.py改完插件端口要重啟 UE 編輯器。Cursor MCP 連不上檢查.cursor/mcp.json里的 Python 路徑是否正確server.py是否能單獨(dú)運(yùn)行。Windows 路徑用正斜杠或雙反斜杠避免轉(zhuǎn)義問(wèn)題。export_for_cursor 沒(méi)生成文件確認(rèn)write_to_file傳了true以及 UE 項(xiàng)目目錄有寫(xiě)權(quán)限。生成的文件默認(rèn)在項(xiàng)目根目錄文件名是cursor_blueprint_context.md。改了 .env 不生效所有.env改動(dòng)都需要重啟對(duì)應(yīng)的 Python 服務(wù)。Web GUI、MCP Server、CLI 各自讀環(huán)境變量重啟哪個(gè)生效哪個(gè)。6. 把 AI 協(xié)同開(kāi)發(fā)鏈路真正用起來(lái)整條鏈路跑通后你手里其實(shí)有了三樣?xùn)|西一個(gè)能被 AI 調(diào)用的 UE 執(zhí)行層28 個(gè) Tool 覆蓋藍(lán)圖、組件、Input、GameMode、UMG、DataTable、GameplayTag一個(gè)統(tǒng)一的 MCP/HTTP 通信層以及一個(gè)可以換模型的 AI 規(guī)劃層。日常開(kāi)發(fā)里最實(shí)用的組合是“Web GUI 做快速原型 Cursor MCP 做 C 協(xié)同”。比如新項(xiàng)目啟動(dòng)先在 Web GUI 里用自然語(yǔ)言把藍(lán)圖框架、Input Action、GameMode 配好然后跑export_for_cursor導(dǎo)出上下文在 Cursor 里cursor_blueprint_context.md讓 AI 生成對(duì)應(yīng)的 C 類你只需要補(bǔ)交互邏輯。這樣 AI 搭的是結(jié)構(gòu)你寫(xiě)的是玩法分工明確。如果你想讓規(guī)劃層更穩(wěn)建議把模型入口統(tǒng)一到 TaoToken 模型對(duì)話這樣 Cursor、Web GUI、CLI 三端可以共用同一套模型配置換模型不用改代碼。長(zhǎng)期做編碼和 Agent 任務(wù)的話可以看看 Coding Plan把工具調(diào)用和長(zhǎng)上下文規(guī)劃的成本壓下來(lái)。接入文檔和 Tool Schema 細(xì)節(jié)在 TaoToken 文檔 里有更完整的說(shuō)明。如果你用 Claude Code 做 Agent 編排可以參考 ClaudeCodeAnthropic 接入方式把 AIUEBridge 的 MCP Server 掛進(jìn)去讓 Agent 直接調(diào)用 UE 工具。最后提醒一句AIUEBridge 的定位是編輯器自動(dòng)化執(zhí)行層它不替代你寫(xiě) C也不替代編輯器本身。它的價(jià)值在于把重復(fù)的、結(jié)構(gòu)化的編輯器操作變成 AI 可調(diào)用的 Tool讓你把時(shí)間花在真正需要判斷力的地方。端口配置和.env一致性是踩坑最多的地方先把這兩個(gè)搞定后面就順了。