资讯动态

TEngine 内置的 com.unity.pipeline:用 HTTP API 远程控制 Unity Editor 与运行时 Player 的 AI 工作流底座

发布时间:2026/10/13 12:31:34 来源:尧图企业网站定制
游戏开发【免费下载链接】TEngineUnity 商用级别开发框架原生内置 AI 工作流支持集成 HybridCLR 高性能热更、Obfuz 代码混淆加固、YooAssets 企业级资源管理方案构建高效、安全、可扩展的工业化开发底座。项目地址https://gitcode.com/gh_mirrors/teng/TEngine点击查看免费下载本文以 TEngine 仓库中UnityProject/Packages/com.unity.pipeline/下的CLAUDE.md文档为主线系统讲解这个 Unity 包如何把正在运行的 Unity Editor或开发版 Player变成可通过本地 HTTP API 远程驱动的可编程自动化节点命令如何注册与发现、服务器如何启动与自愈、CLI/Agent 如何鉴权连接以及改代码 → 重编译 → 跑测试的自动化验证闭环。读完本文你可以理解 TEngine 原生 AI 工作流背后的技术机制并掌握自定义 Pipeline 命令、接入 Player 侧热重载与连接排障的完整方法。一、com.unity.pipeline 是什么CLAUDE.md对该包的定位非常简洁CLAUDE.mdUnity package forremote-controlling a running Unity Editor (or dev Player) over HTTP. A client — CLI, CI, or an agent — connects and executes registered commands: recompile, run tests, eval C#, hot-reload files, play-mode control, status/heartbeat.即一个客户端命令行工具、CI 流水线或 AI Agent通过本地 HTTP 连接到正在运行的 Unity 实例然后执行其中注册好的命令——强制重编译、运行测试、动态求值 C# 代码、热重载文件、控制播放模式、查询状态与心跳。package.json 显示当前包名为com.unity.pipeline版本0.3.1-exp.1最低 Unity 版本要求2022.3并依赖com.unity.nuget.newtonsoft-json、com.unity.nuget.mono-cecil热重载 IL 改写用等模块。这个包在 TEngine 中的意义在于它把 Unity Editor 从只能人点鼠标的 GUI 应用变成一个可被外部程序尤其是 AI Agent直接调用的自动化服务节点这正是 TEngine 强调的原生内置 AI 工作流支持的技术底座之一。包通过 Unity 官方unityCLI 驱动。在项目中安装该包的方式是# 安装到当前目录或正在运行的 Unity 实例的项目 unity pipeline install # 指定目标项目路径 unity pipeline install --project-path /path/to/your/unity/project安装完成后用 Unity Editor 打开项目包会自动启动 HTTP 服务器并注册内置命令其启动机制见下文第三节。二、包目录结构与程序集映射CLAUDE.md给出了标准的 UPM 包布局表各目录、程序集与职责对应关系如下目录程序集职责Runtime/Unity.Pipeline打进 Player 构建。HTTP 服务器基类、命令注册表、数据模型、运行时命令、热重载、Player 服务器。Editor/Unity.Pipeline.Editor仅编辑器可用。活服务器及其静态 owner、设置资源、编辑器命令、测试运行器。CodeGen/Unity.Pipeline.CodeGen基于 Mono.Cecil 的 ILPostProcessor用于原地热重载。按 Unity 惯例放在包根目录与 Burst/Entities 相同不应移动。Tests/Editor/Unity.Pipeline.Tests.EditorEditMode测试套件主测试套件。Tests/Runtime/Unity.Pipeline.Tests.RuntimePlayMode测试套件。Samples/—热重载示例场景。对应仓库中的实际结构可对照 Runtime 与 Editor 目录Runtime/下按Common服务器与命令框架、Commands、CompilationRoslyn、HotReload、Models、PlayerSupport分模块Editor/下的Commands/则按 Assets、Scenes、GameObjects、Prefabs、Scripts、Build、Baking、PackageManager、ProjectSettings 等领域组织了大量内置命令。三、架构入口服务器、启动器与设置资源CLAUDE.md列出了四个架构入口逐一结合源码展开。1. BasePipelineServer —— 共享的 HTTP 监听与路由BasePipelineServer.cs 是 Editor 与 Player 两种服务器共用的基类封装了 HTTP 监听、请求鉴权与端点路由。路由逻辑BasePipelineServer.cs#L400-L423只暴露少量端点端点方法作用/api/statusGET基础健康状态status/lastHeartbeat不触碰 Editor API始终快速返回/api/editor_statusGET内部执行editor_status命令返回富编辑器状态/api/commandsGET列出所有可用命令及其 JSON Schema/api/execPOST按名字执行一条命令/api/test-statusGET异步测试执行状态请求进入路由前的安全门槛BasePipelineServer.cs#L362-L395依次是回环校验拒绝任何非 loopback 来源的连接返回 403。源码注释解释了设计取舍由于 Mono 的HttpListener对主机名前缀的绑定/匹配行为有限制BasePipelineServer.cs#L206-L219监听器使用通配主机前缀绑定因此必须在应用层用IPAddress.IsLoopback把访问限制在本地机器Origin 头拒绝任何携带Origin头的请求直接 403——合法的 CLI/CI 客户端不会发送该头此举可阻止浏览器页面跨源访问本地服务器并短路 CORS 预检Bearer 令牌鉴权每个请求在路由前用常量时间比较校验Authorization: Bearer tokenBasePipelineServer.cs#L441-L455防止通过比较耗时泄漏令牌。此外还有防御性上限请求体最大 1 MiB超限返回 413并且最多丢弃 8 MiB 字节后再回包避免单个恶意请求无限占用内存BasePipelineServer.cs#L24-L37。BasePipelineServer还内建了看门狗watchdog自愈机制BasePipelineServer.cs#L284-L327若 HTTP listener 在未走Stop()的情况下意外死亡服务器实例本身仍存活WatchdogTick会定期默认 5 秒检测IsListening状态并在原地重新打开监听器。域名重载domain reload不在看门狗职责内——那种情况由[InitializeOnLoad]重建服务器实例来处理。基类由两个子类特化EditorPipelineServer.cs —— Editor 侧。负责写入/刷新/删除实例描述文件端口文件、维护心跳并覆写IncludeRuntimeOnlyCommands false使连接到 Editor 的客户端只能看到 Editor 命令面eval、reload_file_override等仅 Player 有意义的命令不出现在列表里但仍可执行RuntimePipelineServer.cs —— Player 侧。覆写GetPortRange()返回(7900, 7949)RuntimePipelineServer.cs#L20-L23描述文件写入 Player 工作目录。2. PipelineServerStartup —— 跨域名重载的静态 ownerEditorPipelineStartup.cs 中的PipelineServerStartup是带[InitializeOnLoad]的静态类作为活编辑器服务器的 owner。选择静态 owner 而非 ScriptableObject 的原因在源码注释中写得很清楚静态 owner 能干净地穿越 domain reload每次重载后由[InitializeOnLoad]重建而 ScriptableObject 的生命周期无法可靠地跟踪服务器。其静态构造函数EditorPipelineStartup.cs#L31-L53做四件事跳过 AssetImportWorker 等子进程IsMainProcess()检查避免非主进程也起服务器注册TypeCacheCommandDiscovery作为命令发现器——用 TypeCache 做基于类型缓存的快速发现保证编辑器性能清理上一次会话遗留的陈旧描述文件CleanupStaleDescriptors读取旧描述文件检查其中pid对应进程是否已退出退出则删除若设置资源的AutoStart为真默认真则启动服务器并订阅playModeStateChanged、quitting、beforeAssemblyReload/afterAssemblyReload。StartServer()EditorPipelineStartup.cs#L142-L179从设置资源读取WatchdogEnabled、WatchdogIntervalSeconds、LogRequestsResponses后调用m_Server.Start(cfg?.Port ?? 0)——端口为 0 表示自动从 7800–7849 区间分配。一个值得注意的细节开启看门狗时会同时调用Commands.AutoTickCommand.SetAutoTick(true)。源码注释解释了因果链看门狗挂在EditorApplication.update上而编辑器失去焦点/被最小化后会停止 tick——恰恰是 listener 意外死亡后最需要看门狗运行的时刻保持 autotick 让 update 循环无论焦点如何都持续转动从而同时保活看门狗与主线程分发器。这正是CLAUDE.md所说服务器在编辑器失焦时仍保持其 tick因此即使焦点在别处编译也能继续推进的实现基础另见 RecompileCommand.cs#L13-L26 中关于Unity 只在是活动应用时编译脚本服务器通过 autotick 让编译在失焦时继续的说明。编辑器菜单下还提供Pipeline/Start Server、Pipeline/Stop Server、Pipeline/Settings...三个入口手动管理服务器EditorPipelineStartup.cs#L71-L117。3. EditorPipelineManager —— 可检查的设置资源EditorPipelineManager.cs 是一个 ScriptableObject 设置资源通过Pipeline/Settings...菜单按需创建在Assets/Settings/Pipeline/下并配自定义 Inspector。它不是服务器的 owner仅提供可检查的配置面owner 在启动时读取EditorPipelineManager.cs#L1-L15。配置字段与默认值字段类型/范围默认值说明Portint0–655350HTTP 端口0 从 7800–7849 区间自动分配。下次启动生效AutoStartbooltrue编辑器加载时自动启动服务器。下次加载生效WatchdogEnabledbooltrue自愈listener 意外死亡后定时重开会保持 auto-tick 开启WatchdogIntervalSecondsint1–605看门狗检测间隔秒LogRequestsResponsesboolfalse把每条命令的请求/响应原始 JSON记入project/Logs/pipeline.log仅编辑器可实时生效CLAUDE.md中提到的Pipeline/Settings...菜单对应的正是这个资源。4. 命令发现与 Authoring 辅助设施命令通过[CliCommand]特性被发现编辑器侧命令组集中在 Editor/Commands 下Assets、Scenes、GameObjects、Prefabs、Scripts、Build、PackageManager、ProjectSettings 等运行时命令位于Runtime/Commands/。发现机制是可插拔的ICommandDiscoveryEditor 用 TypeCache 实现Player 回退到对已加载程序集的反射扫描结果缓存到下次域名重载新命令在下一次重编译后自动可用无需注册调用。CLAUDE.md特别指出 Editor/Authoring 目录存放供改变状态的命令共享的辅助工具AuthoringUndoScopeAuthoringUndoScope.cs——构造时递增 Unity 当前 Undo groupdispose 时调用Undo.CollapseUndoOperations把命令体内所有Undo-注册的变更Undo.RecordObject、Undo.RegisterCreatedObjectUndo等折叠成一个可一步 CtrlZ 回滚的命名步骤ProjectPaths/ObjectResolverProjectPaths.cs、ObjectResolver.cs——authoring 根目录路径解析 对象句柄ObjectRef解析破坏性/覆盖型命令如delete_asset在其参数中内联confirm/dry_run双布尔闸门多字段结构化命令参数实现IStructuredCommandInput接口位于Runtime/Common/会在GET /api/commands中以嵌套 JSON 对象 Schema 暴露给客户端并由 Newtonsoft 自动反序列化。完整的命令编写 API[CliCommand]/[CliArg]、handler response 模式、MainThreadRequired/RuntimeOnly标志与 authoring 命令契约authoring root 沙箱、ObjectRef入参、AuthoringResult出参、Undo 分组分别由包内文档 creating-commands.md、authoring-commands.md 和 safety-and-mutations.md 详细定义CLAUDE.md也指向了后两者。最小自定义命令模板using Unity.Pipeline.Commands; public static class MyCommands { [CliCommand(my_command, What this command does)] public static object MyCommand( [CliArg(text, Some input, Required true)] string text, [CliArg(count, How many times)] int count 1) { // 默认 MainThreadRequired true在主线程执行 return new { echoed text, count }; // 匿名对象 → response.result } }四、连接与鉴权端口文件、Bearer 令牌与回环限制端口描述文件发现机制服务器启动时写一个小 JSON 描述文件供客户端发现——这是唯一的发现渠道没有广播或注册中心服务器描述文件路径EditorprojectPath/Library/Pipeline/.unity-pipeline-portRuntime (Player)workingDirectory/.unity-pipeline-runtime-portEditor 描述文件位于 git 忽略的Library/下文件权限限制为当前用户因为内含令牌每次心跳时重写以刷新lastHeartbeat关停时删除。CLAUDE.md中agent 驱动一节直接点明了这个文件的用法认证令牌就是端口文件liveProject/Library/Pipeline/.unity-pipeline-port里的evalToken字段。描述文件字段Editor 侧示例见 connectivity.md{ pid: 12345, port: 7800, projectPath: /path/to/Project, projectName: Project, unityVersion: 6000.x.y, mode: editor, startedAt: 2026-06-25T10:00:00Z, lastHeartbeat: 2026-06-25T10:05:00Z, evalToken: base64 token }Runtime 侧共享pid/port/unityVersion/startedAt/lastHeartbeat/evalToken另加platform如WindowsPlayer、buildGuid、workingDirectory取代 Editor 的projectPath/projectName/mode。认证令牌令牌由 SecurityTokenManager.cs 管理服务器启动时生成256 位 CSPRNG 输出base64 编码只驻留内存domain reload 后重新生成通过描述文件的evalToken字段对外发布不落单独的 token 文件SecurityTokenManager.cs#L36-L54。端口范围与回环绑定服务器生产端口区间测试端口区间Editor7800–78497850–7899Runtime (Player)7900–79497950–7999区间内无空闲端口时启动直接抛异常No available ports in range …。客户端应显式连接127.0.0.1而非localhostUnity 的 MonoHttpListener对 IPv6 回环::1的 Host 解析不可靠localhost在不同系统上解析到::1还是127.0.0.1是非确定性的显式使用 IPv4 回环可完全绕开该问题。连接到正在运行的 Editor通过unityCLI 连接。不带命令名运行unity command即连接到实例并列出可用命令# 从当前目录自动发现 Unity 实例 unity command # 连接指定项目 unity command --project-path /path/to/your/unity/project # 执行任意命令例如查看编辑器状态 unity command editor_status连接流程即三步读取描述文件 → 取port与evalToken→ 向http://127.0.0.1:port/...发送带Authorization: Bearer evalToken的请求。若无法直接读描述文件也可在 Unity 日志中搜索Pipeline前缀的日志行Editor 服务器重启动时会输出Pipeline Server started on port 7801Runtime 侧会输出启动端口与描述文件路径、以及停止行。连接到正在运行的 PlayerRuntime 服务器要驱动运行中的开发版 Player 而非 Editor用--runtime按进程名或--runtime-path按运行时端口文件位置。这两个选项必须放在command之后、命令名之前# 按 Player 进程/可执行文件名 unity command --runtime MyGame.exe runtime_status # 按运行时端口文件所在目录 unity command --runtime-path C:\Builds\MyGame runtime_status # Windows.exe 旁 unity command --runtime-path /Users/me/Builds/MyGame.app runtime_status # macOS.app bundlemacOS 上Application.dataPath是Game.app/Contents所以描述文件落在.appbundle 根部——这就是--runtime-path在 macOS 上要传.app路径的原因。注意 Runtime 服务器只在开启了 runtime manager 的 development Player 构建中运行详见包内 runtime-setup.md。五、Agent 驱动与改代码 → 验证闭环CLAUDE.md的 Driving verifying (agents) 一节定义了 AI Agent 使用本包的标准工作模式。规范动词是command认证令牌取自端口文件的evalToken字段以Authorization: Bearer token发送。核心是编辑 → 验证循环# 1. 做一个逻辑变更可跨多个文件 # 2. 触发重编译 unity command recompile # 3. 轮询直到完成 unity command recompile_status # 4. 运行过滤后的测试 unity command run_tests --filter TestClass这套异步模式背后的机制值得展开。以 RecompileCommand.cs 为例其类注释RecompileCommand.cs#L12-L27解释了为什么必须触发 轮询两段式Unity 只在编辑器是活动应用时运行脚本编译而服务器通过 autotick 保持编辑器在失焦/最小化时持续 tick因此编译可以不打断用户前台窗口地推进recompile有个默认关闭的focus参数显式置顶时才会抢前台编译成功会触发domain reload销毁托管 AppDomainHTTP 服务器、在途请求、静态变量——因此触发编译的那个 HTTP 请求无法保持打开直到编译完成解法是状态文件Temp/pipeline_recompile_status.json在 domain reload 中幸存。客户端触发后轮询recompile_status直到状态变为completed或up_to_date且必须容忍 reload 期间的连接错误。CLAUDE.md 原文给出的完整 agent 指令即Use theunity-pipelineskill, which drives the live editor via theunityCLI. Canonical verb iscommand; the auth token is theevalTokenfield inside the port fileliveProject/Library/Pipeline/.unity-pipeline-port, sent asAuthorization: Bearer token.Edit→verify loop: make a logical change (may span several files) →command recompile→ pollcommand recompile_status→command run_tests --filter TestClass. The server keeps the editor ticking while unfocused, so compiles proceed even when focus is elsewhere.同样的异步 轮询模式贯穿所有长耗时命令build→build_status、run_tests→test_status另有cancel_tests、bake_lighting/bake_navmesh/bake_occlusion_culling→ 对应的*_bake_status完整命令清单见 Documentation~/index.md。六、内置命令面与安全约定CLAUDE.md只列了命令分组名完整的命令索引见 Documentation~/index.md。按领域分组资产与文件create_asset/move_asset/find_assets/write_text_file等、场景create_scene/open_scene/get_scene_hierarchy等、GameObject 与组件create_gameobject/add_component/set_component_properties等、Prefabcreate_prefab_variant/apply_prefab_overrides等、脚本create_script/attach_script/set_serialized_field等、动画AnimationClip/AnimatorController/Timeline 全套、材质与着色器、烘焙灯光/NavMesh/遮挡剔除、导航与选择、截图捕获、构建编译与测试、项目设置Audio/Graphics/Physics/Player/Quality/TagsLayers/Time 的get_*/set_*、包管理package_list/package_add/package_remove等、编辑器生命周期与可观测性editor_play/editor_stop/menu/get_console_logs/get_performance_stats/set_autotick等以及 Player 侧运行时命令runtime_status/quit/set_timescale/simulate_key/eval/reload_file/hotreload_status等。所有变更型命令共享三条安全约定safety-and-mutations.mdCLAUDE.md明确点名破坏性命令在confirm/dry_run上内联设闸如delete_assetconfirm/dry_run闸门破坏性或覆盖型命令暴露两个布尔参数。dry_runtrue时只校验并返回预览优先级高于confirmconfirmfalse且非 dry run 时直接拒绝、不做任何变更两者都不满足时执行变更。没有中央调度器每条命令各自内联实现该规则Undo 分组场景/对象变更用AuthoringUndoScope折叠为单步回滚但AssetDatabase操作、UPM 包变更、设置类写入不参与Unity 的 Undo 系统——对此类命令约定在描述里写明 Not undoable via CtrlZ.并靠前置校验而非事后撤销路径沙箱一切调用方提供的资产路径必须经ProjectPaths.Resolve解析——归一化、拒绝..穿越、限定在可配置的 authoring root默认Assets内agent 传入的路径无法逃逸出项目。七、热重载与测试布局CLAUDE.md布局表中提到的CodeGen/目录承担原地热重载的编译期织入HotReloadInPlaceILPostProcessor.cs 是一个ILPostProcessor在编译期用 Mono.Cecil 给每个[HotReload]标记的方法织入分发序言——等价于自动生成的HotReloadRegistry.TryInvokeHotReload(Type.Method, this, args)检查命中热重载注册表则路由到重载实现否则走原方法体从而无需 domain reload 即可让运行中的方法路由到热重载版本。该处理器只处理引用了Unity.Pipeline运行时程序集的编译目标HotReloadInPlaceILPostProcessor.cs#L24-L40。对应的运行时命令reload_file、reload_file_override、hotreload_status、cleanup_hotreload与 Roslyn 编译管线位于 Runtime/HotReload 与 Runtime/Compilation示例场景在 Samples~/HotReload。测试布局与CLAUDE.md一致Tests/Editor 是 EditMode 主套件覆盖命令注册、API 端点、安全令牌、循环绑定、服务器生命周期、热重载、各命令域的单元测试与E2E/AgentAuthoringE2ETests.cs端到端用例Tests/Runtime 是 PlayMode 套件含PipelineClient.cs通过 HTTP 调用真实服务器的集成测试。测试服务器通过覆写WritesDescriptor false保证绝不覆盖活服务器的描述文件——因为测试已经知道自己的端口不需要发现文件见 BasePipelineServer.cs#L110-L117 的注释与 connectivity.md 的说明。八、编码约定与在 TEngine 中的定位CLAUDE.md最后给出两条约定私有字段含静态命名m_PascalCase常量用PascalCase——这是贯穿整个包源码的 Unity 风格命名法对照BasePipelineServer、EditorPipelineStartup等文件即可验证未明确要求时不执行git commit/push。在 TEngine 项目中这个包以本地 UPM 包的形式随UnityProject/Packages/目录分发与项目的 HybridCLR 热更、Obfuz 混淆、YooAssets 资源管理一起构成完整的工业化底座HybridCLR/Obfuz 解决运行时代码的热更与加固而 com.unity.pipeline 解决的是开发期的效率与自动化——让 AI Agent 或 CI 脚本能直接驱动编辑器完成改代码 → 重编译 → 跑测试 → 查日志/截图的无人值守闭环并可在开发版 Player 上执行eval、reload_file等运行时命令做即时验证。对 TEngine 开发者而言日常最有价值的三个入口是unity command列出并执行命令、Pipeline/Settings...菜单查看/调整服务器配置以及Library/Pipeline/.unity-pipeline-port程序化接入时的令牌与端口来源。小结定位com.unity.pipeline 通过本地 HTTP API 让 CLI/CI/Agent 远程控制运行中的 Unity Editor 或开发版 Player是 TEngine AI 工作流的自动化底座架构BasePipelineServer回环 Bearer 鉴权 /api/exec等路由 看门狗自愈→EditorPipelineServer/RuntimePipelineServer两个特化PipelineServerStartup静态类[InitializeOnLoad]拥有服务器生命周期EditorPipelineManager提供可检查的配置端口 07800–7849 自动分配、autostart、watchdog、请求日志接入读Library/Pipeline/.unity-pipeline-port的portevalTokenunity command系列命令执行操作长耗时命令一律触发 轮询*_status模式跨 domain reload 靠状态文件幸存扩展[CliCommand]标记的静态方法即命令重编译后自动发现变更型命令遵循confirm/dry_run闸门、AuthoringUndoScopeUndo 折叠与ProjectPaths路径沙箱三条安全约定。赞分享游戏开发【免费下载链接】TEngineUnity 商用级别开发框架原生内置 AI 工作流支持集成 HybridCLR 高性能热更、Obfuz 代码混淆加固、YooAssets 企业级资源管理方案构建高效、安全、可扩展的工业化开发底座。项目地址https://gitcode.com/gh_mirrors/teng/TEngine点击查看免费下载相关推荐TEngine 中 Unity PipelineAgent 控制技能实战从命令行驱动 Unity Editor 与运行时热重载TEngine 中 Unity PipelineAgent 控制技能实战从命令行驱动 Unity Editor 与运行时热重载 导读 本文围绕 com.u游戏开发Quasar内存占用优化提升远程控制工具的运行效率Quasar内存占用优化提升远程控制工具的运行效率 引言远程控制工具的内存挑战 在现代远程管理工具中内存占用是影响用户体验的关键因素之一。Quasar作为网络安全桌面应用AIGCPanel HTTP API 服务详解从认证配置到模型、工具与工作流的远程调用AIGCPanel HTTP API 服务详解从认证配置到模型、工具与工作流的远程调用 AIGCPanel 内置了一套基于 HTTP 协议的接口服务允许第三人工智能AI 应用数字人语音音视频桌面应用工作流自动化直播创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑